使用Twitter Fabric获取用户时间线时出现403禁止访问错误

4

我一直在尝试使用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条推文吗?或者我应该实现一些服务器端缓存?
非常感谢任何提示/帮助。

1
我遇到了完全相同的问题。它在大部分时间内都正常工作,但就在不久前突然停止工作并返回“403”错误。我的代码没有做任何更改,我也无法想象自己已经达到了任何速率限制(如果是这样的话,那么Fabric将毫无用处)。 - Mark Duncan
很奇怪。我已经联系了Twitter(我猜是Fabric团队),以确定是否达到了某种限制。我很新于Android开发,所以可能犯了一些初学者错误。但如果你遇到了同样的问题,可能有什么不对劲。 - Jens Hendar
嗯...清除应用程序缓存和数据似乎解决了问题。我不确定发生了什么。我在我的代码中添加了TwitterCore.getInstance().logoff(),以查看它是否与此有关。也许它正在使用缓存的授权令牌或其他东西,调用logoff()可能会清除它。那是我目前最好的猜测。可能只是巧合,我们大约在同一时间遇到了这个问题。 - Mark Duncan
那对我没用。但是成功的方法是使用我的 Twitter 账户进行身份验证,即登录。之后就没有问题了。虽然这可能不是您想要的用户体验。 - Jens Hendar
是的,对我也没用。我今天早上起床发现它已经不再拉取推文了(清除应用程序数据确实使它工作了,但这不是一个合理的解决方案)。不幸的是,通过Twitter帐户登录不适用于我的目的(我只想在应用程序中嵌入一家公司的推文,用户不应该为此进行身份验证)。我今天会继续尝试。 - Mark Duncan
3个回答

5

我觉得我可能已经明白了。看起来你需要从logInGuest回调函数的success方法中保存会话,然后将其传递给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();
    }
});

很酷!我到工作时会试一下。不错的发现。 :-) - Jens Hendar
非常好用!我将它与TwitterSession currentSession = Twitter.getSessionManager().getActiveSession(); if (currentSession == null) {配对,然后加入了登录的代码。 - Jens Hendar
很高兴它对你有用!真巧,我们大约在同一时间遇到了这个问题。 - Mark Duncan
几个时区之外。互联网真是太棒了,不是吗? ;) - Jens Hendar

3

使用logInGuest时,请注意访客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
        }
    }
});

请注意,AppSessions仅可用于不需要用户上下文的API请求。例如,您不能使用AppSession发推文。您可以获取用户的公共推文时间线。请参见TwitterKit Android REST API文档
最后,如果您正在使用Twitter kit组的TweetUi kit中的TweetUtils.loadTweetTweetUtils.loadTweets助手,则自动设置访客身份验证和处理过期操作,您不需要自行调用logInGuest。

如果您要使用TweetUtils.loadTweets,则必须在数组中指定推文的ID。如果我想获取用户的最新5条推文,我必须先在数组中获取这些推文的ID,然后再使用TweetUtils。或者我理解有误吗? - Jens Hendar
是的,你说得对,TweetUtils 需要推文 id。要获取用户最新的 5 条推文,你应该像你正在做的那样使用访客身份验证和 StatusesService userTimeline,而不是 TweetUtils。 - dgh

0
在我的情况下,API 返回了 403 禁止访问的错误,并显示以下信息:您的应用程序可能不允许来宾身份验证。请与我们联系以升级您的使用者密钥。 请确保您没有处于相同的状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接