微信交易记录导出excel
目的:
通过抓取微信钱包->支付中心->交易记录接口的json response,格式化后输出到excel中。方便直观统计个人支出记录。
实现方式:
工具&环境
-
Charles
-
node
步骤
1. 实现PAC自动代理服务
目的:
由于手机上可能会出现很多无用的http请求,所以通过PAC自动代理的方式,对手机的http请求进行一次过滤,只转发命中的接口,没有命中的接口不走代理服务。
实现自动转发对应的需要分析数据的接口到代理服务(Charles)。
代码如下:
/* PAC-Service.js */
const http = require('http');
const fs = require('fs');
const server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type' : 'application/x-ns-proxy-autoconfig'});
fs.createReadStream('./test.pac').pipe(res);
});
server.listen('9090', '0.0.0.0');
/* test.pac */
function FindProxyForURL(url, host) {
if(dnsDomainIs(host, "wx.tenpay.com")){
return "PROXY 100.66.155.37:8000";
}
}
- 开启PAC服务 端口9090
2. 在手机上安装Charles https 证书
https://blog.csdn.net/xiaobianjava/article/details/68490127
3. 手机配置PAC代理
- 打开wiki网络详情。
- 代理处设置 自动配置
- 输入PAC服务地址 (node实现)
4. Charles抓取数据
- 打开微信 微信钱包->支付中心->交易记录
- 滚动界面,直到所要抓取支付数据全部抓取完毕。
- 把response保存到本地,保存成json文件。由于这里展示的是分页形式,所以json文件会出现多个。
5. 分析数据
- 这里我只统计 花销方式,交易时间,金额,支付方式 这几个我感兴趣的字段。
- 生成excel文件使用的是 node-xlsx
/* 统计代码 */
const fs = require('fs');
const xlsx = require('node-xlsx');
const data = [
['序号', '花销方式', '时间', '金额', '备注', '支付方式'],
];
function getData(path) {
const file = String(fs.readFileSync(path));
const record = JSON.parse(file).record;
for (let item of record) {
let buffer = [];
buffer.push('');
buffer.push(item.title);
buffer.push(new Date(item.timestamp * 1000).toLocaleString());
buffer.push(item.fee / 100);
buffer.push(item.remark);
buffer.push(item.pay_bank_name);
data.push(buffer);
}
}
function output() {
var buffer = xlsx.build([{ name: "微信花销", data: data }]);
fs.writeFileSync('微信花销.xlsx', buffer);
}
/* 这里的json都是从charles导出的response数据 */
getData('../01.json');
getData('../02.json');
getData('../03.json');
getData('../04.json');
getData('../05.json');
getData('../06.json');
getData('../07.json');
output();
问题
其中的交易记录有支出也有收入(红包)。所以在统计数据的时候需要判断当前记录的类型。
本人的记录中全是支出,所以这块没有判断。
写在最后
我本来想本地开一个https代理服务,然后通过PAC转发对应接口到本地代理服务,然后收到返回数据后直接做数据统计。
想法很美好,但是这个https服务就是不好使。等以后无聊再铜鼓铜鼓。
继续上面的
最近偶然间发现阿里巴巴开源的一款支持https的代理服务。使用node.js实现,正好符合我的需求。http://anyproxy.io/
,但是按照官网的文档,写了一个服务后,发现并不能抓取到我想要的数据,原因官方给出的是
部分Android APP可能会开启证书校验,验证证书是不是自己原始的证书,导致代理失败,此时可能无法代理。
Issues下有网友评论,mitmproxy
这个工具则没有这个问题。恰好npm上有一个用node实现的mitmproxy,node-mitmproxy
,我就拿来用了。刚好能满足我需要的https代理。
node-mitmproxy的github地址是:
https://github.com/wuchangming/node-mitmproxy
项目地址
https://github.com/qiushangzhe/wechatPayRecordExport