Интеграция Twitter + OAuth - PullRequest
       15

Интеграция Twitter + OAuth

1 голос
/ 15 сентября 2010

Кто-нибудь может помочь в интеграции Android + Twitter с помощью OAuth.

Я уже работал над http://github.com/brione/Brion-Learns-OAuth и получаю сообщение об ошибке, перечисленное ниже, когда я публикую обновление статуса ...

WARN/System.err(190): org.apache.http.client.HttpResponseException: Unauthorized
WARN/System.err(190):     at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71)
WARN/System.err(190):     at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
WARN/System.err(190):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
WARN/System.err(190):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
WARN/System.err(190):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
WARN/System.err(190):     at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:343)
WARN/System.err(190):     at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:1)
WARN/System.err(190):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
WARN/System.err(190):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
WARN/System.err(190):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
WARN/System.err(190):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
WARN/System.err(190):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
WARN/System.err(190):     at java.lang.Thread.run(Thread.java:1060)

Я успешно использую аутентификацию OAuth и получаю user_secret и user_token и сохраняю в настройках ...

Итак, проблема заключается в публикации http с использованием заголовка OAuth ...

и MyHttp Post Метод выглядит так:

private class PostTask extends AsyncTask<String, Void, JSONObject> {

  ProgressDialog postDialog;

  @Override
  protected void onPreExecute() {
   postDialog = ProgressDialog.show(BLOA.this,
     getText(R.string.tweet_progress_title),
     getText(R.string.tweet_progress_text), true, // indeterminate
                 // duration
     false); // not cancel-able
  }

  @Override
  protected JSONObject doInBackground(String... params) {

   JSONObject jso = null;
   try {
    HttpPost post = new HttpPost(
      "http://twitter.com/statuses/update.json");
    LinkedList<BasicNameValuePair> out = new LinkedList<BasicNameValuePair>();
    out.add(new BasicNameValuePair("status", params[0]));
    post.setEntity(new UrlEncodedFormEntity(out, HTTP.UTF_8));
    post.setParams(getParams());
    // sign the request to authenticate
    mConsumer.sign(post);
    String response = mClient.execute(post,
      new BasicResponseHandler());
    jso = new JSONObject(response);
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   } catch (OAuthMessageSignerException e) {
    e.printStackTrace();
   } catch (OAuthExpectationFailedException e) {
    e.printStackTrace();
   } catch (OAuthCommunicationException e) {
    e.printStackTrace();
   } catch (ClientProtocolException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   } catch (JSONException e) {
    e.printStackTrace();
   } finally {

   }
   return jso;
  }

  // This is in the UI thread, so we can mess with the UI
  protected void onPostExecute(JSONObject jso) {
   postDialog.dismiss();
   if (jso != null) { // authorization succeeded, the json object
     // contains the user information
    mEditor.setText("");
    mLast.setText(getCurrentTweet(jso));
   } else {
    mLast.setText(getText(R.string.tweet_error));
   }
  }
 }

Ответы [ 4 ]

2 голосов
/ 24 сентября 2010

Вам необходимо добавить информацию oauth в заголовки http-запроса, используя post.addHeader ().Чтобы узнать, что добавить в заголовки, посмотрите здесь: http://dev.twitter.com/pages/auth

2 голосов
/ 18 сентября 2010

Несмотря на то, что вы получили user_secret и user_token в onResume (), вы уверены, что ваши исходные объекты остаются прежними? У меня была эта проблема в моем приложении для Android. Я бы создал объекты, но когда был вызван onResume (), это был совершенно новый экземпляр Activity, потому что он был освобожден из памяти при запуске браузера. Поэтому, когда я попытался установить возвращенную пару секрет / токен, это не сработало. Это чаще происходит на устройстве с ограниченной памятью. Некоторые люди предпочитают сохранять необходимую информацию между вызовами, а другие решают не запускать намерение браузера по умолчанию, а вместо этого размещать встроенное веб-представление, чтобы их оригинальные объекты signpost-oauth не выходили за рамки.

Состояние экземпляра OAuth в Android

Не уверен, что это проблема, но, возможно, стоит посмотреть.

1 голос
/ 24 сентября 2010

Пожалуйста, опишите, каким клиентом / потребителем / провайдером вы пользуетесь, для правильной работы он должен быть DefaultHttpClient / CommonsHttpOAuthConsumer / CommonsHttpOAuthProvider.

Убедитесь, что вы набрали consumer.setTokenWithSecret(oToken, oTokenSecret); перед вызовом этого кода.

Кроме того, существует ли post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); в ваших параметрах сообщения?

В чем причина использования пустого BasicResponseHandlerон ничего не обрабатывает и может быть опущен в вызове execute, я полагаю.

И, может быть, это глупый вопрос, возможно, вы перезаписываете параметры при вызове setParams(...) после setEntity(...)

1 голос
/ 19 сентября 2010

У меня есть 2 учебника для 2 разных библиотек Java. Первый (от) здесь, а Второй здесь с писцом. Это для LinkedIn, но было бы очень легко переключиться на Twitter. Я бы пошел с # 2

...