Pytanie Jak uzyskać wszystkich obserwatorów na Twitterze bez limitu API


Wyobrażam sobie, że jest to łatwe, ale nie mogę zrozumieć, co robię źle. Używam OAuth Abrahama, aby uzyskać dostęp. Buduję bazę danych z informacjami mojego obserwatora: nazwa ekranu, nazwa użytkownika i identyfikator twittera. Nic nadzwyczajnego.

Nawiązałem do Twittera "kursowanie"strona, szczególnie pseudo kod, aby mój kod. Dla tych, którzy nie chcą kliknąć na link, aby zobaczyć wspomniany kod pesudo, wygląda to tak:

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 )

Przy każdym żądaniu końcowy użytkownik otrzymuje "kursor", który pozwala mu nawigować po "stronach" wyników. Każda strona ma 20, a jeśli masz 200 obserwatorów, musisz przejść przez 10 stron. Mam ponad 900 obserwujących. Zmodyfikowałem go tak, aby wyglądał następująco:

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

?>

Powyższy kod wywołuje listę obserwatorów / list i uzyskuje pierwszych 20 użytkowników. Następnie dostaje kursor i przechodzi do następnego, i powtarza. Tylko, wydaje się, że po około 80 użytkownikach daje mi to piękne:

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

    )

Mogłem ręcznie pobrać następny kursor, odczekać 15 minut, aż limit prędkości spadnie, wywołać funkcję ponownie za pomocą kursora, uzyskać kolejne 80 pozycji, następnie zdobyć ten klucz i powtórzyć, ale chcę ustawić skrypt, który może zadzwoń w kółko.

Czuję, że robię coś nie tak, albo z moją funkcją, gdzie nazywam OAuth, albo gdzieś poza nią. Czy ktoś może wskazać mi właściwy kierunek?

Dziękuję Ci.


13
2017-09-03 19:41


pochodzenie


Będziesz musiał ograniczyć swoją stawkę za pomocą sleep() powinieneś mieć 15 próśb na 15 minut, abyś mógł spać przez minutę po każdej prośbie, lub podskakiwać przez twoje prośby, a następnie spać przez 15 minut. Wygląda również na to, że wysłano informacje o nagłówku, aby określić, kiedy możesz ponownie jechać dev.twitter.com/docs/rate-limiting/1.1 - cmorrissey
To nie jest zły pomysł. Ale to potrwa kilka godzin. Jeśli nic więcej, zrobię to. Dzięki! - Kenton de Jong


Odpowiedzi:


Jest to o wiele szybszy sposób, ale istnieje również ograniczenie:

1 - zgłoś żądanie, aby uzyskać wszystkie identyfikatory następców ... stronicowanie z identyfikatorem 5000 na stronie     https://dev.twitter.com/docs/api/1.1/get/followers/ids

2- pętla na identyfikatorach i wyślij każdy 100 identyfikatorów w ciągu oddzielonym przecinkami, aby uzyskać ich informacje     https://dev.twitter.com/docs/api/1.1/get/users/lookup

3- teraz można uzyskać 1500 obiektów użytkownika zamiast 300 obiektów użytkownika co 15 minut

Ale musisz również ustawić timer co 15 żądań, jeśli lista obserwatorów jest większa niż 1500


18
2017-09-04 09:45



Skończyło się na tym, ale zmodyfikowałem go do użycia dev.twitter.com/docs/api/1.1/get/users/showzamiast tego mogę uzyskać zarówno nazwę użytkownika, jak i nazwę użytkownika. Twoja koncepcja działała świetnie, ale potrzebowałem więcej danych. Robiąc moje podejście, musiałem ustawić pętlę i timer, tak jak powiedział Relequestual, ale w końcu zadziałało, więc dziękuję :) - Kenton de Jong
U r welcome :) ... Niestety limit na Twitterze jest zbyt wysoki i musimy się obejść: D - Islam Ahmed
Czy czegoś brakuje? Czy to nie zmienia wąskiego gardła z etapu 1 do etapu 2? Jest już połączenie, aby uzyskać 200 obserwujących jednocześnie, a krok 2 wynosi 100 naraz. - pete
@pete Ta odpowiedź była 3 lata temu, nie wiem, czy Twitter zaktualizował swoje API, aby rozwiązać ten problem, czy nie. Ale to było jedyne rozwiązanie w 2013 roku. - Islam Ahmed
W 2017 r. Użytkownicy / wyszukiwania mają limit 900 na 15 minut i 100 wyników na odpowiedź za 90 000 co 15 minut. Wąskim gardłem jest teraz followers / ids z 15 żądaniami na 15 minut, zwracając 5000 identyfikatorów na 75 000. - dotcomly


Nie sądzę, aby jakiekolwiek ograniczenia zostały narzucone. Nawet tweetbot ma to ograniczenie, ponieważ nakłada ograniczenia na twitter. Można utworzyć notatkę w bazie danych bieżącego statusu i ustawić zadanie cron, które będzie uruchamiane co 15 minut, co spowoduje ponowne uruchomienie grupy żądań. To zajmie trochę czasu, ale może powiadomić Cię pocztą e-mail, gdy skończymy. Tak właśnie działają usługi takie jak socialbro. Oczywiście zapisałeś te wyniki w bazie danych.


2
2017-09-04 08:24