使用 Twitter Fabric 获取 user_timeline 时禁止获取 403
Posted
技术标签:
【中文标题】使用 Twitter Fabric 获取 user_timeline 时禁止获取 403【英文标题】:Getting 403 forbidden when using Twitter Fabric to get user_timeline 【发布时间】:2015-02-16 12:27:47 【问题描述】:我一直在尝试实现 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 条推文?还是我应该实现某种服务器端缓存?
感谢任何提示/帮助。
【问题讨论】:
我遇到了同样的问题。它在一天中的大部分时间都运行良好,然后就在不久前它停止工作,返回“403”。我的代码没有任何变化,我无法想象我已经达到了任何速率限制(如果是这样,那么 Fabric 就没有用处了) 奇怪。我已经联系了 Twitter(我猜是 Fabric 团队),看看我是否在方面达到了某种限制。我对android很陌生,所以我可能会犯一些菜鸟错误。但是,如果您遇到同样的问题,可能会有问题。 嗯.. 似乎清除应用程序缓存和数据修复了它。我不确定发生了什么事。我在我的代码中添加了 TwitterCore.getInstance().logoff() 以查看它是否与它有关。也许它正在使用缓存的授权令牌或其他东西,也许调用 logoff() 会清除它。不过,这是我目前最好的猜测。可能只是巧合,它几乎同时发生在我们身上。 这对我不起作用。确实有效的是使用我的 Twitter 帐户进行身份验证,即登录。之后,没有问题。尽管这可能不是您想要的用户体验。 是的,对我也不起作用。我今天早上醒来,它不再拉推文(清除应用程序数据确实使它工作,但这不是一个合理的解决方案)。不幸的是,使用 Twitter 帐户登录不适合我的目的(我只想在应用程序中嵌入公司的推文,而用户不应该为此进行身份验证)。我今天会更多地玩弄它。 【参考方案1】:我想我可能已经弄清楚了。看起来您必须从 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();
);
【讨论】:
酷!我上班的时候试试。很好的发现。 :-) 效果很好!我将它与TwitterSession currentSession = Twitter.getSessionManager().getActiveSession(); if (currentSession == null)
配对,然后是用于登录的代码。
很高兴它对你有用!我们几乎在同一时间遇到了同样的问题,真是巧合。
还有几个时区。互联网不是很棒吗? ;)【参考方案2】:
使用logInGuest
时,请注意guest AppSessions 将在一段时间后过期。您的应用程序必须处理过期 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
发推文。您可以获取用户的公共推文时间线。见TwitterKit Android REST API docs。
最后,如果您使用 Twitter 套件组的 TweetUi 套件中的 TweetUtils.loadTweet
或 TweetUtils.loadTweets
助手,设置访客身份验证和处理过期是自动执行的,您无需自己调用 logInGuest。
【讨论】:
如果你使用TweetUtils.loadTweets
,你必须在一个数组中指定推文的ID。如果我想从用户那里获取 5 条最新推文,我必须首先在数组中获取这些推文的 ID,然后使用 TweetUtils。还是我说的不对?
是的,你是对的,TweetUtils 需要 Tweet id。要从用户那里获取最新的 5 条推文,您应该使用访客身份验证和 StatusesService 用户时间线,而不是 TweetUtils。【参考方案3】:
在我的情况下,api 返回了 403 禁止,并带有以下消息 Your app may not allow guest auth. Please talk to us regarding upgrading your consumer key.
确保您的状态不同。
【讨论】:
以上是关于使用 Twitter Fabric 获取 user_timeline 时禁止获取 403的主要内容,如果未能解决你的问题,请参考以下文章
Twitter 如何在 Android Studio 中使用 Fabric 插件获取用户个人资料图片
如何在 iOS 中使用 Twitter Kit/Fabric 从登录用户获取用户个人资料图片
如何通过 twitter 的 Fabric API (Android) 获取用户数据
如何使用适用于 Android 的 Fabric Sdk 从 Twitter 注销