web-dev-qa-db-ja.com

APIの制限に達することなくすべてのTwitterフォロワーを取得する方法

とても簡単だと思いますが、何が間違っているのかわかりません。 AbrahamのOAuthを使用してアクセスします。フォロワーの情報(画面名、ユーザー名、Twitter ID)を使用してデータベースを構築しています。特別なことは何もありません。

Twitterの " cursoring "ページ、特に擬似コードを参照してコードを作成しました。リンクをクリックして上記の疑似コードを表示したくない場合は、次のようになります。

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フォロワー/リストを呼び出し、最初の20人のユーザーを取得します。次に、カーソルを取得して次のカーソルに移動し、繰り返します。ただ、約80人のユーザーの後でそれは私に素敵なものを与えるようです:

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

    )

手動で次のカーソルを取得し、レート制限が下がるまで15分待ってから、カーソルで関数を再度呼び出し、次の80項目を取得してから、そのキーを取得して繰り返すことができますが、次のことができるスクリプトを設定したいと思います。何度もそれを呼び出します。

OAuthを呼び出す関数、またはその外部のどこかで、何か問題が発生しているように感じます。誰かが私を正しい方向に向けることができますか?

ありがとうございました。

14
Kenton de Jong

これははるかに高速ですが、制限の懸念もあります:

1-すべてのフォロワーIDを取得するようにリクエストします...ページで5000IDでページングします https://dev.Twitter.com/docs/api/1.1/get/followers/ids

2- IDをループし、コンマで区切られた文字列で各100 IDを送信して情報を取得します https://dev.Twitter.com/docs/api/1.1/get/users/lookup

3-これで、15分ごとに300ユーザーオブジェクトではなく1500ユーザーオブジェクトを取得できるようになりました

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

18
Islam Ahmed

課せられた制限を回避する方法はないと思います。 Twitterが課す制限であるため、tweetbotでさえこの制限があります。現在のステータスのメモをデータベースに作成し、リクエストのグループを再度実行する15分ごとに実行するようにcronジョブを設定できます。時間がかかりますが、終了時にメールでお知らせする場合があります。それがsocialbroのようなサービスが行うことです。もちろん、これらの結果をデータベースにキャッシュします。

2
Relequestual