【问题标题】:Android: Display public Twitter timeline using OAuth and Twitter4JAndroid:使用 OAuth 和 Twitter4J 显示公共 Twitter 时间线
【发布时间】:2013-09-06 04:20:22
【问题描述】:

所以我正在尝试使用 Android 中的 Twitter4J 库从公共 Twitter 时间线(不是我自己的 Twitter 时间线或我有权访问的任何东西,只是来自本地组织的公共时间线)获取状态对象列表Studio,但我对文档感到有些困惑。我遇到了这个错误:“无效的访问令牌格式。”

我确实在 Twitter 上创建了一个开发者帐户,并获得了消费者密钥和令牌,以及访问令牌和密码。这些值暂时保存在一组私有静态字符串中。 TWITTER_ZOO_ID 是一个私人长的,带有我要显示的提要的 Twitter ID 号。这是我目前拥有的适用代码:

    Twitter twitter;
    List<Status> statuses = null;
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
            .setOAuthConsumerKey( TWITTER_CONSUMER_KEY )
            .setOAuthConsumerSecret( TWITTER_CONSUMER_SECRET )
            .setOAuthAccessToken( TWITTER_AUTH_TOKEN )
            .setOAuthAccessTokenSecret( TWITTER_AUTH_TOKEN_SECRET );
    try {
        TwitterFactory tf = new TwitterFactory(cb.build());
        twitter = tf.getInstance();
        twitter.setOAuthConsumer( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET );
        statuses = twitter.getUserTimeline( TWITTER_ZOO_ID );
    }
    catch( TwitterException e ) {
        Log.e( "TwitterListFragment", "Twitter Exception" );
        return;
    }

    for( Status status : statuses )
        mAdapter.add( status );

如果有人有一个使用 Twitter4J 的 Twitter 1.1 的好示例的链接,或者可以提供如何获取这些状态的示例,我将不胜感激。我目前正在使用 Android Studio,并在 MavenCentral 的 Gradle 中包含 Twitter4J。

谢谢!

编辑:

经过进一步阅读,我添加了这个附加代码但没有成功:

twitter.setOAuthConsumer( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET );
AccessToken token = new AccessToken( TWITTER_AUTH_TOKEN, TWITTER_AUTH_TOKEN_SECRET );
twitter.setOAuthAccessToken( token );

【问题讨论】:

    标签: android oauth twitter4j


    【解决方案1】:

    如果您想从公共 Twitter 时间线获取信息,可以使用 Application-only Authentication,因为用户不需要登录,我认为它适合您,因为您不使用管理员权限。

    仅限应用程序的身份验证流程遵循以下步骤:

    一个应用程序将它的消费者密钥和秘密编码成一个特殊的 编码的凭据集。

    应用程序向 POST 发出请求 oauth2/token 端点将这些凭据交换为不记名令牌。

    在访问 REST API 时,应用程序使用不记名令牌进行身份验证。

    因为twitter4j最近加入了这个功能,所以你应该使用最后一个snapshot library。

    一个使用它的例子:

    private ConfigurationBuilder    builder;
    private Twitter                 twitter;
    private TwitterFactory          factory;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.init_act_layout);
    
        // setup
        builder = new ConfigurationBuilder();
        builder.setUseSSL(true);
        builder.setApplicationOnlyAuthEnabled(true);
        builder.setOAuthConsumerKey(Constants.CONSUMER_KEY);
        builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET);
    
        Configuration configuration = builder.build();
        factory = new TwitterFactory(configuration);
        ((MyApp) (MyApp.getApp())).setTFactory(factory);
    
        if (isNeededTwitterAuth()) {
            twitter = factory.getInstance();
                //Get the token async and save it
        }
    
            //Search tweets
    
    }
    
    /*
     * Checks if twitter access token is already saved in preferences
     * 
     * @return true if auth needed
     */
    private boolean isNeededTwitterAuth() {
        SharedPreferences settings = getSharedPreferences(Constants.TWITTER_PREFERENCES, Context.MODE_PRIVATE);
        String twitterAccesToken = settings.getString("bearerAccessToken", "");
        String twitterTokenType = settings.getString("bearerTokenType", "");
        return ((twitterAccesToken.length() == 0) && (twitterTokenType.length() == 0));
    }
    
    }
    

    要获取不记名令牌,请在主 UI 线程之外执行,以避免网络异常,f.i.使用 AsyncTask:

    @Override
        protected OAuth2Token doInBackground(Void... params) {
            OAuth2Token bearerToken = null;
    
            try {
                bearerToken = twitter.getOAuth2Token();
            } catch (TwitterException e) {
                e.printStackTrace();
            }
            return bearerToken;
        }
    

    获得不记名令牌后,保存:

    SharedPreferences appSettings = getSharedPreferences(Constants.TWITTER_PREFERENCES, MODE_PRIVATE);
                SharedPreferences.Editor prefEditor = appSettings.edit();
                prefEditor.putString("bearerAccessToken", result.getAccessToken());
                prefEditor.putString("bearerTokenType", result.getTokenType());
                prefEditor.commit();
    

    并使用不记名令牌:

    OAuth2Token bearerToken = new OAuth2Token(bearerTokenType, bearerAccesstoken);
    
            twitter.setOAuth2Token(bearerToken);
    

    然后搜索推文(总是在主线程之外):

    @Override
     protected QueryResult doInBackground(Void... params) {
    
     twitter.setOAuth2Token(bearerToken);
     Query query = new Query();
     [...]
     result = twitter.search(query);
    

    blog 中的完整解释(西班牙语...)

    还有一个完整的例子在twitter4j github

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      我建议使用最近更新的 Twitter SDK (Fabric)。

      https://docs.fabric.io/android/twitter/twitter.html

      【讨论】:

      • 是的,我用过这个。这个问题来自两年多前:)
      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2011-04-01
      • 2014-09-06
      相关资源
      最近更新 更多