質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.37%

  • Java

    10446questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSON

    775questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Twitter

    442questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Twitter4jのフォロワー取得がうまくいかない

受付中

回答 0

投稿 2017/11/23 12:08 ・編集 2017/11/24 01:33

  • 評価
  • クリップ 0
  • VIEW 62

ryo1729_k

score 1

今, javaでTwitter4jを利用してプログラムを作っています.

全体像としては, ある特定のアカウントから連鎖的にそのフォロワーアカウントを取得していき, 最終的にそれをJungというグラフ作成ライブラリで可視化するといったプログラムです.

下のプログラムは, Long Id_Num に入力された User_Id のフォロワーアカウントを取得し, 最後に鍵垢か否かを振り分けてリストに格納し返す, といった構造になっています.
(以下のコードは, HatenaBlogのymuto109さんのコードを参考にさせていただきました.)

public static List<Long> Followers_from_ID(Twitter twitter, Long Id_Num) throws TwitterException{

        List<Long> m_FollowersList = new ArrayList<Long>();

        long cursor = -1;
        //int count = 0;
        while(true) {
            IDs ids = null;
            try {
                //IDs ids = twitter.getFollowersIDs(user.getId(), cursor);
                ids = twitter.getFollowersIDs(Id_Num, cursor);
            } catch(TwitterException twitterException){
                // Rate Limit に引っかかった場合の処理
                // (メモ) status code も併せてチェックすべきか?!

                RateLimitStatus rateLimit = twitterException.getRateLimitStatus();
                int secondsUntilReset = rateLimit.getSecondsUntilReset();
                System.err.println("please wait for " + secondsUntilReset + " seconds");
                //System.err.println("Reset Time : " +  rateLimit.getResetTime());

                //(注) 120秒間,水増し・・getSecondsUntilReset() の返す値が負の
                //場合があり,それに対応するため
                // long waitTime = (long)(secondsUntilReset + 120) * 1000;
                long waitTime = (long)(300 * 1000); // 300秒待ち
                try {
                    Thread.sleep(waitTime);
                } catch(Exception e){
                    e.printStackTrace();
                }

                continue;
            } catch(Exception e){
                e.printStackTrace();
            }

            long[] idArray = ids.getIDs();                        //受け取ったフォロワー配列をidArrayに代入
            for(int i = 0; i < idArray.length; i++){
                //System.out.println("["+(++count)+"]" + idArray[i]);
                m_FollowersList.add(new Long(idArray[i]));        //リストにフォロワーを追加
            }

            if(ids.hasNext()){
                cursor = ids.getNextCursor();
            } else {
                break;
            }
        }

        Remove_LockedID(m_FollowersList);

        return m_FollowersList;
    }

    //リストに格納されたIDを公開垢のみに加工.
    private static List<Long> Remove_LockedID(List<Long> ID){

        List<Long> IDs = new ArrayList<Long>();

        for(int i = 0;i<ID.size();i++){
            if(ID.get(i) >= 100000000L && ID.get(i)<= 999999999L){
                IDs.add(ID.get(i));
            }
        }

        return IDs;
    }

上記のプログラムを実行した際に, 1,2回動作させる場合は安定してアカウントのリストを取得できるのですが, 
複数回動作させた場合にどうしても以下のエラーが出てしまいます.
RateLimitに引っかかったわけでもなく, 理由がわかりません...

