2011-06-15 151 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); 
}