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