[Thu Nov 23 11:30:08 JST 2017]GET https://api.twitter.com/1.1/followers/ids.json?user_id=~9桁のユーザid~&cursor=-1&include_entities=true
[Thu Nov 23 11:30:08 JST 2017]OAuth base string: GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffollowers%2Fids.json&cursor%3D-1%26include_entities%3Dtrue%26oauth_consumer_key%3DxzjaN0negq9ByNRNDPTBd5PdY%26oauth_nonce%3D3425368818%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1511404208%26oauth_token%3D741300256676024320-IKc9eCnlZez8CJS6UTdQqxewcUgieK3%26oauth_version%3D1.0%26user_id%3D539928952
[Thu Nov 23 11:30:08 JST 2017]OAuth signature: rRwk9sTu2Mxq72PISdDWA6yZe+8=
[Thu Nov 23 11:30:08 JST 2017]Authorization: *************************************************************************************************************************************************************************************************************************************************************************************
[Thu Nov 23 11:30:08 JST 2017]X-Twitter-Client-Version: 4.0.4
[Thu Nov 23 11:30:08 JST 2017]X-Twitter-Client-URL: http://twitter4j.org/en/twitter4j-4.0.4.xml
[Thu Nov 23 11:30:08 JST 2017]X-Twitter-Client: Twitter4J
[Thu Nov 23 11:30:08 JST 2017]User-Agent: twitter4j http://twitter4j.org/ /4.0.4
[Thu Nov 23 11:30:08 JST 2017]Accept-Encoding: gzip
[Thu Nov 23 11:30:09 JST 2017]Response: 
[Thu Nov 23 11:30:09 JST 2017]date: Thu, 23 Nov 2017 02:30:05 GMT
[Thu Nov 23 11:30:09 JST 2017]HTTP/1.1 401 Authorization Required
[Thu Nov 23 11:30:09 JST 2017]server: tsa_m
[Thu Nov 23 11:30:09 JST 2017]content-length: 91
[Thu Nov 23 11:30:09 JST 2017]expires: Tue, 31 Mar 1981 05:00:00 GMT
[Thu Nov 23 11:30:09 JST 2017]x-response-time: 116
[Thu Nov 23 11:30:09 JST 2017]x-frame-options: SAMEORIGIN
[Thu Nov 23 11:30:09 JST 2017]content-encoding: gzip
[Thu Nov 23 11:30:09 JST 2017]www-authenticate: OAuth realm="https://api.twitter.com"
[Thu Nov 23 11:30:09 JST 2017]x-transaction: 00b0813e0082edee
[Thu Nov 23 11:30:09 JST 2017]set-cookie: guest_id=v1%3A151140420540420777; Expires=Sat, 23 Nov 2019 02:30:05 UTC; Path=/; Domain=.twitter.com
[Thu Nov 23 11:30:09 JST 2017]set-cookie: lang=en; Path=/
[Thu Nov 23 11:30:09 JST 2017]set-cookie: personalization_id="v1_U4iS7pz4p1dDOVcKOhFi6Q=="; Expires=Sat, 23 Nov 2019 02:30:05 UTC; Path=/; Domain=.twitter.com
[Thu Nov 23 11:30:09 JST 2017]last-modified: Thu, 23 Nov 2017 02:30:05 GMT
[Thu Nov 23 11:30:09 JST 2017]content-disposition: attachment; filename=json.json
[Thu Nov 23 11:30:09 JST 2017]x-connection-hash: 0a9bcdda532a3b410e39637eac18cd2c
[Thu Nov 23 11:30:09 JST 2017]x-twitter-response-tags: BouncerCompliant
[Thu Nov 23 11:30:09 JST 2017]content-type: application/json;charset=utf-8
[Thu Nov 23 11:30:09 JST 2017]cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
[Thu Nov 23 11:30:09 JST 2017]x-rate-limit-reset: 1511404314
[Thu Nov 23 11:30:09 JST 2017]x-rate-limit-remaining: 10
[Thu Nov 23 11:30:09 JST 2017]x-rate-limit-limit: 15
[Thu Nov 23 11:30:09 JST 2017]strict-transport-security: max-age=631138519
[Thu Nov 23 11:30:09 JST 2017]pragma: no-cache
[Thu Nov 23 11:30:09 JST 2017]x-xss-protection: 1; mode=block
[Thu Nov 23 11:30:09 JST 2017]x-content-type-options: nosniff
[Thu Nov 23 11:30:09 JST 2017]x-access-level: read-write
[Thu Nov 23 11:30:09 JST 2017]status: 401 Unauthorized
[Thu Nov 23 11:30:09 JST 2017]{"request":"\/1.1\/followers\/ids.json","error":"Not authorized."}


このTwitterAPIとのやり取りが解読できればエラーの理由もわかるかもしれませんが, 私には無理でした.
もし, 分かる方がいればお願いします.

11/23 16:12 追記
上記のエラーが発生したのちに, try-catch文がTwitterExceptionを拾い、Thead.sleepが作動します.
Ratelimitに達していないのに, int secondsUntilResetは900などの値を示します.
また, 300秒毎に再度アクセスをかけるプログラムになっているのですが, アクセスするたびにratelimitは減ってゆくのですが, 0になると再び900などの値を示し先に進みません.
これは, プログラムの問題でしょうか?若しくは何らかのバグでしょうか?
下記に正しく動作した場合のプログラムを載せておきます.

