Android 如何使用Twitter4j获得没有用户身份验证的Twitter公共时间线?
我已经编写了一些代码,允许用户登录到他的Twitter帐户,并使用Twitter4j和以下工具发送Tweet 现在,我还可以使用Android 如何使用Twitter4j获得没有用户身份验证的Twitter公共时间线?,android,twitter4j,Android,Twitter4j,我已经编写了一些代码,允许用户登录到他的Twitter帐户,并使用Twitter4j和以下工具发送Tweet 现在,我还可以使用 ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setHttpConnectionTimeout(10000) .setHttpReadTimeout(10000) .setOAuthConsumerKey(Config.TWITTER_CONSUMER_KEY) .setOAuthConsumerSe
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setHttpConnectionTimeout(10000)
.setHttpReadTimeout(10000)
.setOAuthConsumerKey(Config.TWITTER_CONSUMER_KEY)
.setOAuthConsumerSecret(Config.TWITTER_CONSUMER_SECRET)
.setOAuthAccessToken(Utils.getPrefsString(getActivity(),
TwitterPrefsFragment.PREF_KEY_OAUTH_TOKEN, "")) // empty if not authentified
.setOAuthAccessTokenSecret(Utils.getPrefsString(getActivity(),
TwitterPrefsFragment.PREF_KEY_OAUTH_SECRET, "")); // empty if not authentified
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
List<twitter4j.Status> statuses = twitter.getUserTimeline(SOME_PUBLIC_TWITTER_ACCOUNT, new Paging(1, 50));
ConfigurationBuilder cb=new ConfigurationBuilder();
cb.setHttpConnectionTimeout(10000)
.setHttpReadTimeout(10000)
.setOAuthConsumerKey(Config.TWITTER\u CONSUMER\u键)
.setOAuthConsumerCret(Config.TWITTER\u CONSUMER\u SECRET)
.setOAuthAccessToken(Utils.getPrefsString(getActivity()),
TwitterPrefsFragment.PREF_KEY_OAUTH_TOKEN,“”)//如果未进行身份验证,则为空
.setOAuthAccessTokenSecret(Utils.getPrefsString(getActivity()),
TwitterPrefsFragment.PREF_KEY_OAUTH_SECRET,”);//如果未进行身份验证,则为空
TwitterFactory tf=新的TwitterFactory(cb.build());
Twitter=tf.getInstance();
List status=twitter.getUserTimeline(一些公共twitter账户,新页面(1,50));
但这仅在用户经过身份验证且应用程序在首选项中具有oauth令牌和密码时有效
我如何获得没有访问令牌的Twitter公共时间线,即没有用户进行身份验证
编辑
我正在重新阐述我的问题,让它更清楚:
我设法用给定的代码验证了我的Twitter应用程序和一个用户
现在,如果用户未登录,如何获取公共时间线?在这种情况下,没有OAUTH_令牌
和OAUTH_密钥
,上面显示的请求不起作用,因为将空字符串设置为ConfigurationBuilder.setOAuthAccessToken
和ConfigurationBuilder.setOAuthAccessTokenSecret
那么,如果存在的话,获取公共时间线的请求是什么,没有OAUTH_令牌
和OAUTH_秘密
如何使用Twitter4j获取没有访问令牌和机密的Twitter公共时间线
哦,那很简单你不能
Twitter是一家基于数据的公司。公司99%的财产(我指的是公司拥有的)是数据。如果将这些数据免费提供给其他人/企业,则会适得其反
如果你想要的东西是可能的,那么有一种简单的方法来备份整个twitter数据库
这就是为什么他们允许您为每个应用程序注册一个帐户,该应用程序希望使用API,并将每个帐户限制为每个时间范围内一定数量的API调用。当然,他们也希望防止他们的网络收到垃圾邮件等。在您的情况下,您应该使用 要使用Twitter4J执行此操作,请尝试以下代码
ConfigurationBuilder cb = new ConfigurationBuilder();
cb
.setOAuthConsumerKey(<YOUR_CONSUMER_KEY>)
.setOAuthConsumerSecret(<YOUR_CONSUMER_SECRET>)
.setApplicationOnlyAuthEnabled(true); // IMPORTANT: set T4J to use App-only auth
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
OAuth2Token token = twitter.getOAuth2Token();
if (token != null) {
System.out.println("Token Type : " + token.getTokenType());
System.out.println("Access Token: " + token.getAccessToken());
}
ResponseList<Status> list = twitter.getUserTimeline(783214); // Load @twitter's timeline without user login.
ConfigurationBuilder cb=new ConfigurationBuilder();
cb
.setOAuthConsumerKey()
.setOAuthConsumerCret()
.setApplicationOnlyAuthEnabled(true);//重要提示:将T4J设置为仅使用应用程序身份验证
TwitterFactory tf=新的TwitterFactory(cb.build());
Twitter=tf.getInstance();
OAuth2Token token=twitter.getOAuth2Token();
if(令牌!=null){
System.out.println(“令牌类型:+Token.getTokenType());
System.out.println(“访问令牌:+Token.getAccessToken());
}
ResponseList=twitter.getUserTimeline(783214);//在没有用户登录的情况下加载@twitter的时间线。
上述示例代码的要点:
- 调用
以启用仅应用程序身份验证setApplicationOnlyAuthEnabled(true)
- 使用
而不是getOAuth2Token()
getOAuthAccessToken()
- 这当然是可能的,我已经尝试过了。如果您怀疑的只是访问令牌和访问令牌密钥为空,那么您应该尝试使用应用程序页面中提供的访问令牌。我所说的应用程序页面是指你注册twitter应用程序的链接
如果您转到dev.twitter.com并转到应用程序设置,您可以看到消费者密钥、消费者机密、访问令牌和访问令牌机密。利用这些,并遵循我下面的代码,它应该会工作
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("B*************Q")
.setOAuthConsumerSecret(
"l*************o")
.setOAuthAccessToken(
"1*************s")
.setOAuthAccessTokenSecret(
"s*************s");
TwitterFactory tf = new TwitterFactory(cb.build());
twitter = tf.getInstance();
try {
List<Status> statuses;
String user;
user = "Replace this with the screen name whose feeds you want to fetch";
statuses = twitter.getUserTimeline(user);
Log.i("Status Count", statuses.size() + " Feeds");
} catch (TwitterException te) {
te.printStackTrace();
}
ConfigurationBuilder cb=new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(“B**********************Q”)
.SetOAuthConsumerCret(
“l****************o”)
.setOAuthAccessToken(
“1*************s”)
.setOAuthAccessTokenSecret(
“s***************s”);
TwitterFactory tf=新的TwitterFactory(cb.build());
twitter=tf.getInstance();
试一试{
列出状态;
字符串用户;
user=“将其替换为要获取其提要的屏幕名称”;
status=twitter.getUserTimeline(用户);
Log.i(“Status Count”,Status.size()+“feed”);
}捕获(twitter异常){
te.printStackTrace();
}
为此,我使用了twitter4j3.03.jar 如果你想在没有用户验证的情况下获取推文,你可以使用,因为用户不需要登录 通过仅应用程序身份验证,Twitter为应用程序提供了代表应用程序本身(而不是代表特定用户)发出经过身份验证的请求的能力 仅应用程序身份验证流程遵循以下步骤: 应用程序将其使用者密钥和机密编码为一组经过特殊编码的凭据 应用程序向POST oauth2/令牌端点发出请求,以将这些凭据交换为承载令牌 当访问RESTAPI时,应用程序使用承载令牌进行身份验证 注意:因为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);