読者です 読者をやめる 読者になる 読者になる

でたぁっ 感動と失敗の備忘録

データ解析を担当することになったサラリーマンの備忘録

TwitterAPI v1.1 に対応

Ruby API

 Ruby+TwitterAPIを使用して日本やインドネシアのトレンド(ホットワード)を取得して関係者に配信していたが、6/12の朝、使用していたAPIのバージョンv1のサービスがついに終了してしまった。前から知っていたことではあるのだが... 使っていたサービスはトレンド取得だけ、OAuth認証も既に組み込んでいたので、エンドポイントであるURLだけ変更すれば簡単に終わるかとおもったら... やっぱり落とし穴?っていうか自分のテク不足だけなんだろう。google先生に聞いてみると、DevelopersサイトSingle-user OAuth with Examplesページがあった。Rubyは一番下に書いています。今までいろいろなライブラリ駆使してコードを書いている感があったけど、oauthライブラリだけでいけそうだ。あとはJSONをパースする為のjsonライブラリくらいか... ということでさっそく試す。
URLに引数でID(WOEID)を指定することにより対象地域のホットワードを得ることができる。あとはGETしたJSONのtrendsをぐるぐる回しながら単語を出力。環境はWin7 32bit、Ruby1.8.7

require 'rubygems'
require "oauth"
require 'json'

WOEID = ARGV[0] # 引数でホットワード取得場所のIDを得る
#WOEID = '23424856' #日本
#WOEID = '1117034' #千葉

# Exchange your oauth_token and oauth_token_secret for an AccessToken instance.
def prepare_access_token(oauth_token, oauth_token_secret)
  consumer = OAuth::Consumer.new("ここはConsumer Key", "ここはConsumer secret",
    { :site => "https://api.twitter.com",
      :scheme => :header
    })
  # now create the access token object from passed values
  token_hash = { :oauth_token => oauth_token,
                 :oauth_token_secret => oauth_token_secret
               }
  access_token = OAuth::AccessToken.from_hash(consumer, token_hash )
  return access_token
end
 
# Exchange our oauth_token and oauth_token secret for the AccessToken instance.
access_token = prepare_access_token("ここはAccess token", "ここはAccess token secret")
response = access_token.request(:get, "https://api.twitter.com/1.1/trends/place.json?id=" + WOEID + "&exclude=hashtags") # id=WOEID ハッシュタグを除く
t = Time.now # 時間取得
uploadDate = t.strftime("%Y/%m/%d %H:%M:%S.#{t.usec.to_s[0, 3]}") # 時間フォーマット

if response.code == "200" then
  hash = JSON.parse(response.body) # JSON を parse
  seq = 0
  hash[0]["trends"].each do |trends| # treds のループ
    seq += 1
    name = trends["name"].to_s.kconv(Kconv::SJIS, Kconv::UTF8) # ホットワード
    url  = trends["url"].to_s.kconv(Kconv::SJIS, Kconv::UTF8) # URL
    rowdata = [uploadDate, WOEID, seq, name, url].join("\t") # タブ区切り結合
    print(rowdata,"\r\n") # 出力
end

無事成功! 結果の中に”父の日”があった。そうか明日は父の日だった。どうりで子供たちがこそこそしているわけだ。

Windows環境でjsonライブラリをインストールする場合

 Windows環境にjsonライブラリを普通にインストールするとエラーになる。

>gem install json
ERROR:  http://rubygems.org/ does not appear to be a repository
ERROR:  Could not find a valid gem 'json' (>= 0) in any repository

こちらのサイトにあるjson-1.1.9-x86-mswin32.gemをダウンロードしてlocalファイルをインストールする必要がある。1年もたつともう忘れている。

>gem install json --local
Successfully installed json-1.1.9-x86-mswin32
1 gem installed
Installing ri documentation for json-1.1.9-x86-mswin32...
Installing RDoc documentation for json-1.1.9-x86-mswin32...

これでOK!

対応している地域が増えていた

 こんな便利なサイトを使うと開発が楽になる。twitSandbox1.1 認証できていれば確認したいAPIの結果をこのサイトで見ることができる。trends/availableでは現在ホットワードが提供されている地域を確認することが出来る。見ると千葉があった。前はなかったはず... バージョンアップで増えたのかな... また、trends/closestでは、緯度と経度を指定すると最寄のWOEIDを知ることもできる。住んでいる船橋市の緯度経度で試すと結果は千葉の1117034だった。あとは会社のproxy越えのコードを追加するだけか。とりあえず週末のお仕事1つ終了。