挖财记账免费导出账单数据

不用开会员,自己导出账单数据

把挖财查询接口的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 的文件,其中包含了从接口请求中抓取并整理的数据。

接下来把这个文件导入其他记账软件就好啦!

不同软件会有不同的模板哦,注意修改!