【元宝搜索开发者征文大赛】使用元宝搜索Api制作一个安卓应用搜索工具
本文介绍基于腾讯云元宝搜索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 混合结果示例值2Site否String指定网址搜索/过滤。指定网址搜索需要查询某个特定网址的内容时传入Siteqq.com实现只搜索qq.com的结果每次搜索仅支持指定一个域名。指定网址过滤需要排除某个特定网址的内容时传入Siteexclude:qq.com|sohu.com实现过滤qq.com和sohu.com的结果每次搜索最多支持过滤五个域名。注意 该参数与mode参数共同使用时仅对公开网页信源结果自然结果生效对优质权威垂直信源结果VR卡不生效。示例值zhihu.comCnt否Integer控制返回结果条数可取值cnt10/20/30/40/50。极速版不支持该参数枚举值10 返回10条结果20 返回20条结果30 返回30条结果40 返回40条结果50 返回50条结果示例值10Industry否String垂直领域搜索。极速版不支持该参数枚举值gov 政府news 新闻acad 学术finance 财经示例值newsFreshness否String搜索时效范围以下五种入参形态不支持混合使用。d[N]最近N天N取值1-30整数N值为空时默认N1。m[N]最近N月N取值1-12整数N值为空时默认N1。y[N]最近N年N取值1-5整数N值为空时默认N1。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示例值d3Deeplinks否Boolean返回附件子链信息仅旗舰版支持该参数附件子链信息包括子链标题和子链URL单个doc最多返回10条子链信息。true返回false不返回未传参时默认不返回示例值true还有输出参数参数名称类型描述QueryString原始查询语示例值今天北京的天气PagesArray of String搜索结果页面详情格式为json字符串。title结果标题date内容发布时间url内容发布源urlpassage标准摘要content动态摘要极速版不返回该字段site网站名称部分不知名站点结果可能为空score相关性得分取值01越靠近1表示越相关authority_level权威度得分取值05数值越大表示越权威仅旗舰版返回该字段pics图片列表单个doc返回010条极速版不返回该字段caption图片描述origin_url源图url地favicon网站图标链接部分不知名站点结果可能为空deeplinks附件子链信息单个doc最多返回10条子链信息。仅旗舰版返回该字段通过Deeplinks入参控制title子链标题url子链地址示例值[{passage:aaa}, {passage:bbb}]VersionString用户版本lite/standard/flagship极速/标准/旗舰示例值standardMsgString提示信息示例值hit black queryRequestIdString唯一请求 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: ListPic? 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 mutableListOfNewsItem() 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-ddUTC * 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; charsetutf-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调用数据如下最终应用根据上面的元宝搜索工具去查询相应腾讯平台下的资讯在头条号或者公众号里面去发布相应的新闻数据.