0

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

我确实在 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 );
4

2 回答 2

1

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

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

应用程序将其消费者密钥和秘密编码为一组经过特殊编码的凭据。

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

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

因为 twitter4j 最近添加了这个功能,所以你应该使用最后一个快照库

一个使用它的例子:

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 线程之外执行以避免网络异常,使用 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);

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

以及twitter4j github中的完整示例

希望能帮助到你!

于 2013-09-17T11:08:18.540 回答
0

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

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

于 2016-01-10T19:37:20.947 回答