2012年3月2日 星期五

超簡易教學! 如何使用 Twitter Stream API 擷取網友們的發言 :P


大家好~~  最近網誌又荒廢了幾天 :P
一來是228連假期間,小橘回家當了油漆工兩三天。  所以偷懶了幾天 XDD
不過,頹廢久了該認真了

同學們!!!   小橘老師來上課了~~~
最近社群網站當道,網友們在 Facebook、twitter、噗浪上的發言、與討論的內容
一時間變成各大企業們關心與欲探討的議題,
因為這些留言、回應、甚至訊息傳遞的過程,其實都藏著重要的訊息。

因為這些代表著目前鄉民們正在關心甚麼、目前甚麼正夯...等
所以這些巨量資料的蒐集、與探勘,居然變成為行銷人員們關心的議題呢

例如前陣子就有人研究、分析埃及茉莉花革命前 Twitter 訊息傳遞的過程與相關資訊
並利用 Gephi 劃出相關的關係圖呢,還蠻炫的






不過在分析資料、與如何發掘資料之間的關聯前,
小橘先教大家如何收集這些資料!!  :P

我們就舉收集 Twitter 上網友們的為例子囉。

我們可以使用到 Twitter 所提供的 Twitter Streaming API 來蒐集資料
其實API 還分成三大類 (The Streaming API 、 User Streams and Site Streams.),

我們這邊由於要收集所有網友們公開的訊息,
所以小橘主要集中在介紹最基本的  The Streaming API
這個API 可以讓您設定一些過濾條件,進而蒐集Twitter 上所有相關的資訊...
基本上,您只要是 Twitter 註冊的用戶,您就可使用了。
不過開發文件中有提到,基本的使用者,有一些使用量的限制。


最主要的觀念是,我們的程式會去向 Twitter 伺服器指定的位置讀許相關的JSON資料,
你可以使用 HttpClient 去讀取  https://stream.twitter.com/1/statuses/filter.json

但我們這裡會介紹更方便的套件 Twitter4J。 有網友們已經寫好的 Library 你只要引用即可。
站在前人的肩膀上、可以讓您的開發更快速。
你只要前往這裡下載相關的 ZIP 檔,並解壓縮即可。
我們只會用到壓縮包中 lib 目錄中,相關的JAR檔案而以
這裡只會用到  twitter4j-core-2.2.5.jar   和 twitter4j-stream-2.2.5.jar


開始囉,我們這裡會使用 JAVA + Eclipse 來進行開發。
所以你的電腦要安裝 JAVA 、還有下載  Eclipse(這裡使用3.6版)
下載後如果你JAVA已經安裝好了,你只要將eclipse解壓縮在你的硬碟中,
直接執行即可。

01 打開Eclipse 後,你看到一個空專案
你要做的是按下左上角的  File --> New --> Java Project ..




02. 選擇完畢後,會出現下列相關的訊息,我們開始來新增一個JAVA的專案
你最主要要填的是  Project name (隨便打) 我們這裡取名 TwitterRec
打完之後、你就可以按下Finish  即可。



































03. 選擇完畢後你會看道下列的視窗,我們這裡要載入 Twitter4J相關的 jar 檔
      切換到 Libraries 頁籤、然後選下  Add Extrenal JARs 的按鈕

 



































04. 這裡會跳出一個視窗讓你選擇 twitter4j-core-2.2.5.jar   和 twitter4j-stream-2.2.5.jar 的位置
      你只要選擇你剛剛解壓縮的檔案位置即可,
      我們剛剛將檔案放在  D:\javaLib\twitter4j 的目錄中
       選擇完畢你只要按下開啟舊檔即可

 



05  選擇 完畢後,你會看到相關的 Library已經載入eclipse專案中
      之後只要按下  Finish 即可






































06  接下來我們要改變這個專案的編碼方式,由於eclipse 專案預設是使用 MS950 的編碼
      如果遇到日文、中文、會出現錯誤、方塊字。
      所以我們要將專案編碼方式改成 UTF-8
      你只要在軟體上方工具列中,選擇 Project --> properties 即可。



07  接下來我們只將下圖中 MS950 改成UTF-8 然後按下 Apply & OK 即可




07  接下我們要新增專案中的主要程式 JAVA 檔囉。
      你只要在 Eclipse 中的 Package Explorer 中 TwitterRec 下方中的 src 目錄上,
      按下滑鼠的右鍵,之後選擇 new --->  Class  即可
 
   

08  接下你會看到下列視窗,
       你只要輸入 Package 、Name 的資訊即可,
       如果你不懂這是啥,你照著打即可 :P
        Package  我們輸入:  com.garma.twitterrec   (全小寫)
        Name     我們輸入 :  TwitterRec                  (開頭要大寫)
        記得下方有一個   public static void main (String[] args) 這個要記得打勾
        都弄好後,按下Finish 即可。

 



































08  接下你會發現 eclipse 已經幫你在 src 目錄下新增一個 TwitterRec.java 的檔案
      並且連 程式進入點 main  區段都幫你建立好了。


      我們只要在   package com.garma.twitterrec;  下方加入

