微信交易记录导出excel

目的:

通过抓取微信钱包->支付中心->交易记录接口的json response,格式化后输出到excel中。方便直观统计个人支出记录。

实现方式:

工具&环境

  1. Charles

  2. 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

上篇egg源码窥视之cluster
下篇在linux下安装mysql