UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Python, Ruby, PHPコード付き - Twitter Streaming APIの使い方

f:id:mochizuki_p:20161005192705p:plain

Streanming APIとは?

現在投稿されているツィートを連続して取得することができます。何かのイベントの発生などを調べたい時に利用すべきです。

通常のAPIとの違いは?

Streaming APIは通常のREST APIとは異なり継続してHTTPリクエストを行います。一度アプリケーションをTwitterに接続すればネットワークに問題が発生しない限りツィートを取得し続けることができます。

注意点

Streaming APIでは1つのアカウントで1つの機能しか利用できません。複数のアクセストークンを取得してもそのうちの1つのみが利用できるという意味です。

GET statuses / sample

Twitterに投稿されるすべてのツィート(つまり世界中の)をランダムで取得します。

オプション

パラメーター 必須 説明
delimited × 残りのツィートのサイズをバイト単位で表示する
stall_warnings × 接続が切断される危険性がある場合に通知

これはPythonでStreaming APIを利用する場合のサンプルコードです。

例:

twitter_streaming.py

# -*- coding:utf-8 -*-

from twitter import *


# あらかじめ取得したアクセストークンをここに入力
stream = TwitterStream(auth=OAuth("access_key", "access_secret", "consumer_key", "consumer_secret"),secure = True)

tweets =  stream.statuses.sample()

for tweet in tweets:

      print(tweet)

試しに動かしてみると

python3 twitter_streaming.py

このようになります。

f:id:mochizuki_p:20161006005644g:plain

次々とツィートが流れてくるのがわかります。

こちらはRubyの例

twitter_streaming.rb

このライブラリを使用

github.com

ライブラリをインストール

gem install tweetstream

コードはこちら

require 'tweetstream'

TweetStream.configure do |config|
  config.consumer_key       = 'Consumer Key を入力'
  config.consumer_secret    = 'Consumer Secret を入力'
  config.oauth_token        = 'Access Token を入力'
  config.oauth_token_secret = 'Access Token Secret を入力'
  config.auth_method        = :oauth
end

TweetStream::Client.new.sample do |status|
  # TweetのId
  puts "#{status.id}"
  # Tweet主のユーザー名
  puts "#{status.user.screen_name}"
  # Tweet内容
  puts "#{status.text}"
end

PHPの場合

こちらのライブラリを使用

github.com

導入

composer.jsonで以下を追記

{
  "require": {
    ...
    "fennb/phirehose": "1.0.*"
  }
}
<?php 
//パッケージを読み込む
require_once 'vendor/autoload.php';

class SampleConsumer extends OauthPhirehose
{
  public function enqueueStatus($status)
  {
    $data = json_decode($status, true);
    if (is_array($data) && isset($data['user']['screen_name'])) {
      print $data['user']['screen_name'] . ': ' . urldecode($data['text']) . "\n";
    }
  }
}

define("TWITTER_CONSUMER_KEY", "Consumer Key を入力");
define("TWITTER_CONSUMER_SECRET", "Consumer Secret を入力");
define("OAUTH_TOKEN", "Access Token を入力");
define("OAUTH_SECRET", "Access Token Secret を入力");

// ストリーミングを開始
$sc = new SampleConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_SAMPLE);
$sc->consume();

POST statuses / filter

リアルタイムの投稿を条件を指定して取得できる。これは少なくとも1つのフィルターを指定する必要があります。つまりこの機能ですべての投稿を取得することはできません。

オプション

パラメーター 必須 説明
follow コンマ区切りで複数のアカウントのIDを指定してタイムラインを取得することができます
track キーワードを指定してそのキーワードが含まれるツィートを取得します。
locations 緯度・経度形式でツィートの地域を限定することができます
delimited × 残りのツィートのサイズをバイト単位で表示する
stall_warnings × 接続が切断される危険性がある場合に通知

follow

このオプションで指定したアカウントIDの以下の情報が取得できます。

  • ツィート
  • リツィート
  • 他のユーザーからのリプライ
  • 他のユーザーからのリツィート

locations

コンマ区切りで緯度、経度のペアを4つ指定することで特定の地域のツィートを取得できます。

たとえばニューヨークであれば"-74,40,-73,41"です。

track

キーワードをコンマ区切りで指定するとOR 半角スペース区切りでANDの条件になります。たとえば"石原さとみ"と"かわいい"という2つのキーワードがあるツィートを指定する場合は"石原さとみ かわいい"というクエリを、また"石原さとみ"または"本田翼"が本文中にあるツィートを取得したいばあいは"石原さとみ,本田翼"というクエリを指定します

これを図に表すと

条件 取得できるツィートの例
“石原さとみ かわいい” 「石原さとみがドラマに出ているんだけどちょ〜かわいい」
“石原さとみ,本田翼” 「石原さとみ派ですか!今後の本田翼の伸びしろに期待します☺️久しぶりにドラマみました〜」 「 違うんだ、本田翼の使い方が ほんとにいいんだべな〜」
“石原さとみ 本田翼” 「本田翼と石原さとみのタッグは最可愛すぎる」

実際にやってみるとこのようになります。

twitter_streaming_filter.py

# -*- coding:utf-8 -*-

from twitter import *


auth=OAuth("access_key", "access_secret", "consumer_key", "consumer_secret")

t = TwitterStream(auth = auth, secure = True)
tweets = t.statuses.filter(track = "石原さとみ")

for tweet in tweets:
    print(tweet["text"])

実行すると

python3 twitter_streaming_filter.py

このようになります。

本田翼と石原さとみ、かわいいな。
ぎゃー今日からのドラマ録画し忘れた…!石原さとみちゃん…
石原さとみ可愛すぎるううう????

Rubyの場合

require 'tweetstream'

TweetStream.configure do |config|
  config.consumer_key       = 'Consumer Key を入力'
  config.consumer_secret    = 'Consumer Secret を入力'
  config.oauth_token        = 'Access Token を入力'
  config.oauth_token_secret = 'Access Token Secret を入力'
  config.auth_method        = :oauth
end

TweetStream::Client.new.track('阿部寛') do |status|
  puts "#{status.id}"
  puts "#{status.user.screen_name}"
  puts "#{status.text}"
end

PHPの場合


<?php 
//パッケージを読み込む
require_once 'vendor/autoload.php';

class SampleConsumer extends OauthPhirehose
{
  public function enqueueStatus($status)
  {
    $data = json_decode($status, true);
    if (is_array($data) && isset($data['user']['screen_name'])) {
      print $data['user']['screen_name'] . ': ' . urldecode($data['text']) . "\n";
    }
  }
}

define("TWITTER_CONSUMER_KEY", "Consumer Key を入力");
define("TWITTER_CONSUMER_SECRET", "Consumer Secret を入力");
define("OAUTH_TOKEN", "Access Token を入力");
define("OAUTH_SECRET", "Access Token Secret を入力");

// ストリーミングを開始
$sc = new FilterTrackConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_FILTER);
$sc->setTrack(array('橋本環奈'));
$sc->consume();

こんな風に自分の気になるキーワードがどんな風に言及されているのか定点観測をしてみると面白いかもしれませんね

GET statuses / firehose

Twitterのすべての投稿を取得できるAPIです。残念ながら個人では利用できません。