Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在不超过API限制的情况下获得所有Twitter关注者_Php_Twitter_Oauth_Twitter Oauth - Fatal编程技术网

Php 如何在不超过API限制的情况下获得所有Twitter关注者

Php 如何在不超过API限制的情况下获得所有Twitter关注者,php,twitter,oauth,twitter-oauth,Php,Twitter,Oauth,Twitter Oauth,我想这很容易做到,但我不知道我做错了什么。我正在使用亚伯拉罕的OAuth来获取访问权限。我正在用我的追随者的信息建立一个数据库:屏幕名、用户名和twitter ID。没什么特别的 我引用了Twitter的“”页面,特别是伪代码,来生成我的代码。对于那些不想点击该链接查看上述pesudo代码的用户,该代码如下所示: cursor = -1 api_path = "https://api.twitter.com/1.1/endpoint.json?screen_name=targetUser"

我想这很容易做到,但我不知道我做错了什么。我正在使用亚伯拉罕的OAuth来获取访问权限。我正在用我的追随者的信息建立一个数据库:屏幕名、用户名和twitter 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 )
 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>';

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

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 )
 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>';

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

我觉得我做错了什么,要么是我调用oAuth的函数,要么是它之外的某个地方。谁能给我指一下正确的方向吗


谢谢。

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

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

1-请求获取所有追随者ID。。。页面中具有5000 id的分页

2-循环id并以逗号分隔的字符串发送每个100 id以获取其信息

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


但是您还需要每15个请求设置一个计时器,以防追随者列表超过1500个

您需要限制您的速率,使用
sleep()
您应该每15分钟有15个请求,这样您就可以在每个请求后睡眠一分钟,或者快速浏览您的请求,然后睡眠15分钟。它看起来也有头信息发送,以确定何时可以再次去,这不是一个坏主意。不过这需要几个小时。如果没有别的,我会那样做。谢谢我最终这样做了,但我修改了它,改为使用它,这样我就可以同时获得用户名和屏幕名。你的想法很有效,但我需要更多的数据。按照我的方法,我必须设置一个循环和一个计时器,就像Relequestual所说的那样,但最终,它成功了,所以谢谢你:)欢迎:)。。。不幸的是,twitter的限制太高了,我们必须解决这个问题:我错过了什么?这不正是将瓶颈从步骤1更改为步骤2吗?现在已经有一个叫粉丝200的电话了,第二步是100个。@pete这个答案是3年前的,我真的不知道twitter是否更新了他们的API来解决这个问题。但这是2013年的唯一解决方案。2017年,用户/查找限制为每15分钟900个,每15分钟回复100个结果90000个。现在的瓶颈是followers/id,每15分钟有15个请求,在75000时返回5000个id。