2014.11.24
カテゴリ:プログラミング
C# bit.ly でURL短縮
Visual Studio 2010 Express で C# 、.NET Framework 4.0 で
bit.ly の Web API を呼び出してURL短縮するツールを作ってみる。
Amazon のURLがTwitterに貼るときにクソ長いので、
毎回 bit.ly で短縮かけてる (amazon.co.jp ドメインは bit.ly で短縮すると amzn.to になる)けれど
そのために bit.ly のページのタブを開いておくのは面倒なので、
Windowsクライアントアプリケーションでもう少し楽にできないかなーと思ったのが動機。
- bit.ly のアカウントを作る
- Web API にアクセスするにはアカウントを作る必要があるようなので bit.ly の SIGN UP からアカウントを登録しておく。
- Twitter や Facebook のアカウントでログインできるようにできるが、
アカウント登録後に SETTING>PROFILE でメールアドレスの有効チェックとかパスワード設定をしておかないとアプリケーションの登録ができないかも?
- API_KEY でのURL短縮
- Web API の呼び出しは通常 OAuth で認証してアクセストークン取得して、みたいな流れでやるけれど、
まずは手軽な API_KEY を使用してURL短縮を試してみる。
ちなみに API_KEY を使った呼び出し方は DEPRECATED (非推奨) 。今後廃止される可能性もあるので注意。 - SETTING>ADVANCED で「Legacy API KEY」という項目に Login ID と API key が記載されているのでメモしておく。
Firefoxだと選択不可領域になっていてコピペできなくて地味に不便。IEだと選択可能みたいだが。 - Bitly API Documentation - /v3/shorten にURL短縮の呼び出し方が記載されている。
要は、Login ID と API KEY、それから短縮させたいURLを渡せば、JSON形式、XML形式または短縮URLだけの文字列が取得できる。
例えば http://google.com/ の短縮URLだけを取得したければ、以下のようなURLでHTTPアクセスさせればいい。
- Web API の呼び出しは通常 OAuth で認証してアクセストークン取得して、みたいな流れでやるけれど、
https://api-ssl.bitly.com/v3/shorten?login=XXXXX&apiKey=XXXXX&longUrl=http://google.com/&format=txt
- C# でやるならば、System.Net.WebClient でやるのが手っ取り早い。
渡すURLのエスケープ処理も Uri.EscapeUriString() で忘れずにやっておくこと。
// API_KEY による認証パラメータ string STR_AUTH_APIKEY = "login={0}&apiKey={1}"; // URL短縮コマンドURL string STR_URL_SHORTEN = @"https://api-ssl.bitly.com/v3/shorten?{0}&longUrl={1}&format=txt"; WebClient wc = new WebClient(); Stream stream = null; StreamReader sreader = null; string url; string strResult; try { // URL短縮 shorter の呼び出しURL作成 url = string.Format(STR_URL_SHORTEN, string.Format(STR_AUTH_APIKEY, "[STR_LOGIN_ID]", "[STR_API_KEY]"), Uri.EscapeUriString("[LONGURL]")); stream = wc.OpenRead(url); sreader = new StreamReader(stream); strResult = sreader.ReadToEnd(); // 結果の出力 MessageBox.Show(strResult); } catch (Exception ex) { MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (stream != null) { stream.Close(); } if (sreader != null) { sreader.Close(); } }
- OAuth での認証を行ってからのURL短縮
- OAuth の認証を行うためにアプリケーション固有の CLIENT_ID や CLIENT_SECRET が必要になるので、bit.ly でアプリケーションを登録する。
SETTING>ADVANCED で、OAuth Applications のリンクからOAuthアプリケーション管理ページが開けるので
Register an application からアプリケーション登録を行う。
アプリケーション名やリダイレクト先URL情報などを入力する(私は自サイトURLを入れたが、 bit.ly 自身や google とかのURLでもいいのかどうかは未確認)
登録すれば CLIENT_ID や CLIENT_SECRET がOAuthアプリケーション管理ページに表示されるようになるのでメモしておく。 - Bitly API Documentation - Authentication の方法に従って、HTTP POST通信で CLIENT_ID や CLIENT_SECRET、bit.ly アカウントのユーザー名、パスワードを送信してアクセストークンを取得する。
なお、アクセストークンの取得方法は認証コードを使う方法(Webアプリケーション向き?)とユーザー名、パスワードを使う方法と二種類ある。今回は後者。
- OAuth の認証を行うためにアプリケーション固有の CLIENT_ID や CLIENT_SECRET が必要になるので、bit.ly でアプリケーションを登録する。
https://api-ssl.bitly.com/oauth/access_token Header: Authorization: Basic XXXXXXXX ← 「CLIENT_ID:CLIENT_SECRET」をBase64でエンコードした文字列 POST Data: grant_type=password&username=XXXXX&password=XXXXX
- アクセストークンはJSON形式で取得できるので、System.Runtime.Serialization.Json でパースするとかが必要。
参照設定で System.Runtime.Serialization の追加をしておく必要あり。 - アクセストークンが取得できれば、パラメータがLOGIN_IDとAPI_KEYからアクセストークンに変わるだけでAPI_KEYの時と同様のやり方で短縮URLが取得できる。
[DataContract] public class BitlyJsonAToken { [DataMember] public string access_token; } string STR_AUTH_OAUTH = @"access_token={0}"; // OAUTH 認証URL string STR_URL_OAUTH = @"https://api-ssl.bitly.com/oauth/access_token"; // URL短縮コマンドURL string STR_URL_SHORTEN = @"https://api-ssl.bitly.com/v3/shorten?{0}&longUrl={1}&format=txt"; WebClient wc = new WebClient(); Stream stream = null; StreamReader sreader = null; string token; string url; string strResult; try { // OAUTH アクセストークン取得 NameValueCollection postdata = new NameValueCollection(); postdata.Add("grant_type", "password"); postdata.Add("username", "[STR_USERNAME]"); postdata.Add("password", "[STR_PASSWORD]"); wc.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes( string.Format("{0}:{1}", "STR_CLIENT_ID", "[STR_CLIENT_SECRET]") )) ); strResult = Encoding.Default.GetString(wc.UploadValues(STR_URL_OAUTH, postdata)); // JSON形式のデータからアクセストークン抽出 DataContractJsonSerializer jserial = new DataContractJsonSerializer(typeof(BitlyJsonAToken)); MemoryStream mstream = new MemoryStream(Encoding.Default.GetBytes(strResult)); BitlyJsonAToken jdata = (BitlyJsonAToken)jserial.ReadObject(mstream); if (string.IsNullOrEmpty(jdata.access_token)) { throw new Exception("アクセストークンの取得に失敗しました。"); } token = jdata.access_token; // URL短縮 shorter の呼び出しURL作成 /url = string.Format(STR_URL_SHORTEN, string.Format(STR_AUTH_OAUTH, token), Uri.EscapeUriString("[LONGURL]")); stream = wc.OpenRead(url); sreader = new StreamReader(stream); strResult = sreader.ReadToEnd(); // 結果の出力 MessageBox.Show(strResult); } catch (Exception ex) { MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (stream != null) { stream.Close(); } if (sreader != null) { sreader.Close(); } }
- 参考
test test test