Rubyからbit.lyサービスの利用

Twitterへの投稿Botが動作しなくなってるとおもってチェックしてみると、urlを含んだ文字が160バイトを超えていると受け付けないようにいつの間にか変わったようだ。

以前ならurlを含めた文字を投稿するとbitで短く短縮してそれで160バイトを超えないと受け付けているように見えたのだが、どうもその前の時点でチェックして超えているとやめるようになったらしい。

このままだと困るので投稿前にurlを短縮して文字超を計り直してから投稿するように変更する。そのためにはurl短縮サービスを使ってみる。

この記事を書いている時点のTwitterはurl短縮サービスとしてbitを使っているので、それを使うことにする。bitを外から使うにはアカウントが必要なのでbit.lyにアクセスしてアカウントを取得する。

アカウントを取得してログインするとidとapi_keyが得られる(accountと書かれているリンクをクリックして自分のアカウント管理ページに入ると左側に表示されている)。後は、いくつかapiを調べて、とりあえずurl短縮サービスをするクラスを作っておく

require 'rubygems'
require 'net/http'
Net::HTTP.version_1_2
require 'json'

class BitLy
  def initialize(params={})
    @base_query = "version=2.0.1&login=#{params[:id]}&apiKey=#{params[:api_key]}"
  end
  def get_short_url(url)
    query = "/shorten?" + @base_query + "&longUrl=#{url}"
    short_url = ""
    begin
      short_url = call_bit_api(query)[url]["shortUrl"]
    rescue
      short_url = nil
    end
    return short_url
  end
  def get_short_urls(urls)
    query =  "/shorten?" + @base_query + "&" + urls.map {|url| "longUrl=#{url}"}.join('&')
    urls = []
    begin
      urls = call_bit_api(query)
    rescue
      urls = nil
    end
    return urls
  end
  private
  def call_bit_api(query)
    result = JSON.parse(Net::HTTP.get("api.bit.ly", query))
    return result["results"]    
  end
end

とりあえずこんな感じで使えるかな。1個のurlを取りたいときはget_short_url。複数をまとめて取りたいときはget_short_urls(引数はurlの入れた配列)を使うようにしてみた。複数個の時は、戻り値を元のままにしているので、それはそれで使う用途はあるかもしれない。

利用サンプルはこんな感じ

bit = BitLy.new(:id=>"bitのid",:api_key=>"取得したAPI_Key")
puts bit.get_short_url("http://www.yahoo.co.jp")
pp bit.get_short_urls(["http://www.google.co.jp","http://yahoo.co.jp"])