本文介绍基于腾讯云元宝搜索SearchPro APl构建的新闻搜索辅助工具,支持api中匹配的多个类别“新闻,财经,政府,学术” 的信息检索. 可以根据关键词做相应的匹配,检索出所需要的结果数据,所有结果均来自真实AP调用.
一:为什么想做一个元宝搜索Api的android应用
主要是最近一直想做把公众号和头条号做起来,头条号和公众号内容题材等都需要去查相应其他平台来源,于是就想使用元宝搜索Api接口获取腾讯旗下的一些热门信息题材,在根据自己一直有着多年安卓开发相关经验,也未使用过元宝搜索的契机,正好借用这次机会做一个元宝Api使用指导和安卓小工具,方便自己日常写一些公众号或者头条号资讯类文章提供一些信息来源和题材.
二:怎样使用元宝搜索Api
首先需要看懂使用手册,可以参考下面的网站手册说明:
元宝搜索 元宝搜索_腾讯云https://cloud.tencent.com/document/product/1806/121811
可以看到如下输入参数:
| 参数名称 | 必选 | 类型 | 描述 |
|---|---|---|---|
| Action | 是 | String | 公共参数,本接口取值:SearchPro。 |
| Version | 是 | String | 公共参数,本接口取值:2025-05-08。 |
| Region | 否 | String | 公共参数,本接口不需要传递此参数。 |
| Query | 是 | String | 搜索词 示例值:今天北京的天气 |
| Mode | 否 | Integer | 返回结果类型,不传默认为0。(极速版不支持该参数) 枚举值:
示例值:2 |
| Site | 否 | String | 指定网址搜索/过滤。
注意: 该参数与mode参数共同使用时,仅对公开网页信源结果(自然结果)生效,对优质权威垂直信源结果(VR卡)不生效。 示例值:zhihu.com |
| Cnt | 否 | Integer | 控制返回结果条数,可取值:cnt=10/20/30/40/50。(极速版不支持该参数) 枚举值:
示例值:10 |
| Industry | 否 | String | 垂直领域搜索。(极速版不支持该参数) 枚举值:
示例值:news |
| Freshness | 否 | String | 搜索时效范围,以下五种入参形态不支持混合使用。
示例:2026.6.15分别传参d2/m2/y2进行搜索,则搜索结果的时间范围分别为“2026.6.15、2026.6.14”/“2026.6、2026.5”/“2026、2025”,以此类推。 枚举值:
示例值:d3 |
| Deeplinks | 否 | Boolean | 返回附件子链信息(仅旗舰版支持该参数) 附件子链信息包括"子链标题"和"子链URL",单个doc最多返回10条子链信息。
示例值:true |
还有输出参数:
| 参数名称 | 类型 | 描述 |
|---|---|---|
| Query | String | 原始查询语 示例值:今天北京的天气 |
| Pages | Array of String | 搜索结果页面详情,格式为json字符串。
示例值:["{"passage":"aaa"}", "{"passage":"bbb"}"] |
| Version | String | 用户版本:lite/standard/flagship(极速/标准/旗舰) 示例值:standard |
| Msg | String | 提示信息 示例值:hit black query |
| RequestId | String | 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 |
于是根据Api 的java代码示例:在自己安卓程序里面封装了相应的接口和参数对象类.
package com.yuanbao.news.model import com.google.gson.annotations.SerializedName /** * 单条信息搜索结果。 * 对应元宝搜索 SearchPro 返回 Pages 数组中的单个 JSON 字符串。 */ data class NewsItem( val title: String = "", val url: String = "", val date: String = "", val passage: String = "", val content: String = "", val site: String = "", val score: Double = 0.0, val favicon: String = "", val pics: List<Pic>? = null ) { data class Pic( val caption: String? = null, @SerializedName("origin_url") val originUrl: String? = null ) /** 优先取第一张配图作为缩略图 */ val thumbnailUrl: String? get() = pics?.firstOrNull()?.originUrl?.takeIf { it.isNotBlank() } }根据元宝输出参数写的解析数据代码:
private fun parseResponse(json: String): SearchResult { val root = gson.fromJson(json, JsonObject::class.java) val resp = root.getAsJsonObject("Response") ?: throw IllegalArgumentException("缺少 Response 字段") resp.getAsJsonObject("Error")?.let { err -> val code = err.get("Code")?.asString.orEmpty() val message = err.get("Message")?.asString.orEmpty() throw IllegalStateException("$code:$message") } val query = resp.get("Query")?.asString.orEmpty() val version = resp.get("Version")?.asString.orEmpty() val msg = resp.get("Msg")?.asString.orEmpty() val requestId = resp.get("RequestId")?.asString.orEmpty() val pages: JsonArray = resp.get("Pages")?.asJsonArray ?: JsonArray() val items = mutableListOf<NewsItem>() pages.forEach { element -> val raw = element.asString if (raw.isNotBlank()) { items.add(gson.fromJson(raw, NewsItem::class.java)) } } return SearchResult(query, version, msg, requestId, items) }还有调用方式V3签名方法:
元宝搜索 签名方法 v3_腾讯云https://cloud.tencent.com/document/product/1806/121816
根据上述手册示例代码进行代码编写如下:
import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; /** * 腾讯云 API 3.0 签名工具(TC3-HMAC-SHA256)。 * * 用于元宝搜索(wsa)标准方式接入:wsa.tencentcloudapi.com */ public class Tc3Signer { /** * 生成 Authorization 请求头。 * * @param secretId 腾讯云 SecretId * @param secretKey 腾讯云 SecretKey * @param host 接口请求域名,如 wsa.tencentcloudapi.com * @param action Action,如 SearchPro * @param version 接口版本,如 2025-05-08 * @param payload JSON 请求体字符串 * @param timestamp 请求时间戳(秒) * @param date 请求日期 yyyy-MM-dd(UTC) * @return Authorization 请求头值 */ public static String sign(String secretId, String secretKey, String host, String action, String version, String payload, String timestamp, String date) throws Exception { String contentType = "application/json; charset=utf-8"; String method = "POST"; String uri = "/"; String queryString = ""; String canonicalHeaders = "content-type:" + contentType + "\n" + "host:" + host + "\n" + "x-tc-action:" + action.toLowerCase() + "\n" + "x-tc-timestamp:" + timestamp + "\n" + "x-tc-version:" + version + "\n"; String signedHeaders = "content-type;host;x-tc-action;x-tc-timestamp;x-tc-version"; String canonicalRequest = method + "\n" + uri + "\n" + queryString + "\n" + canonicalHeaders + "\n" + signedHeaders + "\n" + sha256Hex(payload); String algorithm = "TC3-HMAC-SHA256"; String credentialScope = date + "/wsa/tc3_request"; String stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + sha256Hex(canonicalRequest); byte[] secretDate = hmacSha256(("TC3" + secretKey).getBytes(StandardCharsets.UTF_8), date); byte[] secretService = hmacSha256(secretDate, "wsa"); byte[] secretSigning = hmacSha256(secretService, "tc3_request"); String signature = hexEncode(hmacSha256(secretSigning, stringToSign)); return algorithm + " Credential=" + secretId + "/" + credentialScope + ", SignedHeaders=" + signedHeaders + ", Signature=" + signature; } private static byte[] hmacSha256(byte[] key, String data) throws Exception { Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(key, "HmacSHA256")); return mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); } private static String sha256Hex(String data) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); return hexEncode(md.digest(data.getBytes(StandardCharsets.UTF_8))); } private static String hexEncode(byte[] bytes) { StringBuilder sb = new StringBuilder(bytes.length * 2); for (byte b : bytes) { String h = Integer.toHexString(b & 0xff); if (h.length() == 1) { sb.append('0'); } sb.append(h); } return sb.toString(); } }最终根据Query获取到相应数据,于是展示出相应的信息,根据这些信息去json解析封装到NewsItem中去.
中间需要申请Apikey去获取元宝搜索权限:
可以根据该接口文档去执行相应申请步骤:
腾讯云-元宝搜索(原联网搜索API)-接入说明https://docs.qq.com/doc/DWE54SHRMdkVnRXNK
三:实现的效果
使用元宝搜索Freshness参数对应时间范围;Industry参数对应领域信息分类:
真实网站的Api调用数据如下:
最终应用:
根据上面的元宝搜索工具,去查询相应腾讯平台下的资讯,在头条号或者公众号里面去发布相应的新闻数据.