import twitter4j.Status;
import twitter4j.StatusAdapter;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.FilterQuery;


     並在

      public static void main(String[] args) {
// TODO Auto-generated method stub
               加入你要寫的程式即可...
}


     這裡我們main  區段中加入範例程式..

      TwitterStream twitterStream = new TwitterStreamFactory().getInstance();
       StatusListener listener = new StatusListener() {
           public void onStatus(Status status) {
               System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
           }

           public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
               System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
           }

           public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
               System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
           }

           public void onScrubGeo(long userId, long upToStatusId) {
               System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
           }

           public void onException(Exception ex) {
               ex.printStackTrace();
           }
       };
       twitterStream.addListener(listener);
       twitterStream.sample();






09  之後,你必須設定你的 Twitter 帳號密碼
      我們必須在  Package Explorer 中 TwitterRec 目錄中新增一個  twitter4j.properties  的文字檔
      只要在  TwitterRec  按下滑鼠右鍵,然後  new -->  File  按下即可

     



並在  File name 欄位中填入  :   twitter4j.properties     後按下 Finish 即可。



之後該檔案中加入,

user=你的Twitter帳號   (不是email帳號喔、是另一個)
password=你的密碼

如果你的網路環境需要設定 proxy 才能連現,你還需設定其他的參數才可正常執行
其他的參數你可以參考 這裡




10  完成啦,我們開始執行吧!!!!
      只要按下Eclipse 上的工具列、選擇 run -->  run  即可。
     如果你從來沒 run過,有可能會跳出要執行的方式
      選擇 Java Application 並按下OK即可




































如果跳出下列示窗,選擇第一個 TwitterRec 即可。



如果順利的話,你會看到下方的 Console 視窗一直有文字跑出來!!!
這就代表你已經順利連線到 Twitter 並開始監聽  Sameple 這個 Status Stream 。
這是一個範例的 訊息流,是twitter 隨機選取使用者剛剛發布的訊息並傳算來給你的




11.  進階應用, 剛剛是範例。那如果我真正有興趣的是所有使用者所發布的訊息呢?
       其實也是很簡單做修改的,不過因為全部使用者及時發布的訊息時在太巨量了
        所以 twitter 限制你一定要設一些篩選的條件。  才能擷取資訊。

       我們這裡以你想關心所有 Twitter 使用者所發布的訊息中,其中有包含 free app 的關鍵字的

       你可以稍微修改程式
       將  twitterStream.sample();   改成  下列

       FilterQuery filterQuery = new FilterQuery();
       String[] keyWord = {"free app"};
       filterQuery.track(keyWord);
       twitterStream.filter(filterQuery);

   之後按下存檔,並依照剛剛的執行發是重新執行即可。
   你應該會看到 Console  跑出一堆有包含關鍵字  free app 的留言啦  ^---^

    耶,全世界的 twitter 使用者如果有人推薦  free app 訊息的我都知道啦  :P

     可惜!!!!!!  twitter Streaming API filter 關鍵字對於中文斷詞的支援不是很好,
      例如你輸入   限時免費  必須要很剛好留言是   限時免費  ,前後要有空白幫忙斷開
      ex:  好消息 小橘軟體限時免費中....   由於限時免費前面沒有空白,
            所以這則訊息是不會被你記錄的..... 具官方說法是你必須使用其他的API替代
       

    今天就介紹到這裡吧,
    當然還有其他更好玩的應用囉,不過

  修改程式一定有風險,修改結果有好有壞,動手前應詳閱公開說明書   (被拖走...XDD)


   祝大家都能改出你想功能囉 ^^

   耶,程式讓我 發現好多IPHONE 免費軟體 快去研究看看  :P    同學們下課囉   ^^




5 則留言:

Unknown 提到...

作者您好~我在執行時發生了一些錯誤!!!
不曉得您能不能給我一些意見~
程式碼這段發生錯誤
StatusListener listener = new """StatusListener"""()
"""的地方
不知道這是什麼問題!!
麻煩您了

Unknown 提到...

import twitter4j.StatusListener;

另外要改些東西
http://twitter4j.org/en/configuration.html

Unknown 提到...
作者已經移除這則留言。
Almost 提到...

您好,非常感謝您寫下這篇文章,對敝人受益良多
但是在最後RUN的過程中並不順利

首先先說明我想按照您的圖中使用JavaSE-1.6
但是按下Next時發現是顯示unbound
所以我改選JavaSE-1.8

再來就是twitter4j.properties的部分我改用
debug=true
oauth.consumerKey=
oauth.consumerSecret=
oauth.accessToken=
oauth.accessTokenSecret=
(我有確實寫 但礙於個人隱私 不便公開)

但它顯示
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
at com.garma.twitterrec.TwitterRec.main(TwitterRec.java:17)

Errors (3 items)
Syntax error on token "listener", VariableDeclaratorId expected after this token
Syntax error on token "sample", Identifier expected after this token
Syntax error on token(s), misplaced construct(s)

希望您能夠幫忙解答,再次感謝您!

Unknown 提到...

請問可否截取 發文座標 GPS之類的 以分析發文分佈