Как получить всех подписчиков Twitter без ограничения API-интерфейса

Я думаю, это довольно легко сделать, но я не могу понять, что я делаю неправильно. Я использую Abraham OAuth для доступа. Я создаю базу данных с информацией о моем подписчике: имя экрана, имя пользователя и идентификатор твиттера. Ничего особенного.

Я сделал ссылку на страницу Twitter cursoring", особенно псевдокод, чтобы сделать мой код. Для тех, кто не хочет нажимать на ссылку, чтобы увидеть указанный код 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>';

?>

Вышеупомянутый код вызывает последователей/список твиттеров и получает первых 20 пользователей. Затем он получает курсор и переходит к следующему, и повторяет. Только, кажется, примерно после 80 пользователей это дает мне прекрасный:

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

    )

Я мог бы вручную получить следующий курсор, подождать 15 минут, чтобы предел скорости снизился, снова вызвать функцию с помощью курсора, получить следующие 80 элементов, затем получить этот ключ и повторить, но я хочу настроить script, который может вызывать его снова и снова.

Я чувствую, что делаю что-то неправильно, либо с моей функцией, где я называю oAuth, или где-то вне ее. Может ли кто-нибудь указать мне в правильном направлении?

Спасибо.

Ответ 1

Это быстрее, но есть и ограничение:

1- сделать запрос на получение всех подписчиков ids... paging с 5000 id на странице  https://dev.twitter.com/docs/api/1.1/get/followers/ids

2- цикл на идентификаторах и отправить каждый 100 идентификатор в разделенном запятой строке, чтобы получить информацию  https://dev.twitter.com/docs/api/1.1/get/users/lookup

3- теперь u может получить 1500 пользовательских объектов вместо 300 пользовательских объектов каждые 15 минут

Но вам также нужно установить таймер каждые 15 запросов в случае, если список подписчиков превышает 1500

Ответ 2

Я не думаю, что существует какой-то способ ограничения. Даже у tweetbot есть это ограничение, поскольку это ограничение ограничивает. Вы можете создать заметку в базе данных текущего состояния и задать задание cron каждые 15 минут, которое снова запустит группу запросов. Это займет время, но оно может уведомить вас по электронной почте, когда оно закончится. Это то, что услуги, подобные socialbro. Конечно, вы должны кэшировать эти результаты в своей базе данных.