js 逆向爬取报销发票(一)

因为这个医院的应用做的不是很好,所以每次需要报销的时候,都需要手动的去一张张下载发票,很低效。像我这种懒人是不可能做这种重复劳动的,所以这篇文章就来写一写如何通过爬虫和逆向来自动下载发票。

利用 charles 爬取数据请求

前置:安装好 charles 或者 fiddler 等抓包工具,不做赘述。

该医院的公众号中可以查看到近期的发票信息,我们在 pc 微信中打开该页面

先清空 charles 中已经抓取到的请求,然后切换时间段,就能看到一个 gateway 的请求,结果如下图;

不难发现,接口对数据进行了加密处理,返回的内容是不可读的。不要慌,我们下一步就来尝试找找看解密函数。

解析接口数据

清理 charles sessions,然后重新打开公众号,可以看到多了很多请求,里面也有一些 js、css 文件了。然后在搜索中尝试输入 crypto,不要问为什么,因为经验告诉我大概率是可以搜到的。果然搜到了不少相关信息,嘿嘿~

然后尝试把 app.03c21be5.js 下载到本地,使用 vscode 打开并且格式化之后,继续搜索 crypto,不难找到如下代码

现在我们要做的就是尝试找到里面的一些加密变量,然后翻译成一个能用的函数进行测试,我们使用 nodejs 来编写这次的脚步,首先在本地安装 crypto-js

复制代码
npm install crypto-js -D

然后新建一个 decrypt.js 文件,按照 app.js 中的内容创建一个 decrypt 函数

javascript 复制代码
const CryptoJS = require('crypto-js');

function decryptData(e) {}

我们观察 app.js 中的 decryptData 函数,发现参数都是混淆过的,不太容易找到具体的值。但是可以看到有一个 aseKey 参数名称是没有混淆的,那么我们继续在 app.js 中搜索 aesKey,看看是否能有所发现。

现在找到了 aeskey 和 appSecret,但是 mode 和 padding 还不知道。经过一番全局搜索后,并没有找到相关的信息,那么我们可以换一种思路来逆向了。

首先获取到当前页面的链接,然后复制出来,如下图所示

然后提取出 redirect_url 中的内容,使用 decodeURIComponent 来进行还原,如下

尝试在浏览器中直接打开该链接,发现是无法正常访问的

继续观察 network 中发出的请求,不难发现也包含了 gateway 请求,返回的数据也是加密的,那么很有可能这个页面的 js 中存在解密代码。我们在开发者工具中全局搜索 decrptData 函数。

然后跳转到具体位置,又出现了熟悉的内容

尝试在 decryptData 函数中挂个断点,刷新页面。然后,见证奇迹的时刻到了,您猜这么着,断点就进来了,嘿嘿~

查看 c.a 变量,进入 entry.js 文件中

跳转过来的内容如下,虽然找到代码了,但是还是不知道 mode 具体是什么值

接着打开 crypto-js 的 github 仓库,搜索 "this._cipher.encryptBlock(e, t)"

终于找到了,mode 使用的是 ECB。然后如法炮制,我们也不难找到 padding 对应的值是 Pkcs7

回到我们自己的 decrypt.js 中,编写代码如下

javascript 复制代码
const CryptoJS = require('crypto-js');
const fs = require('fs');

const aesKey = 'vss7db748e839799';

var getCryptoValue = function () {
  return CryptoJS.enc.Utf8.parse(aesKey);
};

function decryptData(e) {
  var decipher = CryptoJS.AES.decrypt(e, getCryptoValue(), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
    iv: '',
  });
  return CryptoJS.enc.Utf8.stringify(decipher);
}

// data.txt 存放的是待解密的数据
const data = fs.readFileSync('data.txt', 'utf-8');

console.log(decryptData(data));

执行 decrypt.js,发现可以成功的解析出数据了

编写爬虫脚本,批量获取发票

观察上一步中解析出来的数据,可以看到有一个 receiptUrl 字段非常惹眼,是一个 url,点击进去其实就是发票的地址

然后我们点击该地址,就可以打开对应的发票页面了

接下来就是编写 spider.js 脚本批量遍历所有的发票 list,然后下载发票保存到本地就 👌 了。

这里我使用了 puppeteer + cheerio 来解析发票页面,获取到发票真实的 url,相关的内容会在下文再更新。

相关推荐
Patrick在香港4 小时前
Claude 工具调用返回空:8 次失败里只有 1 次状态码不对,其余全带 200
爬虫·python·api·claude·香港
小静AI工程实验室1 天前
Python 爬虫中文乱码排查:严格解码、UTF-8 BOM 与 JSON 转义的 12 项实验
字符编码·爬虫·python
咖啡星人k2 天前
从自建爬虫到托管工具:数据采集选型对照表
爬虫·数据采集·mcp
电商API_180079052472 天前
拍照找同款是怎么实现的?淘宝以图搜图接口 item_search_img 对接实战
大数据·爬虫·数据挖掘·数据分析·代采api
Patrick在香港2 天前
Python 抓 0.91 GB 香港法例:Agent 的进度该写进磁盘,不是写进上下文
爬虫·python·api·claude·香港
Experience-摆渡2 天前
开源RAG知识库WeKnora深度调研:让知识自己长成体系
爬虫·docker·开源·rag
孙启超3 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
该逃避避4 天前
IP代理类型介绍:住宅IP、机房IP、移动IP等区别与选择
爬虫
科技苑4 天前
Python简单网络爬虫教程
爬虫·python
szephyr4 天前
Python 爬虫合规与反爬实战:从 requests 到 Playwright
爬虫·python·requests·playwright·反爬