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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值