使用play 2.4通过oauth访问twitter api。 我在twitter上创建了一个应用程序,并创建了带有秘密的密钥和令牌。 在Twitter上为我的应用程序编写了一个URL,因为它实际上并不存在。 并在回调网址上使用相同的组成网址。在localhost上运行应用程序。使用来自twitter的curl生成的命令模仿身份验证按预期工作,因此我的密钥和令牌有效。
我运行代码时收到此响应:
错误401未经授权
这是主要游戏代码:
import play.api._
import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits._
import play.api.Play.current
import play.api.libs.oauth.{ConsumerKey,RequestToken}
import scala.concurrent.Future
import play.api.libs.ws._
import play.api.libs.oauth.OAuthCalculator
import play.api.libs.iteratee._
class Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
val loggingIteratee = Iteratee.foreach[Array[Byte]] { array => Logger.info(array.map(_.toChar).mkString) }
def tweets = Action.async {
credentials.map {
case (consumerKey, requestToken) =>
println(consumerKey.key.toString())
println(consumerKey.secret.toString())
println(requestToken.token.toString())
println(requestToken.secret.toString())
WS
.url("https://stream.twitter.com/1.1/statuses/sample.json")
.sign(OAuthCalculator(consumerKey, requestToken))
.withQueryString("track" -> "reactive")
.get()
.map { response =>
Ok(response.body)
}
}getOrElse{
Future{
InternalServerError("twitter credentials missing")
}
}
}
def credentials :Option[(ConsumerKey,RequestToken)] = for {
apiKey <- Play.configuration.getString("twitter.apiKey")
apiSecret <- Play.configuration.getString("twitter.apiSecret")
token <- Play.configuration.getString("twitter.token")
tokenSecret <- Play.configuration.getString("twitter.tokenSecret")
}yield (ConsumerKey(apiKey,apiSecret),RequestToken(token,tokenSecret) )
}
答案 0 :(得分:0)
我认为问题在于您使用了错误的Twitter API。如上所述here,您必须使用Twitter API 1.1,因此您的Web服务的URL应为:.url("https://stream.twitter.com/1.1/statuses/sample.json")
答案 1 :(得分:0)
我的问题一定是我在twitter上创建的Twitter应用程序。删除并重新创建应用程序,它工作正常。我正在使用2.4。我能想到的唯一区别是,当我第一次在twitter上创建应用程序时,我提供了一个实际存在且没有用的组成网址。然后我删除了该应用程序并创建了一个新应用程序,但提供了我的Twitter帐户URL作为Web网址并且它有效。