Twitter 使用akka流解析推文
我使用以下代码连接到Twitter并获取推文,但是我无法创建Twitter 使用akka流解析推文,twitter,akka,akka-stream,Twitter,Akka,Akka Stream,我使用以下代码连接到Twitter并获取推文,但是我无法创建JsValue。如果只使用byteString.utf8String映射,我可以看到字符串。但当我添加帧时,我得到一个错误: Read 7925 bytes which is more than 1000 without seeing a line terminator 无论我输入多长时间,我仍然会收到这个错误。要在websocket中获得JsValue流,我需要做哪些更改 可以找到关于如何使用twitter流的信息 @Singlet
JsValue
。如果只使用byteString.utf8String映射
,我可以看到字符串。但当我添加帧时,我得到一个错误:
Read 7925 bytes which is more than 1000 without seeing a line terminator
无论我输入多长时间,我仍然会收到这个错误。要在websocket中获得JsValue
流,我需要做哪些更改
可以找到关于如何使用twitter流的信息
@Singleton
类TwitterController@Inject()(ws:WSClient,conf:Configuration){
def tweets=WebSocket.accept[JsValue,JsValue]{隐式请求=>
Flow.fromSinkAndSource(Sink.ignore,querySource(“cat”))
}
def queryToSource(关键字:字符串):源[JsValue,未使用]={
val url=”https://stream.twitter.com/1.1/statuses/filter.json"
credentials.map{case(consumerKey,requestToken)=>
val请求=ws.url(url)
.sign(OAuthCalculator(consumerKey,requestToken))
.withQueryString(“跟踪”->关键字)
.withMethod(“获取”)
streamResponse(请求)
.via(Framing.delimiter(ByteString(“\r\n”),maximumFrameLength=1000,AllowRunLocation=true))
.map{byteString=>
parse(byteString.utf8String)
//byteString.utf8String
}
}盖托莱尔斯{
single(Json.parse(“缺少Twitter凭据”))
}
}
private def streamResponse(请求:WSRequest):Source[ByteString,NotUsed]=Source.fromFuture(request.stream()).flatMapConcat(.body)
惰性val凭据:选项[(ConsumerKey,RequestToken)]=用于{
apiKey是否用“\r\n”分隔?我已更新问题以反映评论。是否用“\r\n”分隔?我已更新问题以反映评论。
@Singleton
class TwitterController @Inject() (ws: WSClient, conf: Configuration) {
def tweets = WebSocket.accept[JsValue,JsValue] { implicit request =>
Flow.fromSinkAndSource(Sink.ignore, queryToSource("cat"))
}
def queryToSource(keyword: String): Source[JsValue, NotUsed] = {
val url = "https://stream.twitter.com/1.1/statuses/filter.json"
credentials.map { case (consumerKey, requestToken) =>
val request = ws.url(url)
.sign(OAuthCalculator(consumerKey, requestToken))
.withQueryString("track" -> keyword)
.withMethod("GET")
streamResponse(request)
.via(Framing.delimiter(ByteString("\r\n"), maximumFrameLength = 1000, allowTruncation = true))
.map { byteString =>
Json.parse(byteString.utf8String)
// byteString.utf8String
}
} getOrElse {
Source.single(Json.parse("Twitter credentials missing"))
}
}
private def streamResponse(request:WSRequest): Source[ByteString, NotUsed] = Source.fromFuture(request.stream()).flatMapConcat(_.body)
lazy val credentials: Option[(ConsumerKey, RequestToken)] = for {
apiKey <- conf.getString("twitter.apiKey")
apiSecret <- conf.getString("twitter.apiSecret")
token <- conf.getString("twitter.token")
tokenSecret <- conf.getString("twitter.tokenSecret")
} yield (
ConsumerKey(apiKey, apiSecret),
RequestToken(token, tokenSecret)
)
}