Twitter连接失败

时间:2014-03-07 13:30:58

标签: android ssl twitter twitter-oauth twitter4j

在Android中
Twitter连接失败。需要SSL吗?

我的代码运行正常,目前是一个实时应用程序。但是,自2014年以来它一直没有运作,我听说Twitter已经应用了https或使用SSL概念。

帮我解决了这个问题。

这是我的日志。

 03-14 15:00:02.838: D/TwitterApp(697): Error getting access token
03-14 15:00:02.878: W/System.err(697): 403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).
03-14 15:00:02.878: W/System.err(697): message - SSL is required
03-14 15:00:02.878: W/System.err(697): code - 92
03-14 15:00:02.878: W/System.err(697): Relevant discussions can be found on the Internet at:
03-14 15:00:02.878: W/System.err(697):  http://www.google.co.jp/search?q=6f0f59ca or
03-14 15:00:02.888: W/System.err(697):  http://www.google.co.jp/search?q=20d0f73f
03-14 15:00:02.888: W/System.err(697): TwitterException{exceptionCode=[6f0f59ca-20d0f73f], statusCode=403, message=SSL is required, code=92, retryAfter=-1, rateLimitStatus=RateLimitStatusJSONImpl{remaining=14, limit=15, resetTimeInSeconds=1394790328, secondsUntilReset=-18874}, version=3.0.3}
03-14 15:00:02.888: W/System.err(697):  at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
03-14 15:00:02.888: W/System.err(697):  at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
03-14 15:00:02.888: W/System.err(697):  at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:89)
03-14 15:00:02.888: W/System.err(697):  at twitter4j.TwitterBaseImpl.fillInIDAndScreenName(TwitterBaseImpl.java:126)
03-14 15:00:02.888: W/System.err(697):  at twitter4j.TwitterImpl.verifyCredentials(TwitterImpl.java:592)
03-14 15:00:02.908: W/System.err(697):  at com.twitter.android.TwitterApp$3.run(TwitterApp.java:150)

推特连接代码http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/这是一个发展

3 个答案:

答案 0 :(得分:5)

据我所知,OAuth实现可能会导致这种情况没有太大变化,但是,在使用OAuth进行身份验证之后,如果您之前使用非SSL请求数据,这可能以前有效,但现在不行。 Twitter在2014年1月14日引入了变更restricting access to SSL/TLS connections only

在Java代码的某处,将会有用于从Twitter服务器检索数据的URL。我建议您通过代码进行搜索/替换,对于http://api.twitter.com/出现https://api.twitter.com/的任何情况,您可以用https替换它们,这可能有望解决此问题。可能之后可能会出现其他问题,但至少这是您迈出的第一步。

通过指定{{1}},这可确保您使用SSL协议,以确保在您的应用程序和Twitter之间传输时数据保持安全。

如果您需要更多信息以选择性地验证和验证代码中的SSL证书以获得更高的安全性,请阅读Twitter开发人员文档网站上的Connecting to Twitter API via SSL


编辑:为了进一步澄清,为了收到此错误消息,您必须已通过SSL URL使用OAuth成功进行身份验证,但之后还原为非SSL网址以进行后续数据请求

答案 1 :(得分:1)

如果您使用的是sign-post + Twitter4j,则可以按如下方式定义OAuth提供商:

private DefaultOAuthConsumer mOAuthConsumer = null;
private DefaultOAuthProvider httpOauthprovider = new DefaultOAuthProvider("https://api.twitter.com/oauth/request_token",
        "https://api.twitter.com/oauth/access_token",
        "https://api.twitter.com/oauth/authorize");

然后执行用户身份验证:

private void getTwitterAuthorisation() {
    if (backend.hasNetworkConnection(this, true)) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    mOAuthConsumer = newOAuthConsumer();
                    String authUrl = httpOauthprovider.retrieveRequestToken(mOAuthConsumer, CALLBACK);
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
                } catch (Exception e) {
                    Log.e(TAG, "getTwitterAuthorisation()", e);
                }
            }
        }).start();
    }
}
然后获得令牌:

TwitterCredentials creds = null;
            try {
                httpOauthprovider.retrieveAccessToken(mOAuthConsumer, verifier);
                final String token = mOAuthConsumer.getToken();
                final String secret = mOAuthConsumer.getTokenSecret();
                final AccessToken accessToken = new AccessToken(token, secret);
                final Twitter twitter = TwitterFactory.getSingleton();
                twitter.setOAuthConsumer(mOAuthConsumer.getConsumerKey(), mOAuthConsumer.getConsumerSecret());
                twitter.setOAuthAccessToken(accessToken);
                final long twitterId = twitter.getId();
                final String twitterScreenName = twitter.getScreenName();
                creds = new TwitterCredentials();
                creds.oauthToken = token;
                creds.oauthSecret = secret;
                creds.twitterId = twitterId;
                creds.screenName = twitterScreenName;
            } catch (Exception e) {
                Log.e(TAG, "doTwitterConnect", e);
            }
            return creds;

答案 2 :(得分:1)

我遇到同样的错误并升级到最新版本的twitter4j 3.0.5,解决了这个问题。

在此处获取最新信息http://twitter4j.org/en/index.html#download

我应该提到我运行的版本是twitter4j 3.0.3。转到版本3.0.5或3.0.6为我解决了这个问题。