我试图从oauth2(仅针对应用程序的身份验证)从twitter获取用户时间轴,但结果始终为空.我没有OAUTH的经验,我已经看了几个教程和例子,但迄今没有运气.我需要在没有用户需要登录的情况下检索特定的用户时间表(在本例中为Twitter).
我有一个应用程序使用twitter API 1,我试图使我的现有代码适应新的API 1.1与oauth2应用程序唯一auth.所以代码应该工作,除了它没有从Twitter收到任何东西.如果我得到一个结果,那么它应该再次工作.
与Twitter的连接在asyncop下的函数twitterconnect中进行.
这是我的代码:
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"; } }
}
我的问题是否是oauth方法?或者说getusertimeline?
如果任何人有一些示例代码或教程oauth2与twitter4j,将不胜感激
解决方法
经过漫长的一天寻找问题,我找到了一个解决方案.我仍然不确定这可以为多个用户同时工作.但是当我测试它,我得到了我指定的用户的最后一个tweet.
我删除了connecttwitter功能,并在DoInBackground中声明了我的asynctask的Twitter对象.要获得Oauth2身份验证,您需要获取一个承载令牌.这是由您的消费者密钥和秘密(所以这个HAS设置在您的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");