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