2013-09-03 4 views
12

Ich stelle mir vor, es ist ziemlich einfach zu tun, aber ich kann nicht herausfinden, was ich falsch mache. Ich benutze Abrahams OAuth, um Zugang zu erhalten. Ich baue eine Datenbank mit den Informationen meines Nachfolgers: Name des Bildschirms, Benutzername und Twitter-ID. Nichts Besonderes.Wie bekomme ich alle Twitter-Follower, ohne API-Limit zu treffen

Ich referenzierte Twitter "cursoring" Seite, vor allem der Pseudo-Code, um meinen Code zu machen. Für diejenigen, die nicht wollen, auf den Link klicken, um den pesudo Code zu sehen, sieht es wie folgt aus:

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) 

Bei jeder Anforderung, der Endbenutzer einen „Cursor“ bekommt, die sie durch „Seiten navigieren kann "von Ergebnissen. Jede Seite enthält 20, und wenn Sie 200 Follower haben, müssen Sie 10 Seiten durchgehen. Ich habe über 900 Anhänger. Ich änderte es wie folgt aussehen:

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

?> 

Der obige Code ruft die Twitter-Follower/Liste und bekommt die ersten 20 Benutzer. Es erhält dann einen Cursor und geht zum nächsten und wiederholt. Nur scheint es nach etwa 80 Benutzern es mir die schönen gibt:

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

    ) 

ich manuell den nächsten Cursor bekommen konnte, nur 15 Minuten warten, bis die Geschwindigkeitsgrenze mit dem Cursor die Funktion wieder zu gehen, ruft, erhält die nächsten 80 Elemente, dann erhalten Sie diese Taste und wiederholen, aber ich möchte ein Skript einrichten, die es immer wieder aufrufen können.

Ich fühle, dass ich etwas falsch mache, entweder mit meiner Funktion, wo ich oAuth anrufe, oder irgendwo außerhalb davon. Kann mir jemand in die richtige Richtung zeigen?

Vielen Dank.

+0

Sie müssen Ihre Rate zu begrenzen, mit 'sleep()' sollten Sie 15 Anfragen pro 15 Minuten haben, so können Sie Schlafe für eine Minute nach jeder Anfrage, oder sprengen Sie Ihre Anfragen und schlafen Sie dann für 15 Minuten. Es sieht auch so aus, als ob Header-Informationen gesendet werden, um festzustellen, wann Sie wieder gehen können https://dev.twitter.com/docs/rate-limiting/1.1 – cmorrissey

+0

Das ist keine schlechte Idee. Es würde jedoch ein paar Stunden dauern. Wenn nichts anderes, werde ich das tun. Vielen Dank! –

Antwort

17

Dies ist eine Art und Weise schneller, aber es gibt eine Einschränkung betrifft auch:

1- eine Anfrage alle Anhänger ids ... Paging mit 5000-ID in der Seite https://dev.twitter.com/docs/api/1.1/get/followers/ids

2- Schleife auf erhalten die Ide und jede 100-ID in einem Komma getrennte Zeichenfolge senden ihre Informationen https://dev.twitter.com/docs/api/1.1/get/users/lookup

3- jetzt bekommen u 1500 Benutzerobjekt erhalten können statt 300 Benutzerobjekt alle 15 Minuten

Aber Sie müssen auch einen Timer alle 15 Anfrage einstellen, wenn die Follower-Liste mehr als 1500 ist

+1

Ich habe dies getan, aber ich änderte es so, dass ich stattdessen https://dev.twitter.com/docs/api/1.1/get/users/show verwendete, damit ich sowohl den Benutzernamen als auch den Namen des Bildschirms bekommen konnte. Ihr Konzept hat gut funktioniert, aber ich brauchte nur noch mehr Daten. Bei meinem Ansatz musste ich eine Schleife und einen Timer setzen, so wie es bei ReleaseQuestQ gesagt wurde, aber am Ende funktionierte es, also danke :) –

+1

Willkommen ... :) Leider ist die Twitter-Begrenzung zu hoch und wir müssen arbeiten: D –

+0

Fehle ich etwas? Ändert das nicht einfach den Engpass von Schritt 1 zu Schritt 2? Es gibt bereits einen Anruf, um Follower 200 gleichzeitig zu erhalten, und Schritt 2 ist jeweils 100. – pete

2

Ich glaube nicht, dass es irgendwelche Einschränkungen gibt. Sogar Tweetbot hat diese Einschränkung, da es eine Einschränkung ist, die Twitter auferlegt. Sie könnten eine Notiz in der Datenbank des aktuellen Status erstellen und einen Cron-Job festlegen, der alle 15 Minuten ausgeführt wird, um eine Gruppe von Anfragen erneut auszuführen. Es wird Zeit brauchen, aber es könnte Sie per E-Mail benachrichtigen, wenn es fertig ist. Das sind Dienste wie Socialbro. Sie würden diese Ergebnisse natürlich in Ihrer Datenbank zwischenspeichern.