2013-09-03 19 views
12

私はそれがかなり簡単だと思いますが、私が間違っていることを理解できません。私はアクセスを得るためにアブラハムのOAuthを使用しています。私はフォロワーの情報を持つデータベースを構築しています:スクリーン名、ユーザー名、およびTwitterのID。あまりにも特別なものはありません。API制限なしですべてのTwitterフォロワーを取得する方法

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

?> 

上記のコードは、twitter followers/listを呼び出し、最初の20人のユーザーを取得します。次に、カーソルを取得して次のものに進み、繰り返します。取得、

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

    ) 

私は手動で、次のカーソルを取得する可能性がダウンするレート制限のために15分を待って、カーソルで再び関数を呼び出す:のみ、私に素敵なを与える約80ユーザーが後に思えます次の80項目は、そのキーを取得し、繰り返すが、私は何度もそれを呼び出すことができるスクリプトを設定したい。

私は誤ったやり方をしていると感じています。私がoAuthと呼ぶ場所で、あるいはどこか別の場所でその機能を使用しています。誰かが私を正しい方向に向けることができますか?

ありがとうございます。

+0

レートを制限する必要があります。スリープ()では15分ごとに15個のリクエストが必要ですリクエストごとに1分間寝るか、リクエストを爆発させてから15分間寝ます。また、あなたがいつ再び行くことができるかを判断するためのヘッダー情報があるように見えます。 – cmorrissey

+0

これは悪い考えではありません。しかし、それは数時間かかるだろう。他に何もなければ、私はそれをします。ありがとう! –

答えて

17

この方法でより速く、しかし制限も懸念があります: https://dev.twitter.com/docs/api/1.1/get/followers/ids

2 - ループ上のページでは5000 idを持つ

1-すべての信者のIDを取得するための要求を行う...ページングIDとは、uは15分ごとに1500ユーザーオブジェクトの代わりに、300ユーザオブジェクトを取得することができ、今 https://dev.twitter.com/docs/api/1.1/get/users/lookup

、3-彼らの情報を取得するためにカンマ区切りの文字列で、各100のIDを送信

フォロワーリストが1500を超える場合は15リクエストごとにタイマーを設定する必要もあります

+1

私はこれをやってしまったが、代わりにhttps://dev.twitter.com/docs/api/1.1/get/users/showを使うように変更したので、ユーザー名と画面名の両方を得ることができた。あなたのコンセプトは素晴らしいものでしたが、もっと多くのデータが必要でした。 私のアプローチでは、Relequestualと同じようにループとタイマーを設定しなければならなかったが、最終的にはうまくいった。 –

+1

U r welcome :) ...残念ながら、Twitterの制限が高すぎる私たちは回避する必要があります:D –

+0

何か不足していますか?これはステップ1からステップ2へのボトルネックを変えるだけではありませんか?フォロワー200を一度に取得する呼び出しが既に存在し、ステップ2は一度に100である。 – pete

2

私は制限が課せられている方法はありません。 tweetbotでもこの制限があります。これは、制限されたtwitterが課すものです。データベースに現在のステータスのメモを作成し、cronジョブを15分ごとに実行するように設定すると、一連の要求を再度実行できます。それには時間がかかりますが、完了したらメールで通知することができます。それがソーシャル・ブロウのようなサービスです。それらの結果をデータベースにキャッシュします。

関連する問題