2012-04-26 92 views
6

我正計劃在特定主題上記錄實時推文。同樣,我在PHP中使用帶cURL的twitter流API。使用cURL輸出

下面是代碼:

<?php 

$username = "xxxxx"; 
$password = "xxxxx"; 


$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?   track=SEARCH_PARAMETER'); 
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($ch); 
$jsonOBJ = json_decode ($result); 

curl_close($ch); 

print_r($jsonOBJ); 
?> 

我的問題是,如果我CURLOPT_RETURNTRANSFER設置爲0,我可以看到在終端上的tweet。但是我不能存儲變量$ jsonOBJ並打印它。

請幫忙!

+0

不會是更容易使用和SDK使用OAuth PHP? – chepe263 2012-04-26 17:01:16

+0

打印出$結果,在嘗試對其進行解碼之前查看它的外觀。 – MrCode 2012-04-26 17:02:43

+0

現在,我直接做這個「echo $ result;」。 但是在執行這個腳本時什麼也沒有顯示出來。 – Gooner 2012-04-26 17:15:08

回答

1

我工作在這樣的事情,以及:)問題是,當你在終端做,這是一個流,所以直到你殺它的連接保持活躍。 (即curl_exec()未完成)

試着看一下CURLOPT_PROGRESSFUNCTION和CURLOPT_READFUNCTION。他們可能會給你一些提示。

+0

我已經加入 「curl_setopt($ CH,CURLOPT_TIMEOUT,30);」殺死curl_exec()。但是仍然沒有數據存儲在變量中。 – Gooner 2012-04-26 17:44:56

+0

在那30秒內有推文嗎? – 2012-04-26 17:54:31

+0

是的。我可以通過將它打印到終端上來看到它們。 – Gooner 2012-04-26 18:12:32

0

我只是衝你一個答案,離開的那一天。這看起來應該起作用。

下面是我使用的功能,我將它傳遞一個URL和一些XML數據並返回一個關聯數組說真的還是假的成功和retuen值作爲一個字符串。

function do_curl($url, $data) 
    { 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $result = curl_exec ($ch); 

    $curl_return=array(); 

    if (!is_string($result)) 
     { 
     $curl_return['STATUS'] = FALSE; 
     $curl_return['ERRMSG'] = curl_error($ch); 
     } 
    else 
     { 
     $curl_return['STATUS'] = TRUE; 
     $curl_return['RESPONSE'] = $result; 
     } 
    curl_close($ch); 
    return $curl_return; 
    } 
4

UPDATE:見新代碼在郵件的末尾,這實際上是很容易做到,但捲曲我去它正確的第一次。

我無法使用cURL與CURLOPT_READFUNCTION結合使用Twitter流API,但使用fsockopen()fread()已成功。我不確定爲什麼readfunction不能正常工作,因爲我以前用它成功了,但它必須與響應數據是「流式傳輸」並不是使用HTTP分塊編碼發送的事實有關。從本質上講,我的閱讀功能從未被調用,所以我無法處理數據。

我使用的方法是現在工作:使用數據流使用fputs

  • 消耗HTTP響應頭,並確保有的fsockopen到ssl://stream.twitter.com
  • 問題的基本的HTTP請求

    • 連接沒有錯誤
    • 在無限循環中使用fread讀取金額數據
    • 每次讀取一塊數據時,我稱內部緩衝器功能
    • 緩衝功能追加新數據到緩衝器
    • 緩衝功能然後嘗試處理緩衝區中的所有消息(如果我們有1個或多個完整的消息)
    • 由於它處理的每個消息緩衝區被減少,直至爲空,則函數返回和數據再次讀

    我已經受夠了運行了幾個小時了,還沒有被丟棄的連接,我已經處理了超過30,000條消息,並且沒有錯誤。

    基本上我實現了一個回調系統,以便每次從緩衝區中讀取完整消息時,它會使用json消息調用用戶定義的回調函數,以便應用程序可以執行任何需要處理的消息(例如insert到數據庫)。

    我沒有任何的簡短摘要現在還沒有發佈,但如果你想,通過將我的個人資料中列出的網站,並在接觸填寫表格,我很樂意分享我發短信。如果有人感興趣,也許我們可以一起工作。我只是爲了好玩而做了這些,我對Twitter沒有興趣,並且沒有因爲經濟原因而使用它。也許最終我會把它放在GitHub上。

    編輯:

    下面是一些捲曲的代碼,將連接到流API並通過JSON消息的回調函數,因爲他們都可用。本示例使用gzip編碼來節省帶寬。

    <?php 
    
    $USERNAME = 'youruser'; 
    $PASSWORD = 'yourpass'; 
    $QUERY = 'nike'; 
    
    /** 
    * Called every time a chunk of data is read, this will be a json encoded message 
    * 
    * @param resource $handle The curl handle 
    * @param string $data The data chunk (json message) 
    */ 
    function writeCallback($handle, $data) 
    { 
        /* 
        echo "-----------------------------------------------------------\n"; 
        echo $data; 
        echo "-----------------------------------------------------------\n"; 
        */ 
    
        $json = json_decode($data); 
        if (isset($json->user) && isset($json->text)) { 
         echo "@{$json->user->screen_name}: {$json->text}\n\n"; 
        } 
    
        return strlen($data); 
    } 
    
    $ch = curl_init(); 
    
    curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?track=' . urlencode($QUERY)); 
    curl_setopt($ch, CURLOPT_USERPWD, "$USERNAME:$PASSWORD"); 
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'writeCallback'); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 20); // disconnect after 20 seconds for testing 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); // debugging 
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); // req'd to get gzip 
    curl_setopt($ch, CURLOPT_USERAGENT, 'tstreamer/1.0'); // req'd to get gzip 
    
    curl_exec($ch); // commence streaming 
    
    $info = curl_getinfo($ch); 
    
    var_dump($info); 
    
  • +0

    非常感謝您的建議。 現在,我通過使用搜索Twitter API找到了解決辦法。 當我再次使用流媒體API時,我一定會與您聯繫。 – Gooner 2012-04-27 16:14:51

    +0

    @Rubie_Newbie我使用cURL添加了一個流API的工作示例。我在C#中也有一個工作版本。這個php類[phirehose](https://github.com/fennb/phirehose/)也可能對你感興趣,雖然它不支持gzip。 – drew010 2012-04-29 17:51:33

    1

    @Reza Sanaie和其他人可能會覺得這有幫助。

    我用搜索Twitter API和獲取實時的鳴叫也是如此。所以這可能會有所幫助。 下面是代碼:

    <?php 
    $query = "SEARCH_PARAMETER"; 
    $request = "http://search.twitter.com/search.json?q=".urlencode($query); 
    $response = file_get_contents($request); 
    $jsonobj = json_decode($response); 
    print_r($jsonobj); 
    ?> 
    

    我也有MySQL連接設置將其推到數據庫中,這個腳本在crontab中加入自動完成整個過程。