DesignAssembler

備忘録に近い

TwitterAPIをrubyで操作

こんにちは。

現在webAPIの勉強をしています。以前書いた記事ではTwitterAPIの制御にtwitter gemを使用していましたが、今回はoauthとjsonを使ってツイートの検索をします。


準備

必要なoauth gemとjson gemをインストールするので以下を入力してください。

$ sudo gem install oauth
$ sudo gem install json

今回は認証にoauth gemを使い、APIの出力を取得するのにjson gemを使います。

ソースコード

では早速ソースコードです。

require 'oauth'
require 'json'

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    =>  :header
          }

request_token = OAuth::AccessToken.from_hash(consumer,token_hash)

response =  request_token.request(:get, 'https://api.twitter.com/1.1/search/tweets.json?q=%23jwave&count=100')
#100個のツイートを取得する。TwitterAPIの制約により一回につき取得できる数が100までとなっている。

  tweethash = JSON.parse(response.body)

  100.times do |c|
      puts tweethash
  end

これを実行すると何やらこんな感じにズラズラ出てきます。これがJSON形式で返ってきたTwitterAPIからのレスポンスです。

f:id:hyottokoaloha:20150428002945p:plain

このひとつひとつのツイートは入れ子構造のハッシュを持っています。これからその構造について説明します。


まず、この取得したすべての結果はstatusesハッシュに含まれます。

tweethash['statuses']

ですので、上の

puts tweethash

は、

puts tweethash['statuses']

としても出力に変化はありません。


次に、['statuses'][0]等の番号です。これは取得した順に(ここでは0〜99の100個)振られるツイートの番号です。

ですのでこの番号を変数にしてeach文などで回してやると100件全て取ることができます。


ツイート本文を取得したい場合

tweethash['statuses'][0]['text']

このようなハッシュの場合、一番最初に取得したツイートの本文を取得します。

名前を取得したい場合

tweethash['statuses'][0]['user']['name']

また、userハッシュ内には名前の他にユーザーid、場所(プロフィールに書くやつ)、自己紹介文、プロフィール画像、フォロー数フォロワー数等が含まれます。(下記)

tweethash['statuses'][0]['user']['screen_name']
tweethash['statuses'][0]['user']['location']
tweethash['statuses'][0]['user']['description']
tweethash['statuses'][0]['user']['profile_image_url']
tweethash['statuses'][0]['user']['friends_count']
tweethash['statuses'][0]['user']['followers_count']

フォローがfriendsでフォロワーがfollowersなのは、follower following問題の関係なんでしょうかねw

ツイートの位置情報を取得したい場合

tweethash['statuses'][0]['geo']['coordinates']

この中には緯度と経度が配列で入ってます。


その他には、そのツイートがリツイートだった場合のretweeted_statusなどがあります。


ちょっと活用

取得した100件のうちジオタグがあるものだけを抜き出して名前と本文と位置情報を表示する

以下のコードをJSONのパースが終わった後書いてください。

100.times do |c|
  if tweethash['statuses'][c]['geo'] != nil
      puts geotag2['statuses'][c]['name']
      puts geotag2['statuses'][c]['text']
      puts geotag2['statuses'][c]['geo']['coordinates']
  end
end


参考

とても参考になりました。ありがとうございます。

qiita.com