背景
人在上海,之前做的核酸,总觉得该出了,可是每次打开健康云 / 随申办,结果都是“待检测机构上传”,我和浦东的朋友,分别是 0.5 天 - 2 天时间出结果,等待时间很 “蕉绿”,在手机频频点击,也有点浪费生命。
要是它自动刷新结果就好了,不用我每次 —— 打开手机 - 找到微信 / 支付宝 - 打开健康云 / 随申办 - 点击查看结果。
思路
笔者早前做移动端 H5 开发的时候,有配置过 Charles 环境,也就是说 —— 我手机连上电脑的 Charles 后,手机打开每个网页,Charles 里都能看到接口的请求和返回。
基于此,就可以看到接口的 URL、请求参数(包括 headers 和 body 等我本人的个性化参数),然后写一个 nodejs 脚本去轮询不就行了么?
开动。
实现步骤
一、手机连上电脑的 Charles
手机连上电脑的 Charles 抓包,这里就简要介绍下,不详细说明了,网上搜一下教程很多。
1、电脑安装并开启 Charles ,安装电脑系统证书后,点击如图:
2、手机代理连上 Charles,按 (1)指示的配置设置代理的服务器和端口,然后浏览器打开 chls.pro/ssl 安装对应的证书并信任:
二、手机打开微信 - 健康云小程序 - 核酸检测结果,Charles 里能看到接口的请求和返回。
当然有人问用支付宝随申办行不行,我 Charles 没抓到,进入随申办结果页,请求非常多有十几个,也可能是我漏了。
而健康云应该就一两个,很快就能找到这个接口。
三、实现接口请求
1、如果你会一些 nodejs,就可以根据以上 URL、请求参数(包括 headers 和 body 等我本人的个性化参数),写代码来发起请求了。
怎么实现这里不详细说,因为最后会放完整的示例代码。
2、借助工具的做法:
这里用到了 Charles 拷贝 cUrl 命令 -> 通过 postman 将 cURL 命令转成接口连接,最后从 postman 提取出 nodejs(适用于不擅长 nodejs 请求接口 / 比较懒得去确定一个个 headers 参数的同学)。
(1)cUrl 确认能不能请求通
在 Charles 选中这个接口,右键点击 Copy cURL Request:既可将 cURL 命令命令复制到剪贴板
然后打开任意一个命令窗口,直接粘贴,然后回车:就可以看到,结果返回了。
但是 cUrl 怎么轮询我不会,这就要考虑转成 nodejs 请求代码再去轮询了。怎么实现呢,想起了 postman。
(2)cURL 命令,借用 postman,得到 nodejs 代码。
打开 postman 应用,左上角 File - Import,选择 Raw Text,将刚刚的 cCURL 命令直接粘贴进去,点击 Continue - Import。
这样,postman 链接中,请求 headers 和 body 也都有了,点击「Send」可以看到返回了:
接下来,从 postman 获取 nodejs 代码,只需要点击 </> 也就是代码,然后选择你熟悉的 Nodejs - Request:
拷贝出来,就是完整的 nodejs 代码。
四、完善 nodejs 代码(增加轮询)后运行。
创建一个文件比如叫 lunxun.js,粘贴从 postman 提取到的 nodejs 代码如下:
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://h5.wdjky.com/gw/nad-biz-register-queryReportEncrypted',
'headers': {
'Host': 'h5.wdjky.com',
'Accept': 'text/plain, */*; q=0.01',
'timestamp': '1649245676026',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'token': 'xxxx', // xxxx 改成你自己的
'lightAppCode': '10000',
'Origin': 'https://h5.wdjky.com',
'channelCode': '10039',
// 'User-Agent': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
// 'Referer': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
'Content-Type': 'application/json; charset=utf-8',
// 'request-id': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
},
body: '{"accountId":"xxxx","publicKey":"xxxx"}' // xxxx 改成你自己的
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
复制代码
稍加改进,比如增加轮询,最终得到:
// 注意,主要改下面这些:
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://h5.wdjky.com/gw/nad-biz-register-queryReportEncrypted',
'headers': {
'Host': 'h5.wdjky.com',
'Accept': 'text/plain, */*; q=0.01',
'timestamp': '1649245676026',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'token': 'xxxx', // xxxx 改成你自己的
'lightAppCode': '10000',
'Origin': 'https://h5.wdjky.com',
'channelCode': '10039',
// 'User-Agent': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
// 'Referer': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
'Content-Type': 'application/json; charset=utf-8',
// 'request-id': 'xxxx', // 非必需字段(xxxx 改成你自己的,也可以不传)
},
body: '{"accountId":"xxxx","publicKey":"xxxx"}' // xxxx 改成你自己的
};
// 重点来了 —— 轮询:
function update() {
request(options, function (error, response) {
if (error) return console.error(error);
const body = JSON.parse(response.body)
const natResult = body.data[0].natResult
console.log(natResult);
});
}
setInterval(() => {
update()
}, 2000)
复制代码
借助工具后,我发现一共 36 行代码,有 30 行都是工具给我写的。
最后就是运行它:
yarn add request && node lunxun.js
如果你喜欢用 pnpm 则是 pnpm add request && node lunxun.js
即可。
五、来看看效果
不断请求的效果:
结果出现:
小结
本文介绍了,如果让核酸检测结果自动刷新给我们自己看。主要借助了 Charles 工具来抓包健康云结果页的请求和返回,然后转成 nodejs 脚本去发请求(参数都有,熟悉 nodejs 的同学其实可以直接开写。当然也可以借助工具,本文介绍了如果借用 cURL 和 postman 获取发起接口请求的 nodejs 代码),最后增加轮询部分。