簡體   English   中英

Android:使用OAuth和Twitter4J顯示公共Twitter時間軸

[英]Android: Display public Twitter timeline using OAuth and Twitter4J

因此,我嘗試使用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 );

如果您想從公共Twitter時間軸獲取信息,則可以使用“ 僅應用程序身份驗證” ,因為用戶不需要登錄,我認為它很適合您,因為您不使用管理員權限。

僅應用程序的身份驗證流程遵循以下步驟:

應用程序將其用戶密鑰和機密編碼為一組特殊編碼的憑據。

應用程序向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));
}

}

要獲取承載令牌,請在Main 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中的完整示例

希望能幫助到你!

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM