2011-06-15 30 views
1

拉我試圖通過PHP從Twitter拉一些數據。我使用的是tmhOAuth插件,可以在這裏找到。 https://github.com/themattharris/tmhOAuth/捲曲的錯誤,同時從Twitter

我寫了一個基於關示例文件「streaming.php」,這也可以在上述GitHub的頁面上找到我的代碼。這裏是我的代碼:

require 'tmhOAuth.php'; 

    $tmhOAuth = new tmhOAuth(array(
      'consumer_key' => 'xxxhiddenxxx', 
      'consumer_secret' => 'xxxhiddenxxx', 
      'user_token' => 'xxxhiddenxxx', 
      'user_secret' => 'xxxhiddenxxx' 
    )); 

    $method = 'http://stream.twitter.com/1/statuses/filter.json'; 

    $params = array(
      'follow' => '1307392917', 
      'count' => '5' 
    ); 
    $tmhOAuth->streaming_request('POST', $method, $params, 'my_streaming_callback'); 
    $tmhOAuth->pr($tmhOAuth); 

那不是打印出任何我想拉的Twitter數據,並只顯示了PR()命令寫入調試信息。

在試圖調試爲什麼我沒有收到任何數據時,我進入並添加了一行到tmhOAuth.php,以便我可以看到cURL給出了什麼錯誤。我用

echo curl_error($C); 

是捲曲outputed錯誤這樣做是:

轉移以優異的讀取數據剩餘

我已經做了該錯誤一些研究關門,但我找不到任何有用的東西。有報道說,我找到有關內容長度有兩件事情,但是當我挖成的代碼,我看到tmhOAuth的作者已經解決了這些問題(和評論了他的修復並沒有幫助)。

任何幫助?

更新1下面是使用curl_getinfo響應信息採集:

//Removed - an updated version is below 

更新2由於下面我意識到Twitter的是給我用傳輸編碼數據的評論:分塊。我把這一行放入tmhOAuth.php中以強制執行分塊數據:

curl_setopt($c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 

這有點奏效。我不再得到任何捲曲的錯誤,但我WRITEFUNCTION回調仍然沒有得到所謂的 - 所以我從來沒有得到任何實際的數據。這裏是我的捲曲對象的輸出再次:

[response] => Array 
     (
      [content-length] => 0 
      [headers] => Array 
       (
        [content_type] => text/html; charset=iso-8859-1 
        [server] => Jetty(6.1.25) 
       ) 

      [code] => 416 
      [response] => 1 
      [info] => Array 
       (
        [url] => http://stream.twitter.com/1/statuses/filter.json 
        [content_type] => text/html; charset=iso-8859-1 
        [http_code] => 416 
        [header_size] => 116 
        [request_size] => 532 
        [filetime] => -1 
        [ssl_verify_result] => 0 
        [redirect_count] => 0 
        [total_time] => 0.118553 
        [namelookup_time] => 0.043927 
        [connect_time] => 0.070477 
        [pretransfer_time] => 0.07049 
        [size_upload] => 25 
        [size_download] => 0 
        [speed_download] => 0 
        [speed_upload] => 210 
        [download_content_length] => -1 
        [upload_content_length] => -1 
        [starttransfer_time] => 0.118384 
        [redirect_time] => 0 
        [request_header] => POST /1/statuses/filter.json HTTP/1.0 
User-Agent: themattharris' HTTP Client 
Host: stream.twitter.com 
Accept: */* 
Authorization: OAuth oauth_consumer_key="xxxhiddenxxx", oauth_nonce="xxxhidden", oauth_signature="xxxhidden", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1308226585", oauth_token="xxxhiddenxxx", oauth_version="1.0" 
Content-Length: 25 
Content-Type: application/x-www-form-urlencoded 


       ) 

     ) 

) 

更新3:夫婦的事情,到目前爲止我已經想通了......我從POST請求刪除「計數」的參數,現在的頁面看起來永遠佔有。我想這意味着它只是下載噸數據和噸數據,所以我暫停了一些流式回調函數,設置爲5次循環後殺死頁面。

我這樣做,並讓它坐很長一段時間。大約5分鐘後,頁面完成加載,並向我展示了我收集的數據。它看起來像我已經得到每次跑通過時間沒有數據 - 僅行字符的結尾。所以,對於我下載的每一條數據都需要一分鐘的時間,即使如此,顯示的唯一數據也是行結束字符。奇怪的?這是一個Twitter的問題或捲曲問題?

+1

您得到的響應頭是否使用Content-Length,還是使用分塊的Transfer-Encoding?這可能提供一個提示。 – ribram 2011-06-15 20:43:54

+0

不知道如何檢查,所以我剛剛發佈了所有我能找到的回覆信息。 – jwegner 2011-06-15 21:30:28

+0

它看起來像它是分塊的(請參閱更新頂部附近的content-length和transfer_encoding)。我看到了一個有問題的服務器分塊回覆的例子會導致這個問題,所以這可能是一個問題。您需要網絡跟蹤或curl數據包調試轉儲以嘗試並確認它。這只是一個猜測,我會等待,看看你是否有任何其他想法,然後再走這條道路。 – ribram 2011-06-15 22:18:46

回答

0

我試圖與令牌API,但從來沒有得到的東西好,所以這是我發現here腳本:

<?php 
/** 
* API Streaming for Twitter. 
* 
* @author Loïc Gerbaud <[email protected]> 
* @version 0.1 "itjustworks" 
*/ 

define('TWITTER_LOGIN','login'); //login twitter 
define('TWITTER_PASSWORD','myp4ssw0rd'); //password twitter 
$sTrackingList = 504443371;//read my account but could be keywords 

// ? 
while(1){ 
echo 'Connexion '; 
read_the_stream($sTrackingList); 
echo 'Deconnexion '; 
} 

/**read the stream 
* 
*/ 
function read_the_stream($sTrackingList){ 
$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,'https://stream.twitter.com/1/statuses/filter.json'); 
curl_setopt($ch,CURLOPT_USERPWD,TWITTER_LOGIN.':'.TWITTER_PASSWORD);//Le couple login:password 
curl_setopt($ch, CURLOPT_NOBODY, 0); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, ''); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Twitter-Client: ItsMe','X-Twitter-Client-Version: 0.1','X-Twitter-Client-URL: http://blog.loicg.net/')); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS,"follow=".$sTrackingList);//read the doc for your request 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_callback');//function callback 

curl_exec($ch); 
curl_close($ch); 
} 

/** a demo with a writting log or put in MySQL 
*/ 


function write_callback($ch, $data) { 
if(strlen($data)>2){ 
$oData = json_decode($data); 
if(isset($oData->text)){ 
file_put_contents('log',$oData->text."\n",FILE_APPEND); 
} 
} 
return strlen($data); 
} 
?> 

運行此腳本在瀏覽器中(以後還可以關閉),更新你的Twitter帳戶並檢查.LOG

0

約5分鐘後,頁面加載完

你在b上運行streaming.php rowser?如果是這樣,你必須通過ssl來運行它,否則它不起作用。我有一個指向文件服務器代下工作,但你可以與終端做也:

php /path/to/here/streaming.php 

對於瀏覽你所得到的數據,可以將其存儲到數據庫或日誌:

function my_streaming_callback($data, $length, $metrics) { 
    $ddf = fopen('/twitter/mydata.log','a'); 
    fwrite($ddf,$data); 
    fclose($ddf); 
}