不用开会员,自己导出账单数据
把挖财查询接口的json数据解析成csv,再把csv文件导入到其他记账软件中
一、准备工作
1、确保你已经安装了Node.js
2.执行命令
mkdir my-project
cd my-project
3. 初始化Node.js项目
npm init -y
4.安装Puppeteer和csv-writer
npm install puppeteer csv-writer
二、开始操作
在项目目录中创建一个JavaScript文件,例如 index.js
代码如下:
const puppeteer = require('puppeteer');
const { createObjectCsvWriter } = require('csv-writer');
const readline = require('readline');
const fs = require('fs');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 用于存储所有请求的数据
const allData = [];
// 用于跟踪请求的计数器
let requestCount = 0;
// 监听请求和响应
page.on('response', async (response) => {
const request = response.request();
if (request.resourceType() === 'xhr') {
const url = request.url();
requestCount++;
// 只处理第1个、第3个、第5个等接口
if (requestCount % 2 !== 0) {
try {
const responseBody = await response.text();
console.log('Request URL:', url);
console.log('Response:', responseBody);
// 处理响应数据
try {
const json = JSON.parse(responseBody);
console.log('Parsed JSON:', json);
// 整理数据
const processedData = json.data.dailyItems.flatMap(item => {
if (item.flowList.length !== 0) {
let flowList=item.flowList
return flowList.map(flowItem => ({
'收支类型': '支出',
'账单类型': '普通收支',
'金额': flowItem.amount / 100,
'手续费': '',
'不计收支': '否',
'不计预算': '否',
'分类': flowItem.categoryName,
'子分类': '',
'记账日期': formatTimestamp(item.date),
'备注信息': flowItem.comment,
'标签': '',
'报销状态': '否',
'退款状态': '否',
'退款金额': '',
'账本名称': '',
'账户名称': '',
'转入账户名称': '',
'借款账户名称': ''
}));
}
return [];
});
// 将数据添加到全局数组
allData.push(...processedData);
console.log('Data added to global array');
} catch (error) {
console.error('Error parsing JSON:', error);
}
} catch (error) {
if (error.message.includes('Could not load body for this request')) {
console.warn('Skipping preflight request:', url);
} else {
console.error('Error fetching response body:', error);
}
}
}
}
});
// 创建CSV writer
const csvWriter = createObjectCsvWriter({
path: 'output.csv',
header: [
{ id: '收支类型', title: '收支类型' },
{ id: '账单类型', title: '账单类型' },
{ id: '金额', title: '金额' },
{ id: '手续费', title: '手续费' },
{ id: '不计收支', title: '不计收支' },
{ id: '不计预算', title: '不计预算' },
{ id: '分类', title: '分类' },
{ id: '子分类', title: '子分类' },
{ id: '记账日期', title: '记账日期' },
{ id: '备注信息', title: '备注信息' },
{ id: '标签', title: '标签' },
{ id: '报销状态', title: '报销状态' },
{ id: '退款状态', title: '退款状态' },
{ id: '退款金额', title: '退款金额' },
{ id: '账本名称', title: '账本名称' },
{ id: '账户名称', title: '账户名称' },
{ id: '转入账户名称', title: '转入账户名称' },
{ id: '借款账户名称', title: '借款账户名称' },
// 添加其他字段
],
});
function formatTimestamp(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
}
// 导航到目标网页
await page.goto('https://jz.wacaijizhang.com/jz-pc/flow'); // 这里是挖财的网址
// 使用 readline 读取用户输入
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Press any key to end the script... ', (answer) => {
console.log('Script ended by user.');
// 在脚本结束时写入所有收集的数据
(async () => {
await csvWriter.writeRecords(allData);
console.log('CSV file written successfully');
})().finally(() => {
rl.close();
browser.close();
});
});
})();
挖财接口的数据格式:
整理数据的代码就是把json中有用的信息提取出来,组成其他记账软件的模板,如下:
这里不知道什么原因,点击一次查询挖财会调用两次接口,所以做了处理,只取奇数次的接口数据添加到数组中,写入csv文件。
不需要的话可以把if (requestCount % 2 !== 0) {}这一层删除
三、生成结果
运行命令
node index.js
这里就把当前显示的数据写入output.csv文件了,多次查询就可以把每次查询的结果都追加写入文件了,在命令行随意输入关闭脚本。
脚本执行完成后,你会在项目目录中找到一个名为 output.csv
的文件,其中包含了从接口请求中抓取并整理的数据。
接下来把这个文件导入其他记账软件就好啦!
不同软件会有不同的模板哦,注意修改!