使用Twitter4J Scala按地点过滤推特流时遇406错误求助
嘿,我刚仔细看了你的问题和代码,这个406 Parameter not accepted with the role错误的根源其实很清晰——你给locations()方法的传参格式不符合Twitter4J的要求!
错误原因分析
错误提示里的Location track items must be given as pairs of comma separated lat/longs: [Ljava.lang.String;@48d1de0f已经给出了关键线索:Twitter的Streaming API要求地点过滤的边界框必须是完整的经纬度组合单元,而Twitter4J的FilterQuery.locations()方法需要接收的是多个二维数组(每个子数组代表一个边界框的[最小经度, 最小纬度, 最大经度, 最大纬度])。
你现在的代码里,直接把一个一维的Array(-122.75,36.8,-121.75,37.8)传给了方法,这会让Twitter4J把这四个数值拆成两个独立的坐标对(而非一个完整的边界框),自然触发了参数格式无效的406错误。
修正方案
我们只需要调整参数的格式,把单个边界框包装成二维数组,同时让方法正确适配Twitter4J的可变参数要求:
1. 修改地点过滤方法
更新filterTwitterStreamByLocation方法,使其接收二维数组的边界框参数,并正确传递给locations():
def filterTwitterStreamByLocation(twitterStream: TwitterStream, boundingBoxes: Array[Array[Double]]) = { // 使用: _*将二维数组展开为可变参数,适配Twitter4J的方法签名 twitterStream.filter(new FilterQuery().locations(boundingBoxes: _*)) }
2. 调整调用代码
在main方法里,把旧金山的边界框包装成二维数组再传递:
def main(args: Array[String]): Unit = { val twitterStream = TwitterStreamFilters.configureTwitterStream() val counter = new Counter twitterStream.addListener(counter) // 将单个边界框放入数组中,符合方法的参数要求 TwitterStreamFilters.filterTwitterStreamByLocation(twitterStream, Array(Array(-122.75,36.8,-121.75,37.8))) TwitterStreamFilters.closeTwitterStream(twitterStream) }
额外扩展说明
如果之后需要同时过滤多个地区的推文,只需要在二维数组里添加更多子数组即可,比如:
// 同时过滤旧金山和纽约的边界框 val multipleBoxes = Array( Array(-122.75,36.8,-121.75,37.8), Array(-74.0,40.7,-73.0,40.8) ) TwitterStreamFilters.filterTwitterStreamByLocation(twitterStream, multipleBoxes)
内容的提问来源于stack exchange,提问作者Cassie

