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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

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

Java

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

Twitter

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

Q&A

0回答

1968閲覧

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

ryo1729_k

総合スコア7

JSON

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

Java

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

Twitter

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

0グッド

0クリップ

投稿2017/11/23 03:08

編集2022/01/12 10:55

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

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

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

java

1public static List<Long> Followers_from_ID(Twitter twitter, Long Id_Num) throws TwitterException{ 2 3 List<Long> m_FollowersList = new ArrayList<Long>(); 4 5 long cursor = -1; 6 //int count = 0; 7 while(true) { 8 IDs ids = null; 9 try { 10 //IDs ids = twitter.getFollowersIDs(user.getId(), cursor); 11 ids = twitter.getFollowersIDs(Id_Num, cursor); 12 } catch(TwitterException twitterException){ 13 // Rate Limit に引っかかった場合の処理 14 // (メモ) status code も併せてチェックすべきか?! 15 16 RateLimitStatus rateLimit = twitterException.getRateLimitStatus(); 17 int secondsUntilReset = rateLimit.getSecondsUntilReset(); 18 System.err.println("please wait for " + secondsUntilReset + " seconds"); 19 //System.err.println("Reset Time : " + rateLimit.getResetTime()); 20 21 //(注) 120秒間,水増し・・getSecondsUntilReset() の返す値が負の 22 //場合があり,それに対応するため 23 // long waitTime = (long)(secondsUntilReset + 120) * 1000; 24 long waitTime = (long)(300 * 1000); // 300秒待ち 25 try { 26 Thread.sleep(waitTime); 27 } catch(Exception e){ 28 e.printStackTrace(); 29 } 30 31 continue; 32 } catch(Exception e){ 33 e.printStackTrace(); 34 } 35 36 long[] idArray = ids.getIDs(); //受け取ったフォロワー配列をidArrayに代入 37 for(int i = 0; i < idArray.length; i++){ 38 //System.out.println("["+(++count)+"]" + idArray[i]); 39 m_FollowersList.add(new Long(idArray[i])); //リストにフォロワーを追加 40 } 41 42 if(ids.hasNext()){ 43 cursor = ids.getNextCursor(); 44 } else { 45 break; 46 } 47 } 48 49 Remove_LockedID(m_FollowersList); 50 51 return m_FollowersList; 52 } 53 54 //リストに格納されたIDを公開垢のみに加工. 55 private static List<Long> Remove_LockedID(List<Long> ID){ 56 57 List<Long> IDs = new ArrayList<Long>(); 58 59 for(int i = 0;i<ID.size();i++){ 60 if(ID.get(i) >= 100000000L && ID.get(i)<= 999999999L){ 61 IDs.add(ID.get(i)); 62 } 63 } 64 65 return IDs; 66 } 67 68

上記のプログラムを実行した際に, 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"}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/23 15:56

認証されてない場合に負の数をかえしてるんじゃないのかしら。
退会済みユーザー

退会済みユーザー

2017/11/23 15:57

900(秒)なのはシステム全体共通でユーザーごとっじゃないです。
ryo1729_k

2017/11/23 16:20

返信ありがとうございます。 認証されていないと, 自動的にエラーが表示されて900秒待たされるみたいですね...
ryo1729_k

2017/11/23 16:20

認証されない理由ってなんとなく予想できたりしますか??
退会済みユーザー

退会済みユーザー

2017/11/23 16:21

secondsUntilReset の値だったら twitter4j が独自で計算している値ですな。 APIじゃないし・・
退会済みユーザー

退会済みユーザー

2017/11/23 16:22

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

2017/11/23 16:27

確かにないですね
ryo1729_k

2017/11/23 16:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問