【发布时间】:2015-12-15 21:32:04
【问题描述】:
我有一个每天运行的应用程序,并且已经运行了几个月。它使用的是 twitter4j v3.0.3。
几周前,它开始抛出常见的 401 异常:
401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.
{"request":"\/1.1\/statuses\/user_timeline.json","error":"Not authorized."}
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=4be80492 or
http://www.google.co.jp/search?q=0a6306df
TwitterException{exceptionCode=[4be80492-0a6306df], statusCode=401, message=null, code=-1, retryAfter=-1, rateLimitStatus=RateLimitStatusJSONImpl{remaining=112, limit=180, resetTimeInSeconds=1448156737, secondsUntilReset=428}, version=4.0.4}
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:164)
at twitter4j.HttpClientBase.request(HttpClientBase.java:57)
我已更新到 v4.0.4(撰写本文时的最新版本)并确认所有访问和客户端令牌的正确性。我也尝试过创建一个全新的应用程序并使用这些令牌。我已经同步了我的系统时钟。一切都无济于事。
我的来源:
val config = new ConfigurationBuilder()
.setOAuthConsumerKey(conf.getString("twitter.api.key"))
.setOAuthConsumerSecret(conf.getString("twitter.api.secret"))
.setOAuthAccessToken(conf.getString("twitter.access.token"))
.setOAuthAccessTokenSecret(conf.getString("twitter.access.secret"))
.build()
val twitter = new TwitterFactory(config).getInstance
def statuses(handle: String, since: Long): Stream[Status] = {
@tailrec
def loop(page: Int, acc: Stream[Status]): Stream[Status] = {
val paging = new Paging(page, since)
val xs = twitter.getUserTimeline(handle, paging).iterator().asScala.toSeq
val stream = Stream.concat(acc, xs.filterNot(_.getText.startsWith("@")).filterNot(_.getText.startsWith("RT ")).toStream)
if (xs.size < 20) stream
else loop(page + 1, stream)
}
loop(1, Stream.empty)
}
它在twitter.getUserTimeline 失败。
如果代码、配置或我的 Twitter 帐户中没有任何更改,为什么会失败?
我已经排除了键和时钟同步。我还能看什么?
整个项目可在https://github.com/Synesso/tweet-mail 进行测试(根据自述文件,它需要一些设置 - 但可能不需要 smtp 设置)。
【问题讨论】:
-
您可能需要一个新版本的
catcert.pem,例如github.com/jublonet/codebird-php/blob/develop/src/cacert.pem - 包含来自 Twitter 的最新证书数据。 -
我添加了信任证书dev.twitter.com/overview/api/ssl _ Symantec Class 3 Secure Server CA - G4 root certificate with serial: 51:3f:b9:74:38:70:b7:34:40:41: 8d:30:93:06:99:ff_ 到我的系统,但它仍然失败。有没有办法我可以通过 twitter4j api 只为应用程序信任它?
-
我需要将它添加到 JRE cacerts。谢谢特伦斯。