Правильный способ использовать twitter4j в appengine - PullRequest
3 голосов
/ 23 августа 2009

Я занимаюсь созданием веб-приложения, которое пытается прочитать профиль пользователя в Твиттере, показать его / ее друзей и показать его / ее фотографию. Пример кода на сайте Twitter4j выглядит так:

public static void main(String args[]) thrwos Exception{
   Twitter twitter = new Twitter();
   twitter.setOAuthConsumer("[consumer key]", "[consumer secret]");
   RequestToken requestToken = twitter.getOAuthRequestToken();
   AccessToken accessToken = null;
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   while (null == accessToken) {
        System.out.println("Open the following URL 
           and grant access to your account:");
        System.out.println(requestToken.getAuthorizationURL());
        System.out.print("Hit enter when it's done.[Enter]:");
        br.readLine();
        try{
          accessToken = requestToken.getAccessToken();
        } catch (TwitterException te) {
        if(401 == te.getStatusCode()){
        System.out.println("Unable to get the access token.");
        }else{
         te.printStackTrace();
       }
  }
 }
}

То, что я делаю, находится в сервлете, давайте назовем его IndexServlet. У меня есть следующий код:

   Twitter twitter = new Twitter();
   twitter.setOAuthConsumer("[consumer key]", "[consumer secret]");
   RequestToken requestToken = twitter.getOAuthRequestToken();
   String authUrl = requestToken.getAuthorizationURL()

и затем я передаю authUrl в jsp, чтобы пользователь мог щелкнуть по нему. Это работает так далеко, но после этого я уже застрял! :)

Я не уверен, где установить URL обратного вызова. Должен ли я установить его на тот же сервлет? Проблема в том, что у меня должны быть такие же переменные twitter и requestToken, как в первом коде с методом main, чтобы я мог сделать это:

accessToken = requestToken.getAccessToken();
Status status = twitter.updateStatus(some argument here);

Но установка URL обратного вызова в IndexServlet вызывает код, который настраивает потребителя Twitter. Я мог бы, вероятно, обойти это, используя флаг вроде

if (already setup) {
   accessToken = requestToken.getAccessToken();
   Status status = twitter.updateStatus(some argument here);
} 

но тогда я думаю, что это грязно.

Я попробовал (используя второй сервлет, который является URL обратного вызова)

  1. Я пытался сохранить переменные twitter и requestToken в сеанс, чтобы я мог получить к нему доступ, когда твиттер перенаправляет на URL обратного вызова, но, видимо, это не разрешено.

  2. Я также пытался сохранить твиттер и токен запроса в хранилище данных, но последнее не позволяет сохранять типы RequestToken.

Так что, очевидно, все потерпели неудачу. Интересно было найти правильный способ сделать это. Спасибо! :)

Ответы [ 2 ]

2 голосов
/ 03 сентября 2009

Я разработал хак для использования Twitter4j + Oauth в google app engine. Я писал об этом здесь .

Хотя этот код работает, он может быть неправильным способом использовать Twitter4j и Oauth (хотя он работает на appengine). Это не оптимизировано, это определенно не лучший способ, и ради краткости, оно на самом деле пронизано плохими практиками! В моем реальном приложении я уже реорганизовал эти запахи кода.

Еще одна вещь, которую мне еще предстоит рассмотреть, это то, почему значок Twitter появляется после того, как он перенаправляет на URL обратного вызова. Я намерен в ближайшее время поработать над этим, а также оптимизировать метод. Комментарии и предложения приветствуются!

1 голос
/ 24 августа 2009

Вы можете сохранить данные в сеансе . Google App Engine поддерживает это, но вам нужно включить его .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...