如何让Bing News API返回50/100条结果?代码参数失效求助
解决Bing News API未返回预期数量结果的问题
我来帮你排查这个问题,从你的代码和API使用方式来看,有几个可能的原因导致你拿不到预期的50条结果,咱们逐一分析并修复:
1. 查询字符串拼接逻辑错误
你当前的代码是把urlencode($query)和$site用+直接拼接后放入q参数,但这种做法会导致site筛选部分的语法编码出现冲突——因为+在URL中会被解析为空格,而你手动添加的+和urlencode生成的编码混合后,可能让Bing无法正确识别查询规则。
正确的做法是先把搜索词和site筛选合并成一个完整的查询语句,再整体进行URL编码,这样能保证整个查询字符串的语法和编码都符合API要求。
2. 站点筛选语法冗余
你的$site变量里用了多层嵌套括号,其实Bing的查询语法不需要这么复杂,直接写成site:aaa.com OR site:bbb.com OR site:ccc.net OR site:ddd.com就可以正常生效,简化后更清晰也不容易出错。
3. 实际结果数量的客观限制
即使你设置了count=50,也可能因为以下情况返回更少的结果:
- 目标区域(
cc=CR)和语言(setLang=es)下,符合你站点筛选和搜索词的新闻数量本身不足50条; - 可以查看API返回的JSON中的
totalEstimatedMatches字段,它会告诉你符合条件的总结果数,如果这个数值小于50,那自然拿不到预期数量的结果; - 确认你的API订阅权限,虽然Bing News V7的
count最大值是100,但部分订阅层级可能有额外限制。
修正后的完整代码
下面是调整后的代码,修复了查询拼接问题,同时简化了语法并增加了结果排查的输出:
<?php $endpoint = 'https://api.cognitive.microsoft.com/bing/v7.0/news'; $term = $_GET['q']; // 简化site筛选语法 $siteFilter = 'site:aaa.com OR site:bbb.com OR site:ccc.net OR site:ddd.com'; function BingNewsSearch($url, $key, $fullQuery) { $headers = "Ocp-Apim-Subscription-Key: $key\r\n"; $options = array( 'http' => array( 'header' => $headers, 'method' => 'GET' ) ); $context = stream_context_create($options); // 将完整查询整体编码,避免拼接错误 $requestUrl = $url . "?q=" . urlencode($fullQuery) . '&cc=CR&setLang=es&count=50&offset=0'; $result = file_get_contents($requestUrl, false, $context); // 提取Bing响应头 $headers = array(); foreach ($http_response_header as $k => $v) { $h = explode(":", $v, 2); if (isset($h[1])) { if (preg_match("/^BingAPIs-/", $h[0]) || preg_match("/^X-MSEdge-/", $h[0])) { $headers[trim($h[0])] = trim($h[1]); } } } return array($headers, $result); } print "Searching news for: " . $term . "\n"; // 合并搜索词与site筛选为完整查询 $fullQuery = $term . " " . $siteFilter; list($headers, $json) = BingNewsSearch($endpoint, $accessKey, $fullQuery); // 解码JSON查看关键信息,方便排查 $decodedResult = json_decode($json, true); echo "Total estimated matching results: " . $decodedResult['totalEstimatedMatches'] . "\n"; echo "Actual returned results count: " . count($decodedResult['value']) . "\n"; ?>
额外排查建议
- 手动构造请求URL(替换
$accessKey和搜索词)直接在浏览器访问,查看返回的JSON结果,确认value数组的长度; - 检查
$accessKey是否正确,以及该密钥是否有权限访问Bing News API; - 如果返回错误信息,查看响应头中的
BingAPIs-TraceId,可以用它在Bing开发者门户排查具体问题。
内容的提问来源于stack exchange,提问作者aloai
相关产品推荐
相关产品推荐

