☰
【元宝搜索开发者征文大赛】使用元宝搜索Api制作一个安卓应用搜索工具
2026/10/30 9:58:33 网站建设 项目流程

本文介绍基于腾讯云元宝搜索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。(极速版不支持该参数)

枚举值:

  • 0: 公开网页信源结果
    注:旗舰版在此模式下会额外返回一部分不影响接口耗时的“优质权威垂直信源”结果。
  • 1: 优质权威垂直信源结果
  • 2: 混合结果

示例值:2
Site否String

指定网址搜索/过滤。

  • 指定网址搜索:需要查询某个特定网址的内容时,传入"Site=qq.com",实现只搜索qq.com的结果;每次搜索仅支持指定一个域名。
  • 指定网址过滤:需要排除某个特定网址的内容时,传入"Site=exclude:qq.com|sohu.com",实现过滤qq.com和sohu.com的结果;每次搜索最多支持过滤五个域名。

注意: 该参数与mode参数共同使用时,仅对公开网页信源结果(自然结果)生效,对优质权威垂直信源结果(VR卡)不生效。


示例值:zhihu.com
Cnt否Integer

控制返回结果条数,可取值:cnt=10/20/30/40/50。(极速版不支持该参数)

枚举值:

  • 10: 返回10条结果
  • 20: 返回20条结果
  • 30: 返回30条结果
  • 40: 返回40条结果
  • 50: 返回50条结果

示例值:10
Industry否String

垂直领域搜索。(极速版不支持该参数)

枚举值:

  • gov: 政府
  • news: 新闻
  • acad: 学术
  • finance: 财经

示例值:news
Freshness否String

搜索时效范围,以下五种入参形态不支持混合使用。

  • d[N]:最近N天,N取值1-30整数,N值为空时默认N=1。

  • m[N]:最近N月,N取值1-12整数,N值为空时默认N=1。

  • y[N]:最近N年,N取值1-5整数,N值为空时默认N=1。

  • yyyy-mm-dd:指定某一日。(不得早于1970-01-01,不得晚于请求当天日期)

  • yyyy-mm-dd,yyyy-mm-dd:从日期A至日期B,包含AB。(日期B不得晚于日期A;二者均不得早于1970-01-01,不得晚于请求当天日期)

示例:2026.6.15分别传参d2/m2/y2进行搜索,则搜索结果的时间范围分别为“2026.6.15、2026.6.14”/“2026.6、2026.5”/“2026、2025”,以此类推。

枚举值:

  • d7: 最近七天
  • m3: 最近三月
  • y2: 最近两年
  • 2026-08-20: 2026-08-20当天
  • 2026-08-20,2026-08-30: 2026-08-20至2026-08-30

示例值:d3
Deeplinks否Boolean

返回附件子链信息(仅旗舰版支持该参数)

附件子链信息包括"子链标题"和"子链URL",单个doc最多返回10条子链信息。

  • true:返回
  • false:不返回
  • 未传参时默认不返回

示例值:true

还有输出参数:

参数名称类型描述
QueryString

原始查询语


示例值:今天北京的天气
PagesArray of String

搜索结果页面详情,格式为json字符串。

  • title:结果标题

  • date:内容发布时间

  • url:内容发布源url

  • passage:标准摘要

  • content:动态摘要(极速版不返回该字段)

  • site:网站名称,部分不知名站点结果可能为空

  • score:相关性得分,取值0~1,越靠近1表示越相关

  • authority_level:权威度得分,取值0~5,数值越大表示越权威(仅旗舰版返回该字段)

  • pics:图片列表,单个doc返回0~10条(极速版不返回该字段)

    • caption:图片描述
    • origin_url:源图url地
  • favicon:网站图标链接,部分不知名站点结果可能为空

  • deeplinks:附件子链信息,单个doc最多返回10条子链信息。(仅旗舰版返回该字段,通过Deeplinks入参控制)

    • title:子链标题
    • url:子链地址

示例值:["{"passage":"aaa"}", "{"passage":"bbb"}"]
VersionString

用户版本:lite/standard/flagship(极速/标准/旗舰)


示例值:standard
MsgString

提示信息


示例值:hit black query
RequestIdString唯一请求 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调用数据如下:

最终应用:

根据上面的元宝搜索工具,去查询相应腾讯平台下的资讯,在头条号或者公众号里面去发布相应的新闻数据.

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询