【问题标题】:Can't authorize my app using twitter4j无法使用 twitter4j 授权我的应用
【发布时间】:2011-11-15 07:38:33
【问题描述】:

我正在使用 twitter4j 2.2.4 编写一个 Android twitter 应用程序,但我无法通过 OAuth。

这是我的代码:

package info.mahmoudhossam.twitter;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.auth.AccessToken;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class TwitterActivity extends Activity {

    private static int OAUTH_REQUEST = 1;
    private static String consumerKey = "##########";
    private static String consumerSecret = "################";
    private Twitter twitter;
    private AccessToken accessToken;
    private TwitterBackend backend;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button loginButton = (Button) findViewById(R.id.button1);
        registerForContextMenu(loginButton);
        backend = new TwitterBackend();
        twitter = backend.getTwitterInstance(consumerKey, consumerSecret);
    }

    public void onLogin(View view) {
        Intent intent = new Intent("mahmoud.browser");
        try {
            Log.i("URL", backend.getRequestToken().getAuthenticationURL());
            intent.putExtra("url", backend.getRequestToken().getAuthenticationURL());
        } catch (TwitterException e) {
            Log.e("Twitter", e.getMessage());
            return;
        }
        startActivityForResult(intent, OAUTH_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == OAUTH_REQUEST && resultCode == RESULT_OK) {
            Uri url = Uri.parse(data.getExtras().getString("url"));
            String verifier = url.getQueryParameter("oauth_verifier");
            Log.i("Verifier", verifier);
            try {
                accessToken = backend.getAccessToken(verifier);
            } catch (TwitterException e) {
                Log.e("Twitter", "Exception occurred, quitting");
                return;
            }
            twitter.setOAuthAccessToken(accessToken);
            try {
                if(twitter.verifyCredentials() != null){
                    Toast.makeText(getApplicationContext(), "Logged in!", Toast.LENGTH_SHORT);
                }
            } catch (TwitterException e) {
                Log.e("Twitter", e.getMessage());
            }
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this,
                    "Cannot connect to twitter, app not authorized",
                    Toast.LENGTH_SHORT).show();
        }
    }

}

还有 TwitterBackend 类:

package info.mahmoudhossam.twitter;

import java.util.List;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;

public class TwitterBackend {
    private static Twitter twitter;

    public Twitter getTwitterInstance(String consumerKey,
            String consumerSecret){
        if(twitter == null){
            twitter = new TwitterFactory().getInstance();
            twitter.setOAuthConsumer(consumerKey, consumerSecret);
        }
        return twitter;
    }

    public RequestToken getRequestToken()
            throws TwitterException {
        return twitter.getOAuthRequestToken();
    }

    public AccessToken getAccessToken(String verifier)
            throws TwitterException{
        return twitter.getOAuthAccessToken(getRequestToken(), verifier);
    }

    public List<Status> getTimeline() throws TwitterException{
        return twitter.getHomeTimeline();
    }

    public void updateStatus(String status) throws TwitterException{
        twitter.updateStatus(status);
    }


}

我从 twitter 收到 401 错误,说身份验证凭据丢失或不正确,我确定我输入了正确的消费者密钥/秘密。

代码本身有问题吗?

【问题讨论】:

    标签: android twitter twitter-oauth twitter4j


    【解决方案1】:

    我意识到这是一个老问题,但我使用了您的 TwitterBackend 课程并且遇到了同样的问题。我通过做一个小改动解决了这个问题(不能说它为什么有效,你的应该没问题)。

    改变这个

    public AccessToken getAccessToken(String verifier) throws TwitterException{
        return twitter.getOAuthAccessToken(getRequestToken(), verifier);
    }
    

    到这里

    public AccessToken getAccessToken(String verifier) throws TwitterException{
        return twitter.getOAuthAccessToken(verifier);
    }
    

    我无法解释原因,但我刚刚开始研究 twitter4j 上列出的 getOAuthAccessToken() 的每种方法,并找到了一种可行的方法。

    我希望这对某人有所帮助,但感谢您使用漂亮的基类。

    【讨论】:

      【解决方案2】:

      我认为这不是您的代码的问题。这是整个Twitter 授权机制的问题,似乎如果您从手机上的Twitter App 登录到Twitter,那么OAuth 授权会给您这个错误。我猜它需要 Twitter App 使用的凭据并尝试使用它们访问应用程序,这就是您收到“凭据不正确”消息的原因。

      您可以尝试从手机的Twitter App 注销,然后使用OAuth 重试。它对我有用,但是当您登录 Twitter App 并且您还尝试使用 OAuth 从您的应用程序登录时,我仍然找不到解决问题的方法。

      【讨论】:

      • 我正在使用模拟器,它没有其他 twitter 应用程序。
      【解决方案3】:

      如果有人对此感到困惑,我找到了解决问题的方法。

      这是模拟器的时钟不同步,从用于弄乱时钟的快照启动模拟器。

      因此,如果您遇到此问题,请检查模拟器的时间和日期,如果不同步,请更正。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 2018-07-05
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多