如何在不达到API限制的情况下获得所有Twitter追随者


How To Obtain All Twitter Followers Without Hitting API Limit

我想这很容易做到,但我不知道我做错了什么。我正在使用亚伯拉罕的OAuth获取访问权限。我正在用我的追随者的信息建立一个数据库:屏幕名称、用户名和推特ID。没有什么特别的。

我引用了Twitter的"游标"页面,尤其是伪代码,来制作我的代码。对于那些不想点击链接查看所说的pesudo代码的人来说,它看起来如下:

cursor = -1
api_path = "https://api.twitter.com/1.1/endpoint.json?screen_name=targetUser"
do {
    url_with_cursor = api_path + "&cursor=" + cursor      
    response_dictionary = perform_http_get_request_for_url( url_with_cursor )
    cursor = response_dictionary[ 'next_cursor' ]
}
while ( cursor != 0 )

对于每个请求,最终用户都会得到一个"光标",允许他们在结果的"页面"中导航。每一页可以容纳20个,如果你有200个追随者,你必须浏览10页。我有900多名追随者。我将其修改为如下所示:

 include('config.php');  //db connection
 include('twitter_oauth.php'); //oauth connection
 $followers = "";
$cursor = -1;
echo '<pre>';   
do {
    $consumerKey = 'xxx';
    $consumerSecret = 'xxx';
    $OAuthToken = 'xxx';
    $OAuthSecret = 'xxx';
    $tweet = new TwitterOAuth($consumerKey, $consumerSecret, $OAuthToken, $OAuthSecret);
    $followers = $tweet->get('followers/list', array('screen_name' => 'my_screen_name', 'cursor' => $cursor));
    print_r($followers);
    if (isset($followers->error)) {
        echo $followers->next_cursor_str;
        break;
    } 
    foreach($followers->users as $users) {
        $followersQ = mysql_query("SELECT * FROM followers WHERE tw_id = '".$users->id."'") or die(mysql_error());
        $num_rows = mysql_num_rows($followersQ);
        if ($num_rows == 0) {
            $followersQ2 = "INSERT INTO followers 
                                        (screen_name, name, tw_id)
                                        VALUES
                                        ('".$users->screen_name."', '".$users->name."', '".$users->id."')";
            $followersR = mysql_query($followersQ2) or die(mysql_error());
            echo 'done one set<br>';
        }
    }

    $cursor = $followers->next_cursor_str;
}
while ( $cursor != 0 );
echo '</pre>';
?>

上面的代码调用twitter关注者/列表并获得前20个用户。然后它得到一个光标并转到下一个光标,然后重复。只是,在大约80个用户之后,它似乎给了我可爱的:

[errors] => Array
    (
        [0] => stdClass Object
            (
                [message] => Rate limit exceeded
                [code] => 88
            )
    )

我可以手动获取下一个光标,等待15分钟以降低速率限制,用光标再次调用函数,获取接下来的80个项目,然后获取该键并重复,但我想设置一个可以反复调用它的脚本。

我觉得我做错了什么,无论是在我调用oAuth的函数中,还是在它之外的某个地方。有人能给我指正确的方向吗?

谢谢。

这是一种更快的方式,但也有一个限制问题:

1-请求获取所有关注者ID。。。页面中有5000 id的页面https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids

2-在id上循环,并以逗号分隔的字符串发送每个100 id以获取其信息https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-lookup

3-现在你可以每15分钟获得1500个用户对象,而不是300个用户对象

但是,如果关注者列表超过1500 ,您还需要每15个请求设置一个计时器

我认为没有任何办法绕过强加的限制。即使是推特也有这个限制,因为这是推特强加的限制。您可以在当前状态的数据库中创建一个注释,并将cron作业设置为每15分钟运行一次,这将再次运行一组请求。这需要时间,但它可能会在完成后通过电子邮件通知你。像socialbro这样的服务就是这么做的。当然,你会把这些结果缓存在数据库中。