Не могу авторизовать мое приложение, используя twitter4j - PullRequest
2 голосов
/ 12 сентября 2011

Я пишу твиттер-приложение для Android с использованием twitter4j 2.2.4, и у меня возникают проблемы с прохождением 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);
    }


}

В твиттере появляется ошибка 401, в которой говорится, что учетные данные для проверки подлинности отсутствуют или неверны, и я уверен, что ввел правильный ключ / секретный ключ пользователя.

Что-то не так с самим кодом?

Ответы [ 3 ]

1 голос
/ 09 мая 2013

Я понимаю, что это старый вопрос, но я использовал ваш 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 () , и получил тот, который работает.

Надеюсь, это кому-нибудь поможет, но спасибо за хороший базовый класс для работы.

0 голосов
/ 13 января 2014

В случае, если кто-то застрянет с этим, я нашел решение моей проблемы.

Это была синхронизация часов эмулятора, запуск эмуляторов из снимков, используемых для того, чтобы испортить часы.

Так что, если у вас возникла эта проблема, проверьте время и дату эмулятора, а если они не синхронизированы, исправьте их.

0 голосов
/ 12 сентября 2011

Не думаю, что это проблема с вашим кодом.Это проблема со всем механизмом авторизации Twitter, кажется, что если вы вошли в систему с Twitter App на вашем телефоне на Twitter, то авторизация OAuth выдаст вам эту ошибку.Я предполагаю, что он берет учетные данные, используемые Twitter App, и пытается получить доступ к приложению, используя их, и поэтому вы получаете сообщение «неверные учетные данные».

Вы можете попытаться выйти из Twitter App изтелефон, а затем повторите попытку с OAuth.Это сработало для меня, но я все еще не мог найти, как решить проблему, когда вы вошли в систему Twitter App, и вы также пытаетесь войти из своего приложения, используя OAuth.

...