[Fri Nov 24 01:31:03 JST 2017]Request: 
[Fri Nov 24 01:31:03 JST 2017]GET https://api.twitter.com/1.1/followers/ids.json?user_id=-ユーザID-&cursor=-1&include_entities=true
[Fri Nov 24 01:31:03 JST 2017]OAuth base string: GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffollowers%2Fids.json&cursor%3D-1%26include_entities%3Dtrue%26oauth_consumer_key%3DxzjaN0negq9ByNRNDPTBd5PdY%26oauth_nonce%3D634127985%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1511454663%26oauth_token%3D741300256676024320-IKc9eCnlZez8CJS6UTdQqxewcUgieK3%26oauth_version%3D1.0%26user_id%3D2911831459
[Fri Nov 24 01:31:03 JST 2017]OAuth signature: RDQg99FVqs2jYVgbpxmJ6Uvy/Z0=
[Fri Nov 24 01:31:03 JST 2017]Authorization: ************************************************************************************************************************************************************************************************************************************************************************************
[Fri Nov 24 01:31:03 JST 2017]X-Twitter-Client-Version: 4.0.4
[Fri Nov 24 01:31:03 JST 2017]X-Twitter-Client-URL: http://twitter4j.org/en/twitter4j-4.0.4.xml
[Fri Nov 24 01:31:03 JST 2017]X-Twitter-Client: Twitter4J
[Fri Nov 24 01:31:03 JST 2017]User-Agent: twitter4j http://twitter4j.org/ /4.0.4
[Fri Nov 24 01:31:03 JST 2017]Accept-Encoding: gzip
[Fri Nov 24 01:31:03 JST 2017]Response: 
[Fri Nov 24 01:31:03 JST 2017]date: Thu, 23 Nov 2017 16:31:05 GMT
[Fri Nov 24 01:31:03 JST 2017]HTTP/1.1 200 OK
[Fri Nov 24 01:31:03 JST 2017]server: tsa_m
[Fri Nov 24 01:31:03 JST 2017]content-length: 746
[Fri Nov 24 01:31:03 JST 2017]expires: Tue, 31 Mar 1981 05:00:00 GMT
[Fri Nov 24 01:31:03 JST 2017]x-response-time: 124
[Fri Nov 24 01:31:03 JST 2017]x-frame-options: SAMEORIGIN
[Fri Nov 24 01:31:03 JST 2017]content-encoding: gzip
[Fri Nov 24 01:31:03 JST 2017]x-transaction: 00d330f3004c5da7
[Fri Nov 24 01:31:03 JST 2017]set-cookie: guest_id=v1%3A151145466537402736; Expires=Sat, 23 Nov 2019 16:31:05 UTC; Path=/; Domain=.twitter.com
[Fri Nov 24 01:31:03 JST 2017]set-cookie: lang=en; Path=/
[Fri Nov 24 01:31:03 JST 2017]set-cookie: personalization_id="v1_Y4oMyd9FFxSS6KB4R7KVUQ=="; Expires=Sat, 23 Nov 2019 16:31:05 UTC; Path=/; Domain=.twitter.com
[Fri Nov 24 01:31:03 JST 2017]last-modified: Thu, 23 Nov 2017 16:31:05 GMT
[Fri Nov 24 01:31:03 JST 2017]content-disposition: attachment; filename=json.json
[Fri Nov 24 01:31:03 JST 2017]x-connection-hash: fb685629160577d23db5b5d16e4e88aa
[Fri Nov 24 01:31:03 JST 2017]x-twitter-response-tags: BouncerCompliant
[Fri Nov 24 01:31:03 JST 2017]content-type: application/json;charset=utf-8
[Fri Nov 24 01:31:03 JST 2017]cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
[Fri Nov 24 01:31:03 JST 2017]x-rate-limit-reset: 1511455434
[Fri Nov 24 01:31:03 JST 2017]x-rate-limit-remaining: 12
[Fri Nov 24 01:31:03 JST 2017]x-rate-limit-limit: 15
[Fri Nov 24 01:31:03 JST 2017]strict-transport-security: max-age=631138519
[Fri Nov 24 01:31:03 JST 2017]pragma: no-cache
[Fri Nov 24 01:31:03 JST 2017]x-xss-protection: 1; mode=block
[Fri Nov 24 01:31:03 JST 2017]x-content-type-options: nosniff
[Fri Nov 24 01:31:03 JST 2017]x-access-level: read-write
[Fri Nov 24 01:31:03 JST 2017]status: 200 OK
[Fri Nov 24 01:31:03 JST 2017]{"ids":[-ID配列の表示-],"next_cursor":0,"next_cursor_str":"0","previous_cursor":0,"previous_cursor_str":"0"}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • asahina1979

    2017/11/24 01:22

    oauth_tokenのペアは指定されてるけど accerss_tokenのペアがないよなこれ

    キャンセル

  • ryo1729_k

    2017/11/24 01:27

    確かにないですね

    キャンセル

  • ryo1729_k

    2017/11/24 01:46

    バグったのと成功したのを見比べると、バグった方は17行目らへんに「[Thu Nov 23 11:30:09 JST 2017]www-authenticate: OAuth realm="https://api.twitter.com&quot;」ってのが追加されていますね。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Java

    10446questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSON

    775questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Twitter

    442questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。