bit.ly が用意してくれている API を利用するとプログラムから短い URL を取得できるようになる。JavaScript など他の言語は割とあふれているのだが、案外 C# が少なかったので、自分で実装してみた。
手順は 3 ステップである。
bit.ly API のリファレンスは↓から。ただし、英語。短い URL 取得に必要なのは REST API > /v3/shorten の項目だ。
ちなみに、このページの API のバージョンは 3 らしい。
API の利用にはログイン名と API キーが必要だ。自分の既存のものを使用するか、そのソフト用に新しく作成すればいい。ログイン名と API キーを取得する方法に関しては、下記ページの 1 章を参照のこと。
まず、今回は他の URL 短縮サービスも使うことを想定して、基底クラスを作成した。 ソースを下記に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public class UrlShortenerBase
{
public virtual string Shorten(string longUrl) { return string.Empty; }
public virtual string Expand(string shortUrl) { return string.Empty; }
protected virtual string ApiUrl { get { return string.Empty; } }
protected string GetRestUrl(string command)
{
return ApiUrl + command;
}
protected static string WebGet(string url, NameValueCollection parameters)
{
Encoding enc = Encoding.UTF8;
WebClient wc = new WebClient();
wc.QueryString = parameters;
byte[] result = wc.DownloadData(url);
string data = enc.GetString(result);
return data;
}
protected static string UrlEncode(string str)
{
return Uri.EscapeUriString(str);
}
}
前章の UrlShortenerBase クラスを継承して、bit.ly の API を使用する BitlyUrlShortener クラスをつくる。 少し長いので、3 つに分けて説明する。
API で使用するパラメータの値を格納する必要があるのでそのへんのプロパティと定数を宣言しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
public class BitlyUrlShortener : UrlShortenerBase
{
/// <summary>
/// このソフトのログイン名
/// </summary>
public const string Login = "ログイン名";
/// <summary>
/// このソフトの API キー
/// </summary>
public const string ApiKey = "API キー";
/// <summary>
/// ユーザーのログイン名
/// </summary>
public string XLogin { get; set; }
/// <summary>
/// ユーザーの API キー
/// </summary>
public string XApiKey { get; set; }
/// <summary>
/// j.mp ドメインを使うか。true のとき http://j.mp/xxxxxx 、false のとき http://bit.ly/xxxxxx となる。
/// </summary>
public bool UseJmp { get; set; }
/// <summary>
/// bit.ly API のルート URL
/// </summary>
protected override string ApiUrl
{
get { return "http://api.bit.ly/"; }
}
短縮 URL を取得する API は v3/shorten である。これに下記のパラメータを渡す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/// <summary>
/// 短縮 URL を取得
/// </summary>
/// <param name="longUrl"></param>
/// <returns></returns>
public override string Shorten(string longUrl)
{
const string command = "v3/shorten";
var nvc = new NameValueCollection();
nvc.Add("format", "xml");
nvc.Add("login", Login);
nvc.Add("apiKey", ApiKey);
nvc.Add("longUrl", UrlShortenerBase.UrlEncode(longUrl));
if (UseJmp){
nvc.Add("domain", "j.mp");
}
if (!string.IsNullOrEmpty(XLogin) && !string.IsNullOrEmpty(XApiKey))
{
nvc.Add("x_login", XLogin);
nvc.Add("x_apiKey", XApiKey);
}
var response = UrlShortenerBase.WebGet(this.GetRestUrl(command), nvc);
var doc = new XmlDocument();
doc.LoadXml(response);
var statusCode = doc.SelectSingleNode("/response/status_code").InnerText;
if (statusCode.Equals("200"))
{
return doc.SelectSingleNode("/response/data/url").InnerText;
}
else
{
return doc.SelectSingleNode("/response/status_txt").InnerText;
}
}
基本的には下記の流れだ。
そんなに難しいところはないので、これ以上は説明しない。ちなみに応答はこんな感じ。
OK なとき
<?xml version="1.0" encoding="utf-8"?>
<response>
<status_code>200</status_code>
<status_txt>OK</status_txt>
<data>
<url>http://bit.ly/bNKOLU</url>
<hash>bNKOLU</hash>
<global_hash>INPsu</global_hash>
<long_url>http://www.yahoo.co.jp/</long_url>
<new_hash>1</new_hash>
</data>
</response>
ダメなとき
<?xml version="1.0" encoding="utf-8"?>
<response>
<status_code>500</status_code>
<status_txt>MISSING_ARG_APIKEY</status_txt>
<data/>
</response>
これは短縮した URL から元の長い URL に戻すためのもの。API は v3/expand である。これに下記のパラメータを渡す。
これには x_login や domain などはない。j.mp でも bit.ly でも関係なく処理される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/// <summary>
/// 元の長い URL を取得
/// </summary>
/// <param name="shortUrl"></param>
/// <returns></returns>
public override string Expand(string shortUrl)
{
const string command = "v3/expand";
var nvc = new NameValueCollection();
nvc.Add("login", Login);
nvc.Add("apiKey", ApiKey);
nvc.Add("format", "xml");
nvc.Add("shortUrl", UrlShortenerBase.UrlEncode(shortUrl));
var response = UrlShortenerBase.WebGet(this.GetRestUrl(command), nvc);
var doc = new XmlDocument();
doc.LoadXml(response);
var statusCode = doc.SelectSingleNode("/response/status_code").InnerText;
if (statusCode.Equals("200"))
{
return doc.SelectSingleNode("/response/data/entry/long_url").InnerText;
}
else
{
return doc.SelectSingleNode("/response/status_txt").InnerText;
}
}
} // BitlyUrlShortener の終わりカッコ
流れは shorten と同じ。応答はこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<response>
<status_code>200</status_code>
<status_txt>OK</status_txt>
<data>
<entry>
<short_url>http://bit.ly/31IqMl</short_url>
<long_url>http://cnn.com/</long_url>
<user_hash>31IqMl</user_hash>
<global_hash>31IqMl</global_hash>
</entry>
</data>
</response>
使い方は実に簡単だ。
var shortener = new BitlyUrlShortener();
var shortUrl = shortener.Shorten("http://main.tinyjoker.net/");
同様にして他の API も実装しようと思えばできる。必要に応じて実装すればいいだろう。
Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。
好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。
詳しくは Web mixi で。