什麼? 微信沒有年度賬單? 前端 nodejs 擼起來~ [介面實現]
- 2020 年 1 月 21 日
- 筆記
最近逛掘金看見一片文章 非官方統計 2018 微信年度賬單實現,作者利用調試微信獲取到了 2018
年的所有消費明細,並根據類型進行分類統計,作文一個前端,便萌生了用 nodejs
實現一遍的想法,於是乎呢,就有了這篇文章了。
由於 @hibear
大佬是用 Java
實現的,並且自己又不會 Java
,所以呢裡面很多東西確實看不太懂,然後就根據核心程式碼擼吧。
好了,廢話不多說,我們直接開始吧~
首先初始化一個項目吧,按自己的習慣,配置下需要的東西
大概配置完是這些文件
.editorconfig .gitignore config.js init/ package.json README.md src/ util/ yarn.lock
然後我們來寫個介面;
我們這裡選 koa
框架吧,畢竟自己還是蠻喜歡的~
// Koa 框架 const Koa = require('koa') // 實例化 const app = new Koa() // 監聽埠 app.listen(config.port) console.log(`the server is start at port ${config.port}`)
然後我們來添加路由
// 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}`)
完整入口文件
// 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
的文件,請點擊傳送門-> 傳送門
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
的參考~ -> 傳送門