使用 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.loadTweetTweetUtils.loadTweets 助手,设置来宾身份验证和处理过期是自动执行的,您不需要调用 logInGuest你自己。

在我的例子中,api 返回 403 forbidden 并显示以下消息 Your app may not allow guest auth. Please talk to us regarding upgrading your consumer key.

请确保您的状态不同。