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. Je suis à l'aide d'Abraham OAuth pour y avoir accès. Je suis en train de construire une base de données avec mon adepte de l'information: l'écran, le nom d'utilisateur et ID twitter. Rien de trop spécial.
Que j'ai référencé de Twitter "cursoring" de la page, en particulier le code de pseudo, pour rendre mon code. Pour ceux qui ne veulent pas cliquer sur le lien pour voir dit pesudo code, il ressemble à la suivante:
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 )
À chaque requête, l'utilisateur final bénéficie d'un "curseur" qui leur permet de naviguer à travers les pages de résultats. Chaque page dispose de 20, et si vous avez 200 followers que vous avez à passer par 10 pages. J'ai plus de 900 followers. Je l'ai modifié pour ressembler à la suivante:
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 adeptes de twitter/liste et devient la première de 20 utilisateurs. Elle obtient ensuite un curseur et passe à la suivante, et se répète. Seulement, il semble qu'après environ 80 utilisateurs, il me donne l'agréable:
[errors] => Array
(
[0] => stdClass Object
(
[message] => Rate limit exceeded
[code] => 88
)
)
J'ai pu récupérer manuellement la prochaine curseur, attendre 15 minutes pour que la limite de taux à la baisse, appelez la fonction avec le curseur, la prochaine de 80, puis obtenir cette clé, et le répéter, mais je veux mettre en place un script que l'on peut appeler encore et encore.
Je sens que je suis en train de faire quelque chose de mal, que ce soit avec ma fonction où j'appelle oAuth, ou à l'extérieur de quelque part. Quelqu'un peut-il me diriger dans la bonne direction?
Merci.
source d'informationauteur Kenton de Jong
Vous devez vous connecter pour publier un commentaire.
- Ce une façon plus rapide, mais il y a une limite concerne aussi :
1 - faites une demande pour obtenir tous les adeptes des id ... pagination avec 5000 id dans la page
https://dev.twitter.com/docs/api/1.1/get/followers/ids
2 - boucle sur les id et envoyer chaque 100 id dans une chaîne séparée par des virgules pour obtenir leur info
https://dev.twitter.com/docs/api/1.1/get/users/lookup
3 - maintenant u peut obtenir 1500 utilisateur de l'objet au lieu de 300 utilisateur de l'objet, toutes les 15 minutes
Mais vous devez également définir une minuterie de 15 demande dans le cas où les adeptes de la liste est de plus de 1500
Je ne pense pas qu'il n'y a aucun moyen de les contourner les limitations imposées. Même tweetbot a cette limitation, c'est une limitation twitter imposer. Vous pouvez créer une note dans la base de données de l'état actuel et de définir une tâche cron pour exécuter toutes les 15 minutes, ce qui permettrait de lancer un groupe de demandes de nouveau. Il faudra du temps, mais il peut vous prévenir par courriel lorsque c'est fini. C'est ce que des services comme socialbro faire. Vous auriez du cache de ces résultats dans votre base de données de cours.