我打算在特定主题上录制实时推文。同样,我在PHP中使用带有cURL的twitter流API。
以下是代码:
<?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,我可以看到终端上的推文。但是我无法存储变量$ jsonOBJ并将其打印出来。
请帮助!
答案 0 :(得分:4)
更新:在邮件末尾看到新代码,这实际上很容易用cURL做,但我第一次错误地解决了这个问题。
我无法使用cURL与CURLOPT_READFUNCTION
一起使用Twitter流API,但使用fsockopen()和fread()
取得了成功。我不确定为什么readfunction没有工作,因为我之前已成功使用它,但它必须与响应数据是“流”并且不使用HTTP分块编码发送的事实有关。从本质上讲,我的读函数从未被调用过,所以我无法处理数据。
我使用的方法现在正在使用:
ssl://stream.twitter.com
fputs
fread
读取金额数据我已经让它运行了几个小时,并且没有断开连接,我已经处理了超过30,000封没有错误的消息。
基本上我实现了一个回调系统,这样每次从缓冲区读取一个完整的消息时,它就会用json消息调用用户定义的回调,这样应用程序就可以做任何需要处理的消息(例如插入到数据库)。
我还没有任何简短的片段在这里发布,但如果你愿意,请通过访问我的个人资料中列出的网站并填写联系表格给我留言,我很乐意分享。如果有人有兴趣,也许我们可以一起工作。我只是为了好玩而这样做,我对Twitter没有兴趣,并且由于经济原因我没有使用它。我最终可能会把它放在GitHub上。
编辑:
以下是一些cURL代码,它将连接到流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);
答案 1 :(得分:1)
我正在处理同样的事情:)问题是,当你在终端中执行它时,它是一个流,所以连接保持活着直到你杀了它。 (即curl_exec()没有完成)
尝试查看CURLOPT_PROGRESSFUNCTION和CURLOPT_READFUNCTION。他们可能会给你一些提示。
答案 2 :(得分:1)
@Reza Sanaie和其他可能会觉得有帮助的人。
我使用了SEARCH 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中添加此脚本以自动执行整个过程。
答案 3 :(得分:0)
我只是急着赶回你的日子。看起来它应该可行。
下面是我使用的一个函数,我在其中传递一个URL和一些XML数据,它返回一个关联数组,表示成功为true或false,而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;
}