トップ > Tech > CSharp > bit.ly API で URL を短縮する

bit.ly API で URL を短縮する

bit.ly API で URL を短縮するには

bit.ly が用意してくれている API を利用するとプログラムから短い URL を取得できるようになる。JavaScript など他の言語は割とあふれているのだが、案外 C# が少なかったので、自分で実装してみた。

手順は 3 ステップである。

  1. Login と ApiKey(ソフト用のログイン名と API キー)を取得する
  2. 基底クラス UrlShortenerBase をつくる
  3. bit.ly URL 短縮クラス BitlyUrlShortener を実装する

bit.ly API のリファレンスは↓から。ただし、英語。短い URL 取得に必要なのは REST API > /v3/shorten の項目だ。

ちなみに、このページの API のバージョンは 3 らしい。

ログイン名と API キー の取得

API の利用にはログイン名と API キーが必要だ。自分の既存のものを使用するか、そのソフト用に新しく作成すればいい。ログイン名と API キーを取得する方法に関しては、下記ページの 1 章を参照のこと。

基底クラス UrlShortenerBase

まず、今回は他の 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);
    }
}

Shorten
長い URL を渡して、短い URL を返すメソッド。継承クラスでオーバーライドする。
Expand
短い URL を渡して、長い URL を返すメソッド。継承クラスでオーバーライドする。
ApiUrl
URL 短縮サービスの API のルート URL。bit.ly の場合は "http://api.bit.ly/"。継承クラスでオーバーライドする。
GetRestUrl
API のコマンド名を渡して REST 用の URL を返すメソッド
WebGet
URL と パラメータを渡して、HTTP GET した結果を文字列で返す静的メソッド
UrlEncode
URL エンコードするメソッド。パラメータに渡す文字列(長い URL など)は URL エンコードしておく必要がある。Uri.EscapeUriString は UTF-8 専用らしいが、だいたい最近は UTF-8 だと思うのでたぶん大丈夫。

bit.ly URL 短縮クラス BitlyUrlShortener

前章の 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/"; }
    }

Login, ApiKey
ソフト用のログイン名と API キー。
XLogin, XApiKey
ユーザーのログイン名と API キー。これをユーザーが設定すると bit.ly の解析機能などが利用可能になる。設定しなくてもよい。
UseJmp
bit.ly には URL をさらに短くする j.mp というドメインもある。こちらを利用するときは shorten API のパラメータに domain=j.mp を渡せばいいので、これを ON/OFF するフラグ。
ApiUrl
API のルート URL。bit.ly の場合は "http://api.bit.ly/"。

Shorten メソッド

短縮 URL を取得する API は v3/shorten である。これに下記のパラメータを渡す。

format
レスポンスの形式。json か xml か txt を選べる。txt だと短縮 URL だけで、ステータスが取得できないので、ここでは .NET で扱いやすい xml にした。
login, apiKey
ソフト用のログイン名と API キー。前項参照。
longUrl
短縮する元の長い URL
domain
ドメイン指定。前項参照。指定しないか、j.mp。
x_login, x_apiKey
ユーザーのログイン名と 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
 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;
        }
    }

基本的には下記の流れだ。

  1. パラメータと値の組み合わせを NameValueCollection に追加していく。
  2. UrlShortenerBase.WebGet で応答を取得して、XmlDocument にパース。
  3. ステータスが 200(OK) なら短い URL を返し、それ以外ならステータス文字列を返す。

そんなに難しいところはないので、これ以上は説明しない。ちなみに応答はこんな感じ。

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>

Expand メソッド

これは短縮した URL から元の長い URL に戻すためのもの。API は v3/expand である。これに下記のパラメータを渡す。

format
レスポンスの形式。json か xml か txt を選べる。txt だと短縮 URL だけで、ステータスが取得できないので、ここでは .NET で扱いやすい xml にした。
longUrl
短縮する元の長い URL

これには 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 も実装しようと思えばできる。必要に応じて実装すればいいだろう。

履歴

  • 2010.10.02 執筆
(2010/10/02 11:41:08)
6368
プロフィール

Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。 好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。 詳しくは Web mixi で。

Bookmark and Share