gpt4 book ai didi

php - 使用 cURL 输出

转载 作者:可可西里 更新时间:2023-11-01 13:21:33 32 4
gpt4 key购买 nike

我打算录制有关特定主题的实时推文。同样,我在 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 中并打印出来。

请帮忙!

最佳答案

更新:请参阅消息末尾的新代码,使用 cURL 实际上很容易做到这一点,但我第一次做错了。

我无法使用 cURL 结合 CURLOPT_READFUNCTION 使 Twitter 流 API 工作,但使用 fsockopen() 成功了和 fread()。我不确定为什么 readfunction 不能正常工作,因为我之前成功地使用过它,但它必须与响应数据是“流式”并且不是使用 HTTP 分块编码发送的事实有关。本质上,我的读取函数从未被调用过,所以我无法处理数据。

我使用的方法现在有效:

  • 使用 fsockopen 连接到 ssl://stream.twitter.com
  • 使用 fputs
  • 发出流数据的基本 HTTP 请求
  • 使用 HTTP 响应 header 并确保没有错误
  • 在无限循环中使用fread读取数量数据
  • 每次读取一大块数据时,我都会调用一个内部缓冲函数
  • 缓冲区函数将新数据附加到缓冲区
  • 然后缓冲区函数尝试处理缓冲区中的所有消息(如果我们有 1 条或多条完整消息)
  • 在处理每条消息时,缓冲区会减少直到为空,然后函数返回并再次读取数据

我现在已经让它运行了几个小时,没有出现连接断开的情况,而且我已经处理了超过 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);

关于php - 使用 cURL 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10337984/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com