Question Comment obtenir tous les abonnés Twitter sans atteindre la limite API


J'imagine que c'est assez facile à faire, mais je ne peux pas comprendre ce que je fais mal. J'utilise OAuth d'Abraham pour y accéder. Je construis une base de données avec les informations de mon abonné: nom d'écran, nom d'utilisateur et identifiant twitter. Rien de bien spécial

J'ai référencé les Twitter "la maçonnerie"page, en particulier le pseudo-code, pour créer mon code. Pour ceux qui ne veulent pas cliquer sur le lien pour voir ledit code pesudo, cela ressemble à ceci:

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 )

A chaque requête, l'utilisateur final reçoit un "curseur" qui lui permet de naviguer dans les "pages" de résultats. Chaque page contient 20 pages, et si vous avez 200 abonnés, vous devez parcourir 10 pages. J'ai plus de 900 adeptes. Je l'ai modifié pour ressembler à ceci:

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

?>

Le code ci-dessus appelle les abonnés / liste des abonnés de Twitter et reçoit les 20 premiers utilisateurs. Il obtient alors un curseur et passe au suivant et se répète. Seulement, il me semble qu'après environ 80 utilisateurs, je suis ravi:

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

    )

Je pourrais obtenir manuellement le curseur suivant, attendre 15 minutes pour que la limite de taux diminue, appeler à nouveau la fonction avec le curseur, récupérer les 80 éléments suivants, puis récupérer cette clé et la répéter, mais je veux configurer un script Appelez-le encore et encore.

Je sens que je fais quelque chose de mal, soit avec ma fonction où j'appelle oAuth, soit en dehors de quelque part. Quelqu'un peut-il me diriger dans la bonne direction?

Je vous remercie.


13
2017-09-03 19:41


origine


Réponses:


Cela est plus rapide, mais il y a une limitation qui concerne aussi:

1- faire une demande pour obtenir tous les identifiants des suiveurs ... pagination avec 5000 id dans la page     https://dev.twitter.com/docs/api/1.1/get/followers/ids

2- boucle sur les identifiants et envoie chaque 100 id dans une chaîne séparée par des virgules pour obtenir leurs informations     https://dev.twitter.com/docs/api/1.1/get/users/lookup

3- maintenant vous pouvez obtenir 1500 objet utilisateur au lieu de 300 objet utilisateur toutes les 15 minutes

Mais vous devez également définir une minuterie toutes les 15 requêtes au cas où la liste des suiveurs serait supérieure à 1500


18
2017-09-04 09:45



Je ne pense pas qu'il y ait moyen de contourner les limitations imposées. Même tweetbot a cette limitation, car c'est une limitation imposée par twitter. Vous pouvez créer une note dans la base de données du statut actuel et définir une tâche cron à exécuter toutes les 15 minutes afin d'exécuter à nouveau un groupe de requêtes. Cela prendra du temps, mais il pourrait vous informer par e-mail quand il sera terminé. C'est ce que font les services comme socialbro. Vous devez bien sûr mettre ces résultats en cache dans votre base de données.


2
2017-09-04 08:24