Android:使用OAuth和Twitter4J显示公共Twitter时间轴

时间:2013-09-03 03:36:56

标签: android oauth twitter4j

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

我确实在Twitter上创建了一个开发者帐户,并获得了一个消费者密钥和令牌,以及一个访问令牌和密码。这些值暂时保存在一组私有静态字符串中。 TWITTER_ZOO_ID是一个私人长片,其中包含我想要显示的Feed的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 );

2 个答案:

答案 0 :(得分: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

中的完整示例

希望它有所帮助!

答案 1 :(得分:0)

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

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