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

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

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

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

Java

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

Twitter

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

受付中

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

ryo1729_k
ryo1729_k

総合スコア7

JSON

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

Java

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

Twitter

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

0回答

0リアクション

0クリップ

1624閲覧

投稿2017/11/23 03:08

編集2017/11/23 16:33

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

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

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

java

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

asahina1979

2017/11/23 15:56

認証されてない場合に負の数をかえしてるんじゃないのかしら。
asahina1979

2017/11/23 15:57

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

2017/11/23 16:20

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

2017/11/23 16:20

認証されない理由ってなんとなく予想できたりしますか??
asahina1979

2017/11/23 16:21

secondsUntilReset の値だったら twitter4j が独自で計算している値ですな。 APIじゃないし・・
asahina1979

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"」ってのが追加されていますね。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

JSON

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

Java

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

Twitter

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