使用twitter4j的java android的仅twitter应用程序身份验证
我试图使用oauth2从twitter获取用户时间线(仅用于应用程序身份验证),但结果总是空的。我没有OAUTH方面的经验,我也看过一些教程和示例,但到目前为止运气不佳我需要检索特定用户的时间线(在本例中为Twitter),而无需用户登录。 我有一个使用TwitterAPI1的应用程序,我尝试将现有代码调整为新的API1.1,并使用oauth2进行仅应用程序身份验证。所以代码应该可以工作,除非它没有从Twitter上得到任何回报。如果我得到一个结果,那么它应该会再次工作 与Twitter的连接是在异步操作下面的函数twitterconnect中建立的 这是我的密码:使用twitter4j的java android的仅twitter应用程序身份验证,java,android,twitter-oauth,twitter4j,Java,Android,Twitter Oauth,Twitter4j,我试图使用oauth2从twitter获取用户时间线(仅用于应用程序身份验证),但结果总是空的。我没有OAUTH方面的经验,我也看过一些教程和示例,但到目前为止运气不佳我需要检索特定用户的时间线(在本例中为Twitter),而无需用户登录。 我有一个使用TwitterAPI1的应用程序,我尝试将现有代码调整为新的API1.1,并使用oauth2进行仅应用程序身份验证。所以代码应该可以工作,除非它没有从Twitter上得到任何回报。如果我得到一个结果,那么它应该会再次工作 与Twitter的连接是
public class TwitterActivity extends Activity {
private ConfigurationBuilder builder;
// twitter consumer key and secret
static String TWITTER_CONSUMER_KEY = "**************";
static String TWITTER_CONSUMER_SECRET = "*************";
// twitter acces token and accestokensecret
static String TWITTER_ACCES_TOKEN = "************";
static String TWITTER_ACCES_TOKEN_SECRET = "************";
ArrayList<Tweet> tweets = new ArrayList<Tweet>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.twitter);
new AsyncOp().execute("test");
}
//Async class...
public class AsyncOp extends AsyncTask<String, Void,List<twitter4j.Status>> {
protected List<twitter4j.Status> doInBackground(String... urls) {
//auth with twitter
List<twitter4j.Status> statuses = null;
try {
Twitter twitter=twitterConnect();
statuses = twitter.getUserTimeline("Twitter");
return statuses;
} catch (Exception ex) {
Log.d("Main.displayTimeline", "" + ex.getMessage());
}
return statuses;
}
protected void onPostExecute(List<twitter4j.Status> statuses) {
try {
String TWITTER="EEE MMM dd HH:mm:ss ZZZZZ yyyy"; SimpleDateFormat sf=new
SimpleDateFormat(TWITTER, Locale.ENGLISH); sf.setLenient(true);
for(int i=0;i<statuses.size();i++){
twitter4j.Status stat = statuses.get(i);
User user=stat.getUser();
Date datePosted=stat.getCreatedAt();
String text=stat.getText();
String name=user.getName();
String profile_image_url=user.getProfileImageURL();
Tweet t =new Tweet(datePosted,text,name,profile_image_url,twitterHumanFriendlyDate(datePosted));
tweets.add(t);
// logcat info
Log.i("date",datePosted.toString());
Log.i("text",text);
Log.i("user",name);
Log.i("userprofilepic",profile_image_url);
Log.i("timeofpost",twitterHumanFriendlyDate(datePosted));
}
ListView listView = (ListView) findViewById(R.id.ListViewId);
listView.setAdapter(new UserItemAdapter(TwitterActivity.this,
R.layout.listitem, tweets));
ProgressBar bar=(ProgressBar) findViewById(R.id.progressBar1);
bar.setVisibility(View.GONE);
} catch
(Exception e) { e.printStackTrace(); } }
}
public class UserItemAdapter extends ArrayAdapter<Tweet> {
private ArrayList<Tweet> tweets;
public UserItemAdapter(Context context, int textViewResourceId,
ArrayList<Tweet> tweets) {
super(context, textViewResourceId, tweets);
this.tweets = tweets;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listitem, null);
}
Tweet tweet = tweets.get(position);
if (tweet != null) {
TextView username = (TextView) v.findViewById(R.id.username);
TextView message = (TextView) v.findViewById(R.id.message);
ImageView image = (ImageView) v.findViewById(R.id.avatar);
TextView date = (TextView) v.findViewById(R.id.date);
if (username != null) {
username.setText(tweet.username);
}
if (message != null) {
message.setText(tweet.message);
}
if (image != null) {
image.setImageBitmap(getBitmap(tweet.image_url));
}
if (date != null) {
date.setText(tweet.hfdate);
}
}
return v;
}
}
public Bitmap getBitmap(String bitmapUrl) {
try {
URL url = new URL(bitmapUrl);
return BitmapFactory.decodeStream(url.openConnection()
.getInputStream());
} catch (Exception ex) {
return null;
}
}
// build twitter
public Twitter twitterConnect() throws Exception
{
// setup
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY).setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
OAuth2Token token = new TwitterFactory(builder.build()).getInstance().getOAuth2Token();
// exercise & verify
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setUseSSL(true);
cb.setApplicationOnlyAuthEnabled(true);
Twitter twitter = new TwitterFactory(cb.build()).getInstance();
twitter.setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
twitter.setOAuth2Token(token);
return twitter;
}
public String twitterHumanFriendlyDate(Date dateCreated) {
// parse Twitter date
SimpleDateFormat dateFormat = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss ZZZZZ yyyy", Locale.ENGLISH);
dateFormat.setLenient(false);
Date created = dateCreated;
// today
Date today = new Date();
// how much time since (ms)
Long duration = today.getTime() - created.getTime();
long second = 1000;
long minute = second * 60;
long hour = minute * 60;
long day = hour * 24;
if (duration < second * 7) {
return "right now";
}
if (duration < minute) {
int n = (int) Math.floor(duration / second);
return n + " seconds ago";
}
if (duration < minute * 2) {
return "about 1 minute ago";
}
if (duration < hour) {
int n = (int) Math.floor(duration / minute);
return n + " minutes ago";
}
if (duration < hour * 2) {
return "about 1 hour ago";
}
if (duration < day) {
int n = (int) Math.floor(duration / hour);
return n + " hours ago";
}
if (duration > day && duration < day * 2) {
return "yesterday";
}
if (duration < day * 365) {
int n = (int) Math.floor(duration / day);
return n + " days ago";
} else {
return "over a year ago";
}
}
公共类TwitterActivity扩展活动{
私有配置生成器;
//twitter用户密钥和密码
静态字符串TWITTER_CONSUMER_KEY=“****************”;
静态字符串TWITTER_CONSUMER_SECRET=“****************”;
//twitter访问令牌和accestokensecret
静态字符串TWITTER_ACCES_TOKEN=“****************”;
静态字符串TWITTER_access_TOKEN_SECRET=“*************”;
ArrayList tweets=新建ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.twitter);
新建AsyncOp()。执行(“测试”);
}
//异步类。。。
公共类AsyncOp扩展了AsyncTask{
受保护列表doInBackground(字符串…URL){
//使用twitter进行身份验证
列表状态=空;
试一试{
Twitter=twitterConnect();
status=twitter.getUserTimeline(“twitter”);
返回状态;
}捕获(例外情况除外){
Log.d(“Main.displayTimeline”,“ex.getMessage());
}
返回状态;
}
受保护的void onPostExecute(列表状态){
试一试{
String TWITTER=“EEE-MMM-dd-HH:mm:ss-ZZZZZ-yyyy”SimpleDateFormat sf=new
SimpleDataFormat(TWITTER,Locale.ENGLISH);sf.setLenient(true);
对于(int i=0;i天和持续时间<天*2){
返回“昨天”;
}
如果(持续时间<天*365){
int n=(int)数学楼层(持续时间/天);
返回n+“天以前”;
}否则{
返回“一年多以前”;
}
}
}
我的问题是oauth方法还是getusertimeline?
如果有人有一些使用twitter4j的oauth2示例代码或教程,我将不胜感激。经过一天的搜索,我找到了一个解决方案。我仍然不确定这是否能同时适用于多个用户。但当我测试它时,我从我指定的用户那里得到了最后一条推文 我删除了connecttwitter函数,并在我的asynctask的DoInBackground中声明了Twitter对象。要获得Oauth2身份验证,您需要获得一个承载令牌。这是由您的消费者密钥和密码(因此必须在您的Twitter对象上设置)生成的。以下是更改的代码(代码从我的connecttwitter到异步任务的doinbackground)进行了一些修改
ConfigurationBuilder builder=new ConfigurationBuilder();
builder.setUseSSL(true);
builder.setApplicationOnlyAuthEnabled(true);
// setup
Twitter twitter = new TwitterFactory(builder.build()).getInstance();
// exercise & verify
twitter.setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
// OAuth2Token token = twitter.getOAuth2Token();
twitter.getOAuth2Token();
statuses = twitter.getUserTimeline("Twitter");
也许这个会对你有所帮助。检查这里:我在这方面有很多问题,所以我想我会按照人们在上面的评论中的要求详细说明 有几种方法可以加载Twitter4j的相应设置,使其仅作为应用程序运行 以下是步骤: 1)在项目根目录中创建一个属性文件,文件名为
twitter4j.properties
。如果是我,我会把它放在/resources
控制器中,但不管怎样
2)在twitter4j.properties
文件中放置如下内容:
debug=true
enableApplicationOnlyAuth=true
http.useSSL=true
oauth.consumerKey=[consumer key here]
oauth.consumerSecret=[consumer secret here]
注意:SSL和enableApplicationOnlyAuth
非常重要!如果您尚未获得消费者密钥/密码,则可以在其他地方遵循指南,但您可以通过在此处注册应用程序获得()
3)下载twitter4j并将jar包含在项目中-
4)这是一个完整的解决方案-注意,这需要传入一个搜索参数,例如#Toyota
。或者您可以硬编码-Query Query=new Query(#Toyota”)
package-twitter测试;
导入java.io.IOException;
导入java.util.List;
导入twitter4j.Query;
导入twitter4j.QueryResult;
导入twitter4j.状态;
导入twitter4j.Twitter;
导入twitter4j.TwitterException;
导入twitter4j.TwitterFactory;
导入twitter4j.auth.OAuth2Token;
/**
*
*@那家伙
*/
公共类twitter测试{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)引发IOException、TwitterException{
如果(参数长度<1){
System.out.println(“JavaTwitter4j.examples.search.SearchTweets[query]”;
系统退出(-1);
}
Twitter=new TwitterFactory().getInstance();
getOAuth2Token();
试一试{
查询=新查询(参数[0]);
查询结果;
做{
结果=twitter.search(查询);
List tweets=result.getTweets();
用于(状态推文:推文){
System.out.println(“@”+tweet.getUser().getScreenName()+”-“+tweet.getText());
}
}while((query=result.nextQuery())!=null);
系统出口(0);
}捕获(twitter异常){
te.printStackTrace();
System.out.println(“未能搜索tweets:+te.getMessage());
系统退出(-1);
}
}
}
在你建立它之后,你会看到所有的tweet批量输出到你的控制台。我希望这能帮助别人,并提供一个简洁的解决方案,从你好,你能给我完整的工作代码“获取twitter提要”吗
package twittertest;
import java.io.IOException;
import java.util.List;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.OAuth2Token;
/**
*
* @author That Guy
*/
public class TwitterTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException, TwitterException {
if (args.length < 1) {
System.out.println("java twitter4j.examples.search.SearchTweets [query]");
System.exit(-1);
}
Twitter twitter = new TwitterFactory().getInstance();
twitter.getOAuth2Token();
try {
Query query = new Query(args[0]);
QueryResult result;
do {
result = twitter.search(query);
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText());
}
} while ((query = result.nextQuery()) != null);
System.exit(0);
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
System.exit(-1);
}
}
}