2

現在、Twitter を Android アプリケーションに統合する作業を行っています。ある程度うまく統合できました。ただしNo authentication challenges found、次のシナリオでは例外が発生します。

  1. 私はApp-only authentication(Twitterにログインせずに)Twitterからパブリックフィードを取得するために使用します。それらを正常にフェッチします。
  2. 返信、リツイート、またはお気に入りとしてマークしようとすると、ユーザーが既にログインしているかどうかを確認し、ログインしていない場合は、最初にログインしてから返信またはリツイートを行います。
  3. しかし、ログインのみを試みているときに上記の例外が発生するため、返信やリツイートに到達しません。

注:使用せずApp-only authenticationに (パブリック フィードをフェッチせずに) 直接ログインすることを選択した場合、問題なく動作し、ログインできます。

以下はスタックトレースです。

11-14 19:33:03.597: W/System.err(3305): No authentication challenges found
11-14 19:33:03.667: W/System.err(3305): Relevant discussions can be found on the Internet at:
11-14 19:33:03.667: W/System.err(3305):     http://www.google.co.jp/search?q=9ddbeb3a or
11-14 19:33:03.727: W/System.err(3305):     http://www.google.co.jp/search?q=937eec8d
11-14 19:33:03.747: W/System.err(3305): TwitterException{exceptionCode=[9ddbeb3a-937eec8d c8a7b39b-dc5ea0d9], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.4}
11-14 19:33:03.797: W/System.err(3305):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
11-14 19:33:03.857: W/System.err(3305):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
11-14 19:33:03.897: W/System.err(3305):     at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
11-14 19:33:03.957: W/System.err(3305):     at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:145)
11-14 19:33:04.097: W/System.err(3305):     at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:165)
11-14 19:33:04.107: W/System.err(3305):     at twitter4j.TwitterBaseImpl.getOAuthAccessToken(TwitterBaseImpl.java:381)

編集:

以下は、ユーザーがログインしているかどうかに基づいて構成を切り替えるために使用しているコードです。

private TwitterInstance(boolean withLoginConfig) {

        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder
                .setOAuthConsumerKey(STAConstants.TWITTER_CONSUMER_KEY);
        configurationBuilder
                .setOAuthConsumerSecret(STAConstants.TWITTER_CONSUMER_SECRET);
        // configuration required to fetch feeds without login.
        if (!withLoginConfig) {
            configurationBuilder.setUseSSL(true);
            // IMPORTANT: set T4J to use App-only authentication
            configurationBuilder.setApplicationOnlyAuthEnabled(true);
            configurationBuilder.setOAuth2TokenType(getOAuth2Token()
                    .getTokenType());
            configurationBuilder.setOAuth2AccessToken(getOAuth2Token()
                    .getAccessToken());
        }
        Configuration configuration = configurationBuilder.build();
        twitterFactory = new TwitterFactory(configuration);
        twitter = twitterFactory.getInstance();
        requestToken = null;
    }

SOや他のサイトでも解決策を探しましたが、何も得られませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

1

私はいくつかのことに取り組み、最終的に私の質問に対する答えを見つけました。したがって、ここに投稿します。

問題:認証チャレンジが見つかりません

理由 :ログイン後に送信AccessTokenおよび構成を行っていませんでした。AccessTokenSecretしたがって、認証データを取得していませんでした。

解決 :

ステップ 1: (Twitter にログインせずに)を使用App-only authenticationして、Twitter からパブリック フィードを取得します。それらを正常にフェッチします。このためBearerTokenに、次のように構成で使用します。

   ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
   configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
   configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);
   configurationBuilder.setUseSSL(true);
   // IMPORTANT: set T4J to use App-only authentication
   configurationBuilder.setApplicationOnlyAuthEnabled(true);
   configurationBuilder.setOAuth2TokenType(getOAuth2Token().getTokenType());
   configurationBuilder.setOAuth2AccessToken(getOAuth2Token().getAccessToken());

ステップ2:返信、リツイート、またはお気に入りとしてマークしようとすると、ユーザーがすでにログインしているかどうかを確認し、ログインしていない場合は、最初にログインしてから返信またはリツイートを行います. このために、次の構成を使用します。

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);

これによりRequestToken、次にAccessTokenandが得られますAccessTokenSecret

ステップ 3 :その後、問題なく後続のリクエストに次の構成を使用します。

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY);
configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET);
configurationBuilder.setOAuthAccessToken(getAccessToken()); // from sharedPreferences
configurationBuilder.setOAuthAccessTokenSecret(getAccessTokenSecret()); // from sharedPreferences                           
于 2013-11-29T09:31:43.627 に答える
0

その後、 twitter api認証のバージョン 1.1 は、すべての api 呼び出しに必須であり、公開ツイートの取得や検索でも..そのため、資格情報を強制的に追加する必要があります。

 AccessToken accessToken = new AccessToken("ACCESS_TOKEN","TOKEN_SECRET");
 twitter.setOAuthAccessToken(accessToken);

完全なコードは次のようになります。

        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder
                .setOAuthConsumerKey(STAConstants.TWITTER_CONSUMER_KEY);
        configurationBuilder
                .setOAuthConsumerSecret(STAConstants.TWITTER_CONSUMER_SECRET);
        Configuration configuration = configurationBuilder.build();
        TwitterFactory twitterFactory = new TwitterFactory(configuration);
        Twitter twitter = twitterFactory.getInstance();
        AccessToken accessToken = new AccessToken("ACCESS_TOKEN","TOKEN_SECRET");
        twitter.setOAuthAccessToken(accessToken);
        System.out.println(twitter.getUserTimeline("twitter"));
于 2013-11-16T11:17:18.533 に答える