【问题标题】:To connect my application with twitter将我的应用程序与 twitter 连接起来
【发布时间】:2011-08-21 01:46:45
【问题描述】:

我有一个示例,我收到 401 错误,因为消费者不正确或签名不匹配。如何将签名密钥放在这里,因为在我的工作 java 示例中有一个签名密钥,我想实现它.

public class TwitterApp {
private Twitter mTwitter;
private TwitterSession mSession;
private AccessToken mAccessToken;
private OAuthConsumer mHttpOauthConsumer;
private OAuthProvider mHttpOauthprovider;
private String mConsumerKey;
private String mSecretKey;
private ProgressDialog mProgressDlg;
private TwDialogListener mListener;
private Context context;

public static final String CALLBACK_URL = "twitterapp://connect";
private static final String TAG = "TwitterApp";

public TwitterApp(Context context, String consumerKey, String secretKey) {
    this.context    = context;

    mTwitter        = new TwitterFactory().getInstance();
    mSession        = new TwitterSession(context);
    mProgressDlg    = new ProgressDialog(context);

    mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE);

    mConsumerKey    = consumerKey;
    mSecretKey      = secretKey;

    mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, mSecretKey);
    mHttpOauthprovider = new CommonsHttpOAuthProvider("http://twitter.com/oauth/request_token",
                                                 "http://twitter.com/oauth/access_token",
                                                 "http://twitter.com/oauth/authorize");

    mAccessToken    = mSession.getAccessToken();

    configureToken();
}

public void setListener(TwDialogListener listener) {
    mListener = listener;
}

@SuppressWarnings("deprecation")
private void configureToken() {
    if (mAccessToken != null) {
        mTwitter.setOAuthConsumer(mConsumerKey, mSecretKey);

        mTwitter.setOAuthAccessToken(mAccessToken);
    }
}

public boolean hasAccessToken() {
    return (mAccessToken == null) ? false : true;
}

public void resetAccessToken() {
    if (mAccessToken != null) {
        mSession.resetAccessToken();

        mAccessToken = null;
    }
}

public String getUsername() {
    return mSession.getUsername();
}

public void updateStatus(String status) throws Exception {
    try {
        mTwitter.updateStatus(status);
    } catch (TwitterException e) {
        throw e;
    }
}

public void authorize() {
    mProgressDlg.setMessage("Initializing ...");
    mProgressDlg.show();

    new Thread() {
        @Override
        public void run() {
            String authUrl = "";
            int what = 1;

            try {
                authUrl = mHttpOauthprovider.retrieveRequestToken(mHttpOauthConsumer, CALLBACK_URL);    

                what = 0;

                Log.d(TAG, "Request token url " + authUrl);
            } catch (Exception e) {
                Log.d(TAG, "Failed to get request token");

                e.printStackTrace();
            }

            mHandler.sendMessage(mHandler.obtainMessage(what, 1, 0, authUrl));
        }
    }.start();
}

public void processToken(String callbackUrl)  {
    mProgressDlg.setMessage("Finalizing ...");
    mProgressDlg.show();

    final String verifier = getVerifier(callbackUrl);

    new Thread() {
        @Override
        public void run() {
            int what = 1;

            try {
                mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer, verifier);

                mAccessToken = new AccessToken(mHttpOauthConsumer.getToken(), mHttpOauthConsumer.getTokenSecret());

                configureToken();

                User user = mTwitter.verifyCredentials();

                mSession.storeAccessToken(mAccessToken, user.getName());

                what = 0;
            } catch (Exception e){
                Log.d(TAG, "Error getting access token");

                e.printStackTrace();
            }

            mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
        }
    }.start();
}

private String getVerifier(String callbackUrl) {
    String verifier  = "";

    try {
        callbackUrl = callbackUrl.replace("twitterapp", "http");

        URL url         = new URL(callbackUrl);
        String query    = url.getQuery();

        String array[]  = query.split("&");

        for (String parameter : array) {
             String v[] = parameter.split("=");

             if (URLDecoder.decode(v[0]).equals(oauth.signpost.OAuth.OAUTH_VERIFIER)) {
                 verifier = URLDecoder.decode(v[1]);
                 break;
             }
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    return verifier;
}

private void showLoginDialog(String url) {
    final TwDialogListener listener = new TwDialogListener() {
        @Override
        public void onComplete(String value) {
            processToken(value);
        }

        @Override
        public void onError(String value) {
            mListener.onError("Failed opening authorization page");
        }
    };

    new TwitterDialog(context, url, listener).show();
}

private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mProgressDlg.dismiss();

        if (msg.what == 1) {
            if (msg.arg1 == 1)
                mListener.onError("Error getting request token");
            else
                mListener.onError("Error getting access token");
        } else {
            if (msg.arg1 == 1)
                showLoginDialog((String) msg.obj);
            else
                mListener.onComplete("");
        }
    }
};

