2015-02-16 3 views
4

Я пытаюсь реализовать Fabric, чтобы получить список из 5 последних твитов от пользователя. Он работал отлично в течение нескольких часов, а затем он прекратил работать. Я хотел бы сделать это без входа пользователя в систему, и насколько я могу сказать, API позволяет гостевым входам читать чириканье, но, возможно, это имеет большее влияние на ограничение скорости?Получение запрета при использовании Twitter Ткань для получения user_timeline

@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». В моем коде не было никаких изменений, и я не могу себе представить, что у меня был какой-то предел скорости (если это так, тогда нет возможности использовать Ткань) –

+0

Странно. Я связался с Твиттером (команда Fabric, я думаю), чтобы увидеть, есть ли у меня фасет, какой-то предел. Я довольно новичок в Android, поэтому я мог сделать некоторую ошибку noob. Но если у вас такая же проблема, может быть что-то не так. –

+0

Хм .. кажется, что очистка кеша приложений и данных исправили его. Я не уверен, что происходит. Я добавил в свой код TwitterCore.getInstance(). Logoff(), чтобы узнать, имеет ли это какое-либо отношение к нему. Возможно, он использует кэш-авторизацию авторизации или что-то еще, и, возможно, вызов logoff() очистит его. Это мое лучшее предположение на данный момент. Возможно, это было просто совпадение с нами примерно в одно и то же время. –

ответ

5

Я думаю, что я мог бы это понять. Похоже, вам нужно сохранить сеанс из метода успеха в обратном вызове 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(); 
    } 
}); 
+0

Круто! Я попробую, когда приеду на работу. Хорошая находка. :-) –

+0

Отлично работает! Я связал его с 'TwitterSession currentSession = Twitter.getSessionManager(). GetActiveSession(); if (currentSession == null) {', а затем код для входа. –

+0

Рад, что это сработало для вас! Какое совпадение мы столкнулись в этой же проблеме примерно в одно и то же время. –

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, не требующих контекста пользователя. Например, вы не можете Tweet с AppSession. You может получить временную шкалу пользователя публичных твитов. См. TwitterKit Android REST API docs.

И наконец, если вы используете помощники TweetUtils.loadTweet или TweetUtils.loadTweets из набора TweetUi группы кинематографистов, настройка гостевой авторизации и истечение срока действия программы выполняется автоматически, вам не нужно вызывать logInGuest самостоятельно.

+0

Ну, если вам нужно использовать 'TweetUtils.loadTweets', вам нужно будет указать идентификаторы твитов в массиве. Если бы я хотел получить 5 последних твитов от пользователя, мне нужно было бы сначала получить идентификаторы этих твитов в массиве, а затем использовать TweetUtils. Или я не понимаю? –

+0

Да, вы правы, что TweetUtils ожидает использования твитов. Чтобы получить последние 5 твитов от пользователя, вы должны использовать гостевую аутентификацию и UserSimeline StatusesService, как вы делаете, а не TweetUtils. – dghubble

0

В моем случае апи вернулся 403 запрещенных со следующим сообщением Your app may not allow guest auth. Please talk to us regarding upgrading your consumer key.

Убедитесь, что ваш не в том же состоянии.

Смежные вопросы