Twitter连接失败。

13

在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)

Twitter连接代码http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/ 这是一个开发教程


请查看以下链接:http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/ - Khaled.K
仍未解决,请帮我一下。 - Bhavesh Jethani
3个回答

5
据我所知,OAuth 实现方面没有什么变化会导致这种情况发生。然而,如果您在使用 OAuth 进行身份验证后,仍然使用非 SSL 请求获取数据,那么以前可能可以,但现在不行了。Twitter 于 2014 年 1 月 14 日引入了一项更改,只允许使用 SSL/TLS 连接,请参见 限制访问 SSL/TLS 连接
在你的 Java 代码中,必须有用于从 Twitter 服务器检索数据的 URL。我建议你在代码中进行搜索/替换,将所有 http://api.twitter.com/ 替换为 https://api.twitter.com/,这样就可以解决这个问题。可能会暴露其他问题,但至少这是你的第一步。
通过指定 https,确保你正在使用 SSL 协议,在你的应用程序和 Twitter 之间传输数据时保持安全。
如果需要更多信息来选择性地验证和验证 SSL 证书,以提高安全性,则可以阅读 Twitter 开发人员文档网站上的通过 SSL 连接到 Twitter API。 < hr/> 编辑:为了进一步澄清,要收到此错误消息,您必须已经通过 SSL URL 成功进行了 OAuth 身份验证,但随后又恢复为非 SSL URL 以获取后续数据请求。

在我的应用程序中没有任何类似“http://api.twitter.com/”的URL。对于 Twitter 连接,我使用了以下三个 URL。 1)https://twitter.com/oauth/request_token 2)https://twitter.com/oauth/access_token 3)https://twitter.com/oauth/authorize实际上发生的情况是,我成功登录,但最后会显示“Twitter 连接失败”的消息。 - Bhavesh Jethani
这是你的问题,Twitter正在加强其基础设施并删除有效的端点。对于API调用,您可能已经成功地直接访问过Twitter.com,但实际上应该访问api.twitter.com。您需要修复所有URL。 - covati
我的代码之前一直运行得很好,突然间就不工作了。 - Bhavesh Jethani
1
这是一个你未来可能会再次遇到的问题@bhavesh-jethani。由于你的代码依赖于Twitter的API,你将不得不经常检查[链接]Twitter开发者网站(https://dev.twitter.com/) [/链接]以了解他们对API或服务所做的任何更改,这可能会影响你的实现代码。API的改进和安全增强通常不具备向后兼容性,即使在过渡期间发布多个版本的API,旧版本也通常会在一段时间后停止使用。 - richhallstoke

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;

1
我遇到了同样的错误,升级到最新版本的twitter4j 3.0.5,问题得以解决。
在这里获取最新版本 http://twitter4j.org/en/index.html#download 值得一提的是,我当时使用的版本是twitter4j 3.0.3。升级到版本3.0.5或3.0.6可以解决我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接