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"])