使用cURL输出
我正计划在特定主题上记录实时推文。同样,我在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并打印它。
请帮忙!
我工作在这样的事情,以及:)问题是,当你在终端做,这是一个流,所以直到你杀它的连接保持活跃。 (即curl_exec()未完成)
试着看一下CURLOPT_PROGRESSFUNCTION和CURLOPT_READFUNCTION。他们可能会给你一些提示。
我只是冲你一个答案,离开的那一天。这看起来应该起作用。
下面是我使用的功能,我将它传递一个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;
}
UPDATE:见新代码在邮件的末尾,这实际上是很容易做到,但卷曲我去它正确的第一次。
我无法使用cURL与CURLOPT_READFUNCTION
结合使用Twitter流API,但使用fsockopen()和fread()
已成功。我不确定为什么readfunction不能正常工作,因为我以前用它成功了,但它必须与响应数据是“流式传输”并不是使用HTTP分块编码发送的事实有关。从本质上讲,我的阅读功能从未被调用,所以我无法处理数据。
我使用的方法是现在工作:使用数据流使用fputs
ssl://stream.twitter.com
- 连接没有错误
- 在无限循环中使用
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);
@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中加入自动完成整个过程。
不会是更容易使用和SDK使用OAuth PHP? – chepe263 2012-04-26 17:01:16
打印出$结果,在尝试对其进行解码之前查看它的外观。 – MrCode 2012-04-26 17:02:43
现在,我直接做这个“echo $ result;”。 但是在执行这个脚本时什么也没有显示出来。 – Gooner 2012-04-26 17:15:08