如何获取3200条推文(Twitter API 1.1)

5

经过多次尝试,我终于成功使用 Twitters 新 API(版本1.1)获取推文。我正在使用 PHP TwitterOauth 库。虽然我能够获取推文,但有两件事我不理解:

  1. statuses/user_timeline 的限制为200条推文。我该如何循环遍历结果以获取最多3,200条推文?我读到了一些关于进行多个 GET 请求的信息,但我不确定该如何操作。

  2. 似乎获取的推文数量会随机变化,并且很少实际达到参数“count”中指定的数量。这是为什么?

我的应用程序只是让访问者输入用户名并获取该用户的推文。以下是我的代码:

if (isset($_GET['user'])) {
   $user = $_GET['user'];
   $content = $connection->get("statuses/user_timeline", array('count' => 200, 'exclude_replies' => true, 'screen_name' => $user));?>

   $j = 0;
   foreach ($content as $tweet) {
      echo $j.' '.$tweet->text. '<br />';
      $j++;
   } 
}

更新:在尝试了queremys下面的建议后,我想出了一个非常丑陋的“解决方案”,它有几个主要缺点。至少它显示了最多3,200条推文(以及一些重复)。如果相关的Twitter帐户少于3,200条推文,则结果将看起来很奇怪。无论如何,我只是想分享一下,如果能够启发您就好了。

if (isset($_GET['user'])) {
    $user = $_GET['user'];

    $content = $connection->get('statuses/user_timeline', array(
    'count' => 200, 'exclude_replies' => true, 'screen_name' => $user, 'include_rts' => 1
));

    $x = 0;
    while ($x < 15) {
        $text = array();

        foreach ($content as $tweet) {
            $text[] = $tweet->id_str;
            echo $tweet->text.'<br />';
        }

        $last_tweet = end($text);

        $content = $connection->get('statuses/user_timeline', array(
    'count' => 200, 'exclude_replies' => true, 'screen_name' => $user, 'include_rts' => 1, 'max_id' => $last_tweet
));
        foreach ($content as $tweet) {
            echo $tweet->text.'<br />';
        }
        $x++;
    }
}
1个回答

2

这可能会有些昂贵,但我认为是可行的(你可以试试类似的东西);

$contents = array();
$limit = 3200;
$max_id = null;
for ($count = 200; $count < $limit; $count += 200) {
    if (null !== $max_id && $max_id == '') {
        break;
    }

    $content = $connection->get('statuses/user_timeline', array(
        'count' => $count, 'exclude_replies' => true, 'screen_name' => $user,
        'max_id' => $max_id
    ));
    $contents[] = $content;
    // this indicates the last index of $content array
    $max_id = $content[count($content) - 1]->id_str;
}

更新!

您需要将$max_id设置为继续循环的条件,并且需要将$max_id设置为NULL以中断循环。

// option 1, makes $max_id NULL silently
@ $max_id = $content[count($content) - 1]->id_str;

// option 2, search for last index of array
if (count($content)) {
    $last_tweet = end($content);
    $max_id = $last_tweet->id_str;
} else $max_id = null;

谢谢,看起来很有前途。我只是快速测试了一下,但最后一行显示了一个错误:Trying to get property of non-object... Undefined offset: -1。我不理解那行代码的作用,所以也不知道如何解释这个错误信息。 - user1781186
1
我把你添加到答案中的代码放在其余部分之后。两个选择都只显示空数组:(而且,我同样的行收到了新的错误消息(尝试删除@符号后):“致命错误:无法使用stdClass类型的对象作为数组” - user1781186
尝试将 $content 转换为数组,使用 $content = (array) $content; 进行转换。 - Kerem
我无法让它工作。在什么时候应该尝试将$content转换为数组? - user1781186
我终于明白你在做什么,并想出了类似的东西,尽管它更丑陋,行为也不太好。我已经发布了上面的代码。 - user1781186
很高兴看到这个,因为我的伪代码只是一个关于如何实现想法的线索。恭喜! - Kerem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接