使用 Twitter Fabric 获取 403 forbidden user_timeline
Getting 403 forbidden when using Twitter Fabric to get user_timeline
我一直在尝试实现 Fabric 以从用户那里获取 5 条最新推文的列表。它工作了几个小时,然后就停止工作了。我想在没有用户登录的情况下执行此操作,据我所知 API 允许访客登录阅读推文,但这可能对速率限制有更大的影响?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Twitter(authConfig), new Crashlytics());
TwitterCore.getInstance().logInGuest(new Callback() {
@Override
public void success(Result result) {
AppSession session = (AppSession) result.data;
getTweets();
}
@Override
public void failure(TwitterException exception) {
// unable to get an AppSession with guest auth
}
});
}
public void getTweets() {
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();
StatusesService statusesService = twitterApiClient.getStatusesService();
statusesService.userTimeline([USERID], null, 5, null, null, null, true, null, false, new Callback<List<Tweet>>() {
@Override
public void success(Result <List<Tweet>> result) {
for(Tweet Tweet : result.data) {
tweetList.add(Tweet.text);
}
createListView();
}
public void failure(TwitterException exception) {
Log.e("Failure", exception.toString());
exception.printStackTrace();
}
});
}
当我没有收到 403 时,一切正常,我的列表得到填充。
现在,完全有可能是我的代码出了点问题,导致我的速率限制被列入黑名单?否则;我是否需要让用户登录才能向他们显示 5 条推文?或者我应该实施某种服务器端缓存?
感谢任何 tips/help.
我想我可能已经弄明白了。看起来您必须从 logInGuest 回调中的成功方法保存会话,然后将其传递给 getApiClient。到目前为止,这是一些对我有用的代码:
private TweetViewFetchAdapter adapter;
...
adapter = new TweetViewFetchAdapter<CompactTweetView>(getActivity());
...
TwitterCore.getInstance().logInGuest( new Callback<AppSession>() {
@Override
public void success(Result<AppSession> appSessionResult) {
AppSession session = appSessionResult.data;
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient(session);
twitterApiClient.getStatusesService().userTimeline(null, "RadioOkinawa864", 10, null, null, false, false, false, true, new Callback<List<Tweet>>() {
@Override
public void success(Result<List<Tweet>> listResult) {
adapter.setTweets(listResult.data);
}
@Override
public void failure(TwitterException e) {
Toast.makeText(getActivity().getApplicationContext(), "Could not retrieve tweets", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
}
@Override
public void failure(TwitterException e) {
Toast.makeText(getActivity().getApplicationContext(), "Could not get guest Twitter session", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
使用 logInGuest
时,请注意访客 AppSession 将在一段时间后过期。您的应用程序必须处理过期 TwitterExceptions 并请求另一个访客 AppSession。例如,
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient(guestAppSession);
twitterApiClient.getSearchService().tweets("#fabric", null, null, null, null, 50, null, null, null, true, new Callback<Search>() {
@Override
public void success(Result<Search> result) {
// use result tweets
}
@Override
public void failure(TwitterException exception) {
final TwitterApiException apiException = (TwitterApiException) exception;
final int errorCode = apiException.getErrorCode();
if (errorCode == TwitterApiConstants.Errors.APP_AUTH_ERROR_CODE || errorCode == TwitterApiConstants.Errors.GUEST_AUTH_ERROR_CODE) {
// request new guest AppSession (i.e. logInGuest)
// optionally retry
}
}
});
请注意,AppSession 只能用于发出 API 不需要用户上下文的请求。例如,您 不能 使用 AppSession
推文。您可以 获取用户 public 条推文的时间表。参见 TwitterKit Android REST API docs。
最后,如果您使用来自 Twitter 套件组的 TweetUi 套件的 TweetUtils.loadTweet
或 TweetUtils.loadTweets
助手,设置来宾身份验证和处理过期是自动执行的,您不需要调用 logInGuest你自己。
在我的例子中,api 返回 403 forbidden 并显示以下消息 Your app may not allow guest auth. Please talk to us regarding upgrading your consumer key.
请确保您的状态不同。
我一直在尝试实现 Fabric 以从用户那里获取 5 条最新推文的列表。它工作了几个小时,然后就停止工作了。我想在没有用户登录的情况下执行此操作,据我所知 API 允许访客登录阅读推文,但这可能对速率限制有更大的影响?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Twitter(authConfig), new Crashlytics());
TwitterCore.getInstance().logInGuest(new Callback() {
@Override
public void success(Result result) {
AppSession session = (AppSession) result.data;
getTweets();
}
@Override
public void failure(TwitterException exception) {
// unable to get an AppSession with guest auth
}
});
}
public void getTweets() {
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();
StatusesService statusesService = twitterApiClient.getStatusesService();
statusesService.userTimeline([USERID], null, 5, null, null, null, true, null, false, new Callback<List<Tweet>>() {
@Override
public void success(Result <List<Tweet>> result) {
for(Tweet Tweet : result.data) {
tweetList.add(Tweet.text);
}
createListView();
}
public void failure(TwitterException exception) {
Log.e("Failure", exception.toString());
exception.printStackTrace();
}
});
}
当我没有收到 403 时,一切正常,我的列表得到填充。
现在,完全有可能是我的代码出了点问题,导致我的速率限制被列入黑名单?否则;我是否需要让用户登录才能向他们显示 5 条推文?或者我应该实施某种服务器端缓存?
感谢任何 tips/help.
我想我可能已经弄明白了。看起来您必须从 logInGuest 回调中的成功方法保存会话,然后将其传递给 getApiClient。到目前为止,这是一些对我有用的代码:
private TweetViewFetchAdapter adapter;
...
adapter = new TweetViewFetchAdapter<CompactTweetView>(getActivity());
...
TwitterCore.getInstance().logInGuest( new Callback<AppSession>() {
@Override
public void success(Result<AppSession> appSessionResult) {
AppSession session = appSessionResult.data;
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient(session);
twitterApiClient.getStatusesService().userTimeline(null, "RadioOkinawa864", 10, null, null, false, false, false, true, new Callback<List<Tweet>>() {
@Override
public void success(Result<List<Tweet>> listResult) {
adapter.setTweets(listResult.data);
}
@Override
public void failure(TwitterException e) {
Toast.makeText(getActivity().getApplicationContext(), "Could not retrieve tweets", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
}
@Override
public void failure(TwitterException e) {
Toast.makeText(getActivity().getApplicationContext(), "Could not get guest Twitter session", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
使用 logInGuest
时,请注意访客 AppSession 将在一段时间后过期。您的应用程序必须处理过期 TwitterExceptions 并请求另一个访客 AppSession。例如,
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient(guestAppSession);
twitterApiClient.getSearchService().tweets("#fabric", null, null, null, null, 50, null, null, null, true, new Callback<Search>() {
@Override
public void success(Result<Search> result) {
// use result tweets
}
@Override
public void failure(TwitterException exception) {
final TwitterApiException apiException = (TwitterApiException) exception;
final int errorCode = apiException.getErrorCode();
if (errorCode == TwitterApiConstants.Errors.APP_AUTH_ERROR_CODE || errorCode == TwitterApiConstants.Errors.GUEST_AUTH_ERROR_CODE) {
// request new guest AppSession (i.e. logInGuest)
// optionally retry
}
}
});
请注意,AppSession 只能用于发出 API 不需要用户上下文的请求。例如,您 不能 使用 AppSession
推文。您可以 获取用户 public 条推文的时间表。参见 TwitterKit Android REST API docs。
最后,如果您使用来自 Twitter 套件组的 TweetUi 套件的 TweetUtils.loadTweet
或 TweetUtils.loadTweets
助手,设置来宾身份验证和处理过期是自动执行的,您不需要调用 logInGuest你自己。
在我的例子中,api 返回 403 forbidden 并显示以下消息 Your app may not allow guest auth. Please talk to us regarding upgrading your consumer key.
请确保您的状态不同。