Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么? 微信没有年度账单? 前端 nodejs 撸起来~ [接口实现]

什么? 微信没有年度账单? 前端 nodejs 撸起来~ [接口实现]

作者头像
ihoey
发布于 2020-01-21 07:29:25
发布于 2020-01-21 07:29:25
91600
代码可运行
举报
文章被收录于专栏:梦魇小栈梦魇小栈
运行总次数:0
代码可运行

最近逛掘金看见一片文章 非官方统计 2018 微信年度账单实现,作者利用调试微信获取到了 2018 年的所有消费明细,并根据类型进行分类统计,作文一个前端,便萌生了用 nodejs 实现一遍的想法,于是乎呢,就有了这篇文章了。

由于 @hibear 大佬是用 Java 实现的,并且自己又不会 Java,所以呢里面很多东西确实看不太懂,然后就根据核心代码撸吧。

好了,废话不多说,我们直接开始吧~

首先初始化一个项目吧,按自己的习惯,配置下需要的东西

大概配置完是这些文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.editorconfig
.gitignore
config.js
init/
package.json
README.md
src/
util/
yarn.lock

然后我们来写个接口;

我们这里选 koa 框架吧,毕竟自己还是蛮喜欢的~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Koa 框架
const Koa = require('koa')
// 实例化
const app = new Koa()
// 监听端口
app.listen(config.port)
console.log(`the server is start at port ${config.port}`)

然后我们来添加路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.js
const Koa = require('koa')
const KoaRouter = require('koa-router')

const app = new Koa()
// 创建 router 实例对象
const router = new KoaRouter()

//注册路由
router.get('/', async ctx => {
  ctx.body = 'welcome~'
})

// 添加路由中间件
app.use(router.routes())

// 对请求进行一些限制处理
app.use(router.allowedMethods())

// 监听启动端口
app.listen(config.port)
console.log(`the server is start at port ${config.port}`)

完整入口文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.js
const Koa = require('koa')
const KoaRouter = require('koa-router')
const bodyParser = require('koa-bodyparser')
const config = require('../config')

const app = new Koa()
// 创建 router 实例对象
const router = new KoaRouter()
// 账单获取核心逻辑
const wechatBill = require('./controllers/wechatBill')

// 配置ctx.body解析中间件
app.use(bodyParser())

//注册路由
router.get('/', async ctx => {
  ctx.body = 'welcome~'
})

router.post('/wechatBill', wechatBill)

// 添加路由中间件
app.use(router.routes())

// 对请求进行一些限制处理
app.use(router.allowedMethods())

// 监听启动端口
app.listen(config.port)
console.log(`the server is start at port ${config.port}`)

好了,路由写完了,我们来看核心逻辑怎么写,根据大佬的思路是模拟微信的请求,带上必要的参数就好了,这里我们使用最熟悉的 axios 吧。

由于代码太多这里就贴出核心的部分吧,完整版可以看下 github 的文件,请点击传送门-> 传送门

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (Loop) {

    if (lastResp.last_create_time < 1514736000) {
      wechatList.splice(wechatList.indexOf(wechat_id) >>> 0, 1)
      Loop = false
      console.log('任务处理完毕,2018全部数据已存入');
    }

    axios.request({
      url: `https://wx.tenpay.com/userroll/userrolllist`,
      method: 'get',
      headers: {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,en-US;q=0.8",
        "Connection": "keep-alive",
        "Cookie": `userroll_encryption=${userroll_encryption}; userroll_pass_ticket=${userroll_pass_ticket}`,
        "Host": "wx.tenpay.com",
        "Q-Auth": AUTH,
        "Q-GUID": GUID,
        "Q-UA2": UA2,
        "Referer": "https://wx.tenpay.com/?classify_type=0",
        "User-Agent": "Mozilla/5.0 (Linux; Android 8.0; MIX 2 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044408 Mobile Safari/537.36 MMWEBID/4508 MicroMessenger/7.0.1380(0x27000038) Process/tools NetType/WIFI Language/zh_CN",
        "X-DevTools-Emulate-Network-Conditions-Client-Id": ClientId,
        "X-Requested-With": "com.tencent.mm",
      },
      params: {
        classify_type: 0,
        count: PAGE_SIZE,
        exportkey,
        last_bill_id: lastResp.last_bill_id,
        last_bill_type: lastResp.last_bill_type,
        last_create_time: lastResp.last_create_time,
        last_trans_id: lastResp.last_trans_id,
        sort_type: 1,
        start_time: lastResp.start_time,
      }

    }).then((res) => {

      lastResp = res.data

      if (!lastResp || lastResp.ret_code != 0 || !lastResp.record) {
        console.log(lastResp);
        Loop = false
        ctx.body = {
          code: 2,
          res: lastResp.ret_msg || '任务请求失败'
        }
        throw new Error(`任务请求失败`)
      }

      ctx.body = {
        code: 0,
        res: '创建任务成功,正在获取账单中...'
      }

      const dataList = res.data.record.map(e => ({ wechat_id, ...e }))
      dataList.map(async e => {
        delete e.coupon
        const sql = `INSERT INTO orders(${Object.keys(e)}) VALUES (${JSON.stringify(Object.values(e))})`
        const data = await query(sql.replace(/\[|\]/g, ""))
        console.log(`存入成功`, data.insertId)
      })

    }).catch((err) => {
      console.log(err)
    });
    await sleep(1000)
  }

