使用 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.loadTweetTweetUtils.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 注销

使用fabric api在twitter上搜索用户名、hashtag

使用 twitter fabric sdk for android 显示特定 twitter 个人资料的时间线