bit.ly (短縮URL) API呼び出し (その1)
Twitter APIを使ったTwitterへの記事投稿では、URLはbit.lyによる短縮URLに自動的に変換されるのですが、入力のステータスメッセージが140字を超えると、bit.lyに通す前に切り詰められてしまい、結果として短縮URLが適用されないようです。
# ちゃんと条件は確認していませんが
そこで、bit.lyもWeb APIを公開しているので、先にURLだけ短縮URL化してからTwitterに投稿することを試みてみます。
まずは、bit.ly APIの感触をつかむために、簡単なサンプルを試してみました。
bit.ly APIまとめ
- bit.ly APIを使うためには、事前にbit.ly上にユーザアカウントを作成する必要がある (無償)。
- Web API呼び出しの際に、以下のいずれかの方法でユーザ認証を行う。
- HTTP Basic認証
- パラメータ (query string): 'login=<ユーザID>&apiKey=
' (APIキーは、アカウント作成時に発行される)
- API
- /shorten: 長いURLを短縮URLに変換する。
- パラメータ
- version=2.0.1: APIバージョン。ここではドキュメント中で指定されているものをそのまま使用。
- longUrl=
: 変換対象の長いURL。 - format=json/xml: 出力フォーマット。デフォルトはJSON
longUrlを複数指定することで、複数のURLを一度に変換できます。
今回は、パラメータによる認証と、出力フォーマットJSONの組み合わせで試してみました。
サンプルコード
bit.ly APIの出力結果を解析するために、Rubyの標準添付ライブラリjsonを使っています。
test1.rb:
#!/usr/bin/ruby require 'rubygems' require 'net/http' Net::HTTP.version_1_2 require 'json' require 'pp' LONG_URLS = ['http://d.hatena.ne.jp/akio0911/20090530/p1', 'http://japanese.engadget.com/2009/05/30/psp-psp-go-e3/', 'http://plusd.itmedia.co.jp/mobile/articles/0905/28/news053.html'] # bit.ly Web APIに渡すquery stringの生成 query = 'version=2.0.1&' + LONG_URLS.map {|url| "longUrl=#{url}"}.join('&') + '&login=<ユーザID>&apiKey=<APIキー>' puts "[query]\n#{query}" # bit.ly APIの呼び出し result = JSON.parse(Net::HTTP.get("api.bit.ly", "/shorten?#{query}")) puts; puts "[reponse]" pp result puts; puts "[result]" result['results'].each_pair {|long_url, value| short_url = value['shortUrl'] puts "#{long_url} => #{short_url}" }
実行結果:
[query] version=2.0.1&longUrl=http://d.hatena.ne.jp/akio0911/20090530/p1&longUrl=http://japanese.engadget.com/2009/05/30/psp-psp-go-e3/&longUrl=http://plusd.itmedia.co.jp/mobile/articles/0905/28/news053.html&login=<ユーザID>&apiKey=<APIキー> [reponse] {"results"=> {"http://d.hatena.ne.jp/akio0911/20090530/p1"=> {"userHash"=>"11zPtd", "hash"=>"rTNbi", "shortKeywordUrl"=>"", "shortUrl"=>"http://bit.ly/11zPtd"}, "http://japanese.engadget.com/2009/05/30/psp-psp-go-e3/"=> {"userHash"=>"vOHaf", "hash"=>"vGIDt", "shortKeywordUrl"=>"", "shortUrl"=>"http://bit.ly/vOHaf"}, "http://plusd.itmedia.co.jp/mobile/articles/0905/28/news053.html"=> {"userHash"=>"7KzoR", "hash"=>"8xMnB", "shortKeywordUrl"=>"", "shortUrl"=>"http://bit.ly/7KzoR"}}, "errorMessage"=>"", "errorCode"=>0, "statusCode"=>"OK"} [result] http://d.hatena.ne.jp/akio0911/20090530/p1 => http://bit.ly/11zPtd http://japanese.engadget.com/2009/05/30/psp-psp-go-e3/ => http://bit.ly/vOHaf http://plusd.itmedia.co.jp/mobile/articles/0905/28/news053.html => http://bit.ly/7KzoR