2013-09-03 3 views
12

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

Я ссылался на страницу «cursoring» 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>'; 

?> 

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

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

    ) 

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

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

спасибо.

+0

Вам нужно будет ограничить свою ставку, используя 'sleep()' у вас должно быть 15 запросов за 15 минут, чтобы вы могли спать в течение минуты после каждого запроса или взрывать ваши просьбы, а затем спать в течение 15 минут. Также похоже, что информация заголовка отправлена ​​для определения, когда вы можете снова вернуться https://dev.twitter.com/docs/rate-limiting/1.1 – cmorrissey

+0

Это неплохая идея. Это займет несколько часов. Если ничего другого, я сделаю это. Благодаря! –

ответ

17

Этим способом быстрее, но есть ограничение касается также:

1- сделать запрос, чтобы получить все последователь иды ... пейджинг с 5000 идентификатором страницы 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- Теперь вы можете получить 1500 пользовательский объект вместо 300 объекта пользователя каждые 15 минут

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

+1

Я закончил это, но я изменил его, чтобы вместо этого использовать https://dev.twitter.com/docs/api/1.1/get/users/show, чтобы получить как имя пользователя, так и имя экрана. Ваша концепция отлично поработала, но мне просто нужно было еще больше данных. Выполнение моего подхода, мне пришлось установить цикл и таймер, как сказал Releasequestual, но в итоге он работал, поэтому спасибо :) –

+1

U r welcome :) ... К сожалению, ограничение твиттера слишком велико и мы должны работать: D –

+0

Я что-то упустил? Разве это не просто изменит узкое место с шага 1 на шаг 2? Уже есть призыв получить последователей 200 за раз, а шаг 2 - 100 за раз. – pete

2

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

Смежные вопросы