public interface TwDialogListener {
    public void onComplete(String value);       

    public void onError(String value);
}

}

我也有一个 java 的工作示例,我很容易获得令牌,但问题是它使用 DefaultOAuthConsumer 和 DefaultOAuthProvider 但是每当我在我的示例中尝试实现它时,我都会遇到通信错误,这就是我使用 CommonsHttpOAuthConsumer 的原因和 CommonsHttpOAuthProvider。

这是java工作代码

公共类主{

public static void main(String[] args) throws Exception {

    OAuthConsumer consumer = new DefaultOAuthConsumer(
            "iIlNngv1KdV6XzNYkoLA",
            "exQ94pBpLXFcyttvLoxU2nrktThrlsj580zjYzmoM",
            SignatureMethod.HMAC_SHA1);

    OAuthProvider provider = new DefaultOAuthProvider(consumer,
            "http://twitter.com/oauth/request_token",
            "http://twitter.com/oauth/access_token",
            "http://twitter.com/oauth/authorize");

    System.out.println("Fetching request token from Twitter...");

    // we do not support callbacks, thus pass OOB
    String authUrl = provider.retrieveRequestToken(OAuth.OUT_OF_BAND);

    System.out.println("Request token: " + consumer.getToken());
    System.out.println("Token secret: " + consumer.getTokenSecret());

    System.out.println("Now visit:\n" + authUrl
            + "\n... and grant this app authorization");
    System.out.println("Enter the PIN code and hit ENTER when you're done:");

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String pin = br.readLine();

    System.out.println("Fetching access token from Twitter...");

    provider.retrieveAccessToken(pin);

    System.out.println("Access token: " + consumer.getToken());
    System.out.println("Token secret: " + consumer.getTokenSecret());

    URL url = new URL("http://twitter.com/statuses/mentions.xml");
    HttpURLConnection request = (HttpURLConnection) url.openConnection();

    consumer.sign(request);

    System.out.println("Sending request to Twitter...");
    request.connect();

    System.out.println("Response: " + request.getResponseCode() + " "
            + request.getResponseMessage());
}

}

我也不知道我在这里使用的回调 url 字符串..

【问题讨论】:

  • 我想在这里提出一些建议,例如请不要在 Android 上使用 DefaultOAuth* 实现,而是使用 CommonsHttpOAuth* 类,因为它们旨在与 Apache Commons HTTP 一起使用(这就是 Android无论如何都用于HTTP)。这是 android 中的一个错误,Android 的 java.net.HttpURLConnection 使它无法与某些服务提供商合作。谢谢

标签: android


【解决方案1】:

CALLBACK_URL 应该匹配

<intent-filter> 

在您的 manifest.xml 中。

在你的代码sn-ps中,你是否声明并初始化了mHttpOathCosumer和provider?

【讨论】:

  • 不,我怎么可能,你能给我一些例子吗?我对它进行了一些更改,就像现在我看到谷歌网站一样,他们说不要在 Android 上使用 DefaultOAuth* 实现,而是使用 CommonsHttpOAuth* 它是 Android 的 java.net.HttpURLConnection 中的一个错误,所以现在我是使用它并得到响应但由于消费者密钥不正确或签名不匹配但我的消费者密钥正确而仍然授权失败。帮帮我
  • 是的。根据 Android,您不应该使用 DefaultOauth。这两个主题可能会对您有所帮助。 stackoverflow.com/questions/1965568/… 和 stackoverflow.com/questions/1357372/…
  • 是的,我已经看到了这些链接,但我仍然没有得到我的答案。事实与他们非常相似,是的,我遇到了相同的错误 401,但仍然不知道如何解决。 :(
  • CALLBACK_URL 字符串是否会成为问题,因为这是我不知道的唯一部分。
  • 正如 Mathias 所说,当您尝试检索信息时,您可能没有将 OAuth 验证码附加到请求中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多