好了,具体的代码可以看下 github 的参考~ -> 传送门

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-182,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
日常用得到的 Koa 优雅代码指南
为什么选择 Koa 小王:为什么选择Koa? 老王:因为 Koa 比较轻量,几乎没有内置任何的额外功能。也是因为这个原因,Koa 的灵活度是很高的,喜欢折腾的人可以尝试下 小王:又轻量又几乎没有任何额
用户3806669
2021/07/06
1.9K0
日常用得到的 Koa 优雅代码指南
node.js之koa2知识点总结
第一个程序 const Koa = require('koa') const app = new Koa() app.use(async ctx => { ctx.body = 'Hello Koa2' }) app.listen(3000) console.log('server is running at port 3000') 路由 简单路由 const Koa = require('koa') const app = new Koa() const Router = require('k
YungFan
2020/12/07
4510
Node.js 模拟本地接口测试环境以及简单的代理转发服务
老猫-Leo
2023/12/11
5030
【Nodejs进阶】koa2+mySql用户注册和登录以及实现列表分页
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
微芒不朽
2022/09/13
1.6K0
Koa与常用中间件的使用
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这会带来许多问题,例如callback 的嵌套问题 ,以及异步函数中可能同步调用 callback 返回数据,可能会带来不一致性,为了解决以上问题 Koa 出现了。
越陌度阡
2020/11/26
4.6K0
Koa与常用中间件的使用
知新 | koa框架入门到熟练第一章
是由Express原班人马打造,致力于成为一个更小的,更加富有表现力的,web框架。
mySoul
2020/07/15
9890
像vue-router一样配置node路由?爽
你是不是在想,这需求俺根本不用koa、koa-router,原生的node模块就可以搞定。
前端胖头鱼
2022/07/25
5140
Nodejs+koa.js实现服务端内容(超级详细
最近在使用vue3和typesript写一个后台系统的demo。对于一些登录及内容数据不想单纯的使用假数据模拟,所以从零搭建一个nodejs的后端内容
KID.
2023/10/08
8291
Koa入门(三)Koa 路由
在 Koa 应用中,通常会使用 koa-router 模块,提供对路由的支持。那为什么需要路由呢?做前后端分离开发的朋友都遇到过,对接接口的时候后台都会提供一个地址,请求这个地址,传相应参数就能实现相应地数据处理。你可以把这个接口理解为路由的地址。
测不准
2021/04/14
1.4K0
基于koa框架写的通过code获取微信用户openid的Demo
github地址:https://github.com/xuedingmiaojun/koa-wx-auth-demo
薛定喵君
2020/05/25
9870
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.3K4
koa实践及其手撸
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。
一粒小麦
2019/07/18
1.2K0
koa实践及其手撸
【从前端到全栈】- koa快速入门指南
随着技术的不断发展,前端工程师也被赋予了越来越多的职责。不再是从前只需要切个图,加个css样式就能完成任务的切图仔了。接下来这篇文章,完成一个简单的登录注册,能让你快速上手,成为一个‘小全栈工程师’,here we go !
用户2356368
2019/04/03
9030
【从前端到全栈】- koa快速入门指南
深入浅出 Koa2:现代 Node.js 框架
Koa2 是一个现代的、简洁的 Node.js 框架,由 Express 团队设计和开发。与 Express 相比,Koa2 提供了更加精简和强大的功能,特别是其中间件处理机制和异步编程能力,深受开发者喜爱。本文将详细介绍 Koa2 的安装、基本用法、核心概念及其高级功能,并通过示例代码展示如何构建一个功能完整的 Web 应用程序。
Michel_Rolle
2024/07/31
2.7K0
关于koa2,你不知道的事
koa 是一个基于 node 实现的一个新的 web 框架,它是由 express 框架的原班人马打造。特点是优雅、简洁、表达力强、自由度高。和 express 相比,它是一个更轻量的 node 框架,因为它所有的功能都通过插件来实现,这种插拔式的架构设计模式,很符合 unix 哲学。
lucifer210
2020/04/14
7480
关于koa2,你不知道的事
鉴权实战 - Koa
Bearer token 组成:Header、payload(载荷)、Signature(签名) Header.Payload.Signature
Cellinlab
2023/05/17
4480
【koa快速入门】之基础使用
本文是koa快速入门的第一篇:基础使用,后续还会再写两篇文章,介绍「koa项目最佳实践」和「深究koa原理」。
luciozhang
2023/04/22
6180
【koa快速入门】之基础使用
Koa - 初体验(写个接口)
  这几年node.js确实是越来越火了,好多公司对node.js都开始有要求。虽说前端不一定要会后端,但想要成为一个优秀的前端,node.js是必经之路。
WahFung
2020/08/24
1.5K0
我用nodejs实现了热加载接口文件,感觉又离“serverless”进了一步
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
爱吃大橘
2022/12/27
4750
node.js开发框架--koa
koa框架:cnpm install --save-dev koa或者cnpm install --save-dev koa@2.0.0
IT工作者
2022/05/13
2.1K0
相关推荐
日常用得到的 Koa 优雅代码指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档