OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

C# Bitly APIで短縮URLを取得する

ひとむかし前はURL短縮サービスといえばbit.lyだったと思うんだけど、
今はいろいろあるし、以前ほど利用機会はなくなったかな。
けどAmazonのURLをamzn.toにしてくれたりするのはbit.lyが良いですね。

bitly_website

というか何気にびっくりしたんだけど、bit.lyじゃなくて
Bitlyっていうサイト名なのな。
URLもbitly.comだし。最初からそうだったっけか?

さてさて、C#からBitlyのURL短縮APIを使ってみたのでメモ。
別段はまるようなポイントもないと思いますが。

あとから気づいたんだけど、Nugetで検索してみたら、
Bitly API の.NET用ラッパーのライブラリを作って公開してる人もいるようだ。
でもまあ短縮URL作るくらいならラッパーを使うまでもないかな。
以下では自分でWeb APIを直接利用します。

APIトークン取得

もうほとんど↓ここに書いてあったまんまで簡単だった。
bitly APIの使い方

1. bitlyにログインしてhttps://bitly.com/a/settings/advancedにアクセスします。 2. [OAuth Applications]の[here]をクリックします。 3. [Generic Access Token]でパスワードを入力し[Generate Token]をくリックします。 4. 生成されたAPIキーを控えておきます。(忘れてしまったら作り直し)

ただ1点、BitlyへのログインをTwitterアカウント使ってやった場合、
先にE-mailアドレスの認証(送られてきたメールのURLクリック)が必要なのと、
Bitly用のパスワードっていうのが設定されないので、Settingsページから先に設定しておく。
でないと、上記3のところで入力するパスワードがありません。

API呼び出しと応答の解析

URL短縮APIの呼び出しURLは「https://api-ssl.bitly.com/v3/shorten」。
これにGETのパラメータを2つ付ける。
・access_token: Bitlyサイトで取得したAPIトークン
・longUrl: 短縮するURL

C#で書くとこんな感じですね。

//string originalUrl;  
//string apiToken;  
var apiUrl = string.Format("https://api-ssl.bitly.com/v3/shorten?access_token={0}&longUrl={1}",  
                           apiToken, originalUrl);  

var req = WebRequest.Create(apiUrl) as HttpWebRequest;  

string resText;  

using (var res = req.GetResponse())  
using (var resStream = res.GetResponseStream())  
using (var reader = new StreamReader(resStream))  
{  
    resText = reader.ReadToEnd();  
}  

resTextには以下のようなJSONが返ってくる(↓は整形済み)

{  
  "status_code": 200,  
  "status_txt": "OK",  
  "data": {   
    "long_url": "http:\/\/www.yahoo.co.jp\/",  
    "url": "http:\/\/bit.ly\/1Dh94UZ",  
    "hash": "1Dh94UZ",  
    "global_hash": "INPsu",  
    "new_hash": 1   
  }  
}

JSONかよーって思ってしまうのはC#erあるあるかもしれないですが
敬遠せずにJson.NETでサクッと処理してしまいましょう。

まずはNugetからJson.NETを検索してインストール。
あとは簡単や。

//using Newtonsoft.Json.Linq;  

var root = JObject.Parse(resString);  
var shortUrl = root["data"]["url"].ToString();  

あるいは、実はAPIの応答をXMLでもらうことも可能です。
URLのパラメータに「format=xml」を追加するだけ。
その場合は使いなれたLINQ to XMLが使えますね。