FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

RubyでTwitterAPIを叩いてみたら彼女が…

こんにちは、廣幡です。

先月、他社の方と1ヶ月ハッカソンしたのですが、
そこでTwitterAPIを叩いて日本のトレンドワードを取得して日本地図に表示する
みたいなWebアプリケーションを作りました。
Rubyのoauthを使ったらとても簡単に取得できたので、
ここではTwitterへの認証から日本のトレンドワードの取得まで共有したいと思います。

流れは以下のような感じです。
Twitter認証
 ↓
日本のWOEID取得
 ↓
トレンドワード取得

準備

Ruby 1.9 以上
・oauth
TwitterのConsumer Key/Secret、Access Token/Token Secret

oauthは以下のコマンドでインストールする。

$ gem install oauth


TwitterAPIへの認証で
・Consumer Key (API Key)
・Consumer Secret (API Secret)
Access Token
Access Token Secret
が必要なので、この子たちをゲットしてきましょう。
この子たちは、こちらの記事を参考にしてゲット。

この子たちさえいてくれれば、もうTwitterAPIと仲良しこよしです。

注意点

Twitterのトレンドワードを取得してくるには、WOEIDというものを使わないといけません。
例えば東京のトレンドワードを取得してきたい場合には、東京のWOEIDを指定する必要があります。
このWOEIDはTwitter REST APIで取得できるのですが、現在全県には対応していません。

TwitterAPI認証

まず始めにTwitterの認証をクリアしないといけませんので、そのコードを用意します。

require 'oauth' # oauthを使うため
require 'json'  # Twitterのレスポンスがjsonのため

# (`ェ´)ピャーとか言ってますが、ここに準備してきたConsumerKeyなどをいれてください。
consumer_key        = '(`ェ´)ピャー'
consumer_secret     = '(`ェ´)ピャー'
access_token        = '(`ェ´)ピャー'
access_token_secret = '(`ェ´)ピャー'

consumer = OAuth::Consumer.new(
  consumer_key,
  consumer_secret,
  {
    :site   => 'http://api.twitter.com',
    :scheme => :header
  }
)

token_hash = {
  :access_token        => access_token,
  :access_token_secret => access_token_secret
}

# Twitterへのリクエストトークン作成
request_token = OAuth::AccessToken.from_hash(consumer, token_hash)

この request_token を使ってTwitterにリクエストを送ることで、Twitterの認証をクリアできます。
oauth簡単ですね!

日本のWOEID取得

日本のWOEIDを取得するために、Twitter REST APItrends/available を使います。
先ほどのコードに加えて、以下のコードを付け足せば取得できます。

# trends/available
response_available = request_token.request(:get, 'https://api.twitter.com/1.1/trends/available.json')
# レスポンスがJSON形式のためパースする
availables = JSON.parse(response_available.body)

# 日本のWOEIDだけ取得
japan_woeid = nil
availables.each do |available|
  if available["name"] == "Japan" then
    japan_woeid = available["woeid"]
    break
  end
end

こんな感じのJSONが返ってきて、配列availablesに格納されます。

{
  "name": "Winnipeg",
  "placeType": {
    "code": 7,
    "name": "Town"
  },
  "url": "http://where.yahooapis.com/v1/place/2972",
  "parentid": 23424775,
  "country": "Canada",
  "woeid": 2972,
  "countryCode": "CA"
}

これで日本のWOEIDが取得できましたね!
japan_woeid23424856 が入っています!
効率が悪いコードなのはスルーして、最後にトレンドワードを取得してみましょう!

トレンドワード取得

トレンドワードを取得するには、Twitter REST APItrends/place を使います。
先ほど取得したWOEIDを使うので、これも先ほどのコードに付け足していきましょう。

# trends/place
response_place = request_token.request(:get, 'https://api.twitter.com/1.1/trends/place.json?id=' + japan_woeid.to_s)
japan_trends = JSON.parse(response_place.body)

# トレンドワード
japan_trends[0]['trends'].each do |trend|
  puts trend['name']
end

こんな感じのJSONが返ってきます。

{
  "trends": [
    {
      "name": "ジャニワ",
      "query": "%E3%82%B8%E3%83%A3%E3%83%8B%E3%83%AF",
      "url": "http://twitter.com/search?q=%E3%82%B8%E3%83%A3%E3%83%8B%E3%83%AF",
      "promoted_content": nil
    },
    ・・・
  ]
}

やったー!!!\(^o^)/
日本のトレンドワードが10個も取ってこれたー\(^o^)/
これを煮るなり焼くなり好きにするのはあなたです( ̄ー ̄)ニヤリ

ちなみに、ハッシュタグを含めた上位10件のトレンドワードを取得してくるようです。
ハッシュタグを含めたくないという方は、先ほどのコードの2行目を以下のコードに置き換えてください。

response_place = request_token.request(:get, 'https://api.twitter.com/1.1/trends/place.json?exclude=hashtags&id=' + japan_woeid.to_s)


まとめ

Twitter認証からトレンドワード取得までやってみました。
どうですか?簡単でしたね。
Rubyは1ヶ月程しか使ってなかったですが、すっきりしてていいですね。

感想:僕はこの子たちとイチャイチャできただけでも十分です。
   ちなみに彼女はできませんでした。