Twitter 使用akka流解析推文

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

我使用以下代码连接到Twitter并获取推文,但是我无法创建
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)
    )
}