Twitter API:REST API & Streaming API

Twitter API Twitter 提供的一系列Web API服務,提供程式開發人員可以透過這些API來存取Twitter上的tweets,多數以JSON的格式回傳存取的資料,以比較常用的Search APIStreaming API為主,從2013年的3月開始,Twitter API更新為1.1版本,原本獨立的Search APIStreaming API也併入了REST API中,成為眾多API中的其中兩者。
因為1.0版已經全面停用,所以這裡不再提1.0版的用法。
Search API Streaming API 都是到Twitter的資料庫中去撈推文,但是這兩者所撈的資料型態卻有所不同。
1.        Search API: 這個API所存取的資料是Twitter的歷史推文資料,一次最多可以查到100個條目,預設為15

l   REST中的條目是:GET search/tweets (https://dev.twitter.com/docs/api/1.1/get/search/tweets)
l   API的存取URL:  https://api.twitter.com/1.1/search/tweets.json

2.        Streaming API: 這個API所存取的資料就是Twitter最即時的資料,一次最多可以抓400(一筆資料就是一個Stream),說是即時,其實也是送出查詢前的一小段時間到中止抓取資料當時的最後一筆資料
Streaming API分為publicusersite三種,我要介紹的以public為主,user是針對單一使用者的推文,例如針對我VeckHsiao的推文,至於site則是針對特定網站

n   POST statuses/filter – 可以自行定義查詢關鍵字等過濾器的方法
n   GET statuses/sample – 直接隨機抓取一小部分範例stream
n   GET statuses/firehose – 抓取所有的stream
(其實還有兩個,這裡講的是主要常見的三個)
要使用Twitter API存取資料,你需要先到Twitter的開發者頁面:https://dev.twitter.com/ 登入,接著你需要create一個application,這個Application基本上是指你要用來透過Twitter API存取tweets的網站,假如你沒有網站,其實隨便填一個網址就可以了,最重要的不是網站是否存在。


1. 按下create a new application來建立新的應用程式







2. 填寫必要欄位:NameDescriptionWebsite (URL)



3. 同意Rule和輸入驗證碼,按下按鈕就可以建立你的應用程式囉!
4. 成功建立應用程式後的資訊頁面,其中最重要的是consumer keyconsumer secret



5. 你還需要建立OAuth驗證碼才可以用



這裡要說明一下這個OAuth授權機制,OAuth是一個第三方授權的機制,讓Twitter可以發給要使用它們API的第三方應用程式(例如你的網頁)一個access token,讓應用程式可以不需要輸入使用者帳號與密碼,就可以使用API

※ 詳細的OAuth機制可以參考維基百科
事實上Twitter API的認證機制有兩種,一個是Basic Auth,只需要輸入你的Twitter帳號與密碼即可驗證並取得授權;另一個就是OAuth,從1.1版開始,所有的驗證都採用OAuth


6. 按下按鈕以後,頁面最下面就會產生你的Access token資訊,這裡同樣有兩個最重要的資料:Access tokenAccess token secret
NOTE:
1. consumer secretaccess token secret不可以洩漏!
2. 不論是使用Search API或是Stream API,甚至是其他需要授權的API,都需要取得這四個Key
OK!現在你可以開始使用Twitter API來抓Tweets囉!
這些API都有可以自行設定的參數,TwitterWeb API有兩種方法傳送存取的參數:GETPOST,詳細的參數表請參考各API的介紹網頁。
另外,因為Search APIStreaming API可以自己定義要查詢的term/keyword,所以Twitter還支援Search operator的使用,例如可以用OR來同時找多個關鍵字的Tweetsspace可以將多個單字組合成一個字;AND就是找同時包含多個關鍵字的Tweets…。
有一份針對如何使用Search API 的文件很值得參考:https://dev.twitter.com/docs/using-search
目前為止,Streaming API的關鍵字查詢還不知元中文與日文,例如你不能夠用: 小賈斯汀作為查詢的關鍵字,因為Streaming API的實作是使用空格作為區分字彙的依據,但是中文與日文的書寫習慣中並沒有依據空白來區隔字詞,英文與韓文則有。

[PHP] Twitter Streaming API – 使用 Phirehose.php

要使用 Twitter Streaming API 來撈資料,首先還是要了解 Twitter Streaming API 是什麼,可以<!–看參考這裡(因為我覺的官網說明還是有點模糊),或是直接–>官網
Phirehose.php 是由 fennb (Fenn Bailey) 包裝的一個存取 Twitter Streaming API 工具,
要以使用 Twitter Streaming API,有兩個除了可解讀 PHP 的伺服器外的預備工作:

1.      下載 Phirehose:你可以直接到這個專案的 GitHub 下載 Zip 來用:https://github.com/fennb/phirehose ,下載回來的 Zip 解壓縮以後會有兩個資料夾和一些文字檔案,其中合新的檔案都在lib資料夾中的三個,example 資料夾中的檔案是作者的示範 PHP 程式,我主要以 sample.php 做測試,只會用到 lib 中的 OauthPhirehose.php 和 Phirehose.php
2.      取得認證鑰匙 Consumer KeyConsumer SecretOAuth Access Token 和 OAuth Access Secret:可以直接在開發者頁面的『My Applications』那邊取得,也可以到 Streaming API 的三個 API (PublicUserSite) 頁面中的任何一個 Endpoints 頁面,中間右邊的 bar 會有一個 OAuth Tool,那邊也會有你創建過的 Application 項目,選好 Application 按下 Generate 的按鈕,也可以得到這四個認證鑰匙。






      
     OK!

       首先將解壓縮後的整個 Phirehose 放到伺服器的根目錄(如:C:\AppServ\www),接著開 
       啟 example 中的 sample.php 檔,稍微來分析一下 sample.php 的程式結構:

1)    最開始的兩行就是引用了 Phirehose.php 和 OauthPhirehose.php 這兩個檔案,前者是主要連線存取用的類別檔案,後者是用來做 OAuth 認證的檔案類別
require_once(‘..\lib\Phirehose.php’);
require_once(‘..\lib\OauthPhirehose.php’);
2)    接下來的 SampleConsumer 是一個繼承了 OauthPhirehose 類別的作者自定義類別,如此一來我們就可以直接用 SampleConsumer 的實體來進行驗證
class SampleConsumer extends OauthPhirehose
3)      SampleConsumer 裡面主要就是將 API 回傳的 JSON 檔案解碼後印出
4)      在下來的 define,是要設定驗證的四個鑰匙
define(“TWITTER_CONSUMER_KEY", “[Yours]");
define(“TWITTER_CONSUMER_SECRET", “[Yours]");
define(“OAUTH_TOKEN", “[Yours]");
define(“OAUTH_SECRET", “[Yours]");
5)      最後作者只給了兩行
$sc = new SampleConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_FILTER);
$sc->consume();
第一行是用來進行驗證 (*1),並選擇要使用的 Streaming API (*2),作者是以 public stream 的 statuses/filter 為例,所以傳入的第三個參數是 METHOD_FILTER
第二行就是在所有的設定完成後,執行連線存取API的方法

        瞭解了 sample 結構,還無法正確的使用 filter 這個資源,因為 filter 必須指定followerlocationtrack 三種搜尋依據至少一者,我以 track 為例,也就是以關鍵字去查詢,可以打開 Phirehose 的實作,有一個setTrack的方法,就是用來設定查詢時的 track,實做中可以看到 setTrack 的參數 $trackWord 是一個 array,所以我們回到 sample.php 中,在最後一行 $sc->consume(); 前加上下面兩行:
