gpt4 book ai didi

java - twitter 应用程序仅认证 java android 与 twitter4j

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:42 26 4
gpt4 key购买 nike

我正在尝试使用 oauth2(用于仅限应用程序的身份验证)从 Twitter 获取用户时间线,但结果始终为空。我没有使用 OAUTH 的经验,我看过一些教程和示例,但到目前为止还没有成功。 我需要在用户无需登录的情况下检索特定用户的时间线(在此示例中为 Twitter)。

我有一个使用 twitter API 1 的应用程序,我尝试使用 oauth2 使我的现有代码适应新的 API 1.1 以进行仅应用程序身份验证。所以代码应该可以工作,除非它没有从 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?如果有人有 twitter4j 的 oauth2 的一些示例代码或教程,将不胜感激

最佳答案

经过漫长的一天寻找问题,我找到了解决方案。我仍然不确定这是否会同时适用于多个用户。但是当我测试它时,我从我指定的用户那里得到了最后的推文。

我删除了 connecttwitter 函数,并在我的异步任务的 DoInBackground 中声明了 Twitter 对象。要获得 Oauth2 身份验证,您需要获得不记名 token 。这是由您的消费者 key 和 secret 制成的(因此必须在您的 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");

关于java - twitter 应用程序仅认证 java android 与 twitter4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com