$track = array(        “track" => “Justin");        //設定要查詢的關鍵字 (*3)
$sc->setTrack($track);                            //呼叫 setTrack() 方法設定 track
      好了!然後我們就可以打開瀏覽器來執行sample.php,或是用命令提示字元(command line, terminal)cd 到 example 這個目錄後,輸入 php sample.php (*4) 來執行這支程式

↓ Command Line 執行畫面 ↓
Microsoft Windows [版本 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
C:\Users\Veck\Desktop>cd C:\AppServ\www\PhirehoseForStreamAPI\example
C:\AppServ\www\PhirehoseForStreamAPI\example>php sample.php
Phirehose: Connecting to twitter stream: https://stream.twitter.com/1.1/statuses
/filter.json with params: array (  ‘delimited’ => ‘length’,  ‘track’ => ‘Justin’
,)
Phirehose: Resolved host stream.twitter.com to 199.59.148.229, 199.59.148.138
Phirehose: Connecting to ssl://199.59.148.138, port=443, connectTimeout=5
Phirehose: Connection established to 199.59.148.138
Phirehose: POST /1.1/statuses/filter.json HTTP/1.0
Phirehose: Host: stream.twitter.com:443
Phirehose: Content-type: application/x-www-form-urlencoded
Phirehose: Content-length: 29
Phirehose: Accept: */*
Phirehose: Authorization: OAuth realm="",oauth_consumer_key="***",oauth_nonce="***",oauth_signature_method="***",oauth_timestamp="***",oauth_version="1.0″,oauth_token="***",oauth_signature="***"
Phirehose: User-Agent: Phirehose/0.2.gitmaster +https://github.com/fennb/phireho
se
Phirehose:
Phirehose: delimited=length&track=Justin
Phirehose:
GeneralovaTori: @justinbieber  Justin, you are everything to me! turn on me atte
ntion please!I can not live without you…..
_SwagLikeJBiebs: RT @teamstr0nger_: Justin, si ya tienes grabado el video PORQ
U? NO LO SUBES Y YA?.
SouZicaBieber: – Gente Rapido , olha isso, a primeira foto ou a segunda https://
t.co/6t9eNb6xeS
routemalik69: RT @InBiebersArmy: #imagine you and Justin cuddling together   htt
p://t.co/D0tcCicvIc
(……)
IAmRayitaJB: RT @OLLGconsejos: A Justin le gusta que las chicas respeten su cuer
po, porqu para l las chicas son mucho ms que un fsico. #BieberHechos
klaudyna_bieber: 4. Justin Bieber – Believe #My50FavouriteSongs
JailienysA: RT @jdbdrxws: #MTVSummerClash Justin Bieber
^C
C:\AppServ\www\PhirehoseForStreamAPI\example>c
   我把上面第一個撈到的 PO 文 (User GeneralovaTori用紅色標起來:

GeneralovaTori: @justinbieber  Justin, you are everything to me! turn on me atte
ntion please!I can not live without you…..

   然後上網去查,可以看到這則推文以及他的發文時間卻實就是不久之前
   PS. 因為我抓下來之後過了一陣子才去查這推文的頁面,所以時間有點久,但也不過就剛才而以:



事實上,官網有說一次可以抓很多筆資料,所已在command line 下會一直跑出抓到的資料,可以自己按ctrl+C 中止程式,但是在網頁的時候就會跑很久,按下取消連線沒辦法只顯示已經抓到的資料,而且很容易讓瀏覽器當掉,我就沒有截圖了

*********************************************************************************************************************

*1 網路上有一些解答是用 $sc = new SampleConsumer([username], [password], Phirehose::METHOD_FILTER);,我測試的結果是會有 HTTP 401 的 Unauthorized 結果,我想可能那些都是比較早的問題,也許是在 Version 1 的使用方式

 *2 Phirehose好像主要是針對 Public StreamUser Stream 要另外使用 UserstreamPhirehose,而 Site Stream,這裡暫時不介紹

*3 經過實驗,track 可以使用  +OR+ 來做多關鍵字的查詢

*4 要使用 php 直些執行,需要將 PHP 安裝的資料夾中的 bin 資料夾覺對路徑加入系統環境變數 PATH 中,且可能需要修改php_mbstring.dll的問題

***可能問題***
1.      如果 php sample.php 的錯誤訊息是如下
Phirehose: TCP failure 1 of 20 connecting to stream: Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP? . Sleeping for 1 seconds.
解決辦法是到 php.ini 中啟用 extension=php_openssl.so (拿掉前方的 “;”)
2.      使用瀏覽器執行,可能會有下列錯誤訊息:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www…\sample.php on line 617
這是因為 php 預設只會執行一支 PHP 程式等帶三十秒,解決辦法可以修改 php.ini 的 max_execution_time=30 為更高的時間,然後重新啟動Apache;也可以在程式中直接使用 ini_set(“max_execution_time”, “xxx”); set_time_limit(xxx) [0為無限]


<!– 對REST API有興趣,可以參考:[PHP] Twitter REST API (Search API為例) 使用 TwitterAPIExchange.php –>