自学链接👉DeathNote

📣仅用于交流学习,请下载后 24h 之内自行删除。本篇只是记录一下学习途中遇到的一些问题,和自己的解决方法。

本机环境:

  • Node.js: v20.11.1
  • OS: Ubuntu

# didi

# 安装依赖

直接运行 didi.js ,会提示缺少 Error: Cannot find module 'got' 依赖,这里不能直接安装 got 依赖,如果直接安装再次运行会报以下错误:

Error [ERR_REQUIRE_ESM]: require() of ES Module /*****/node_modules/got/dist/source/index.js from /*****/DeathNote/didi.js not supported. 
Instead change the require of index.js in /*****/DeathNote/didi.js to a dynamic import() 
which is available in all CommonJS modules.   
	at Object. (/*****/DeathNote/didi.js:19:951) {  
		code: 'ERR_REQUIRE_ESM' 
	}
Node.js v20.11.1

大概意思是脚本中使用 require() 函数来加载一个设计为 ES 模块(ESM)的 JavaScript 模块,但是 require() 是 CommonJS(CJS)模块系统的加载机制。从 Node.js 的某些版本开始,ES 模块和 CommonJS 模块具有不同的加载机制。这是因为 ESM 使用 import/export 语法,而 CommonJS 使用 require/module.exports 。错误消息中建议的解决方案是将 require() 调用更改为 import() ,这是一个动态导入的语法,它可以在 CommonJS 模块中使用,并且允许加载 ES 模块。

官方给的建议只能是参考 ,当我们看代码文件时,会发现好多地方用了 CJS 模块系统的加载机制。能改,但会很痛苦😣。我们从另一个角度出发,既然加载机制不同,可能跟这个依赖有关系。问了一下 GPT 查阅资料,得出以下结论:

got 库是一个支持 Promise 的 HTTP 请求库,并且自版本 11 起,它被设计为只支持 ESM(ES 模块)。因此,如果您希望使用 got 并且坚持使用 CommonJS 模块系统,您将需要使用 got 的一个早期版本,该版本仍然支持 CommonJS。

要安装一个支持 CommonJS 的版本的 got ,您可以使用 npmyarn 来安装 10.x 版本或更早的版本。例如,您可以使用以下命令来安装 got 的 10.x 版本:

npm install got@11

或者,如果您使用 yarn

yarn add got@11

后面缺啥安装啥就行了,只有 got 依赖特殊。

npm install crypto-js
npm install ws
# 获取 TOKEN

依赖安装完毕之后,第一次运行脚本后会自动创建 didiCookie.txt ,我们只需将 token 填入里面就可以。这里给出两种获取方法 (第二种方便一点,但不清楚后端逻辑):

第一种[1]

  1. 打开 https://v.didi.cn/8AqmLa1?source_id=0hF8j5Cy9
  2. 点击立即领取,登录
  3. 调出 F12 ,在控制台输入 localStorage.getItem('didih5_trinity_login_ticket_role_121230').replace(/"/g, '')

第二种:

  1. 打开 https://service.leafxxx.win/didi/login.html
  2. 输入手机号,验证码,登录
  3. 提取 ticket 里面的内容

比如我们的 token 是 PVI6AC4EHujPYX****** ,填入到 txt 中的内容应该为 #PVI6AC4EHujPYX******

基本上到这就结束了,其他细节修改可参考源代码更改。

# 定时启动

创建一个脚本,用来管理 didi 的运行。先通过 which node 获取 node 的安装位置。

vim didi.sh
# didi.sh
cd /=YOUR_PATH=/DeathNote
/=YOUR_NODE_PATH=/node ./didi.js
# 退出给脚本添加执行权限
chmod +x didi.sh

结合 crontab 定时启动, crontab -e 进入编辑

# 每隔 4 个小时执行 didi 脚本获取福利
5 0-23/4 * * *  /=YOUR_PATH=/DeathNote/didi.sh > /=YOUR_PATH=/DeathNote/didi.log 2>&1

# meituan

环境依赖参考 didi 环境依赖,如果已经安装过可以略过。

# 获取 TOKEN

参考这篇博客[2]

  1. 访问网址: https://passport.meituan.com/useraccount/ilogin?backurl=https://i.meituan.com&risk_app=-1&risk_partner=-1&risk_platform=-1 。我们通过验证码进行登录美团,最好用电脑,因为我们要 F12 抓取 cookie
  2. 登录美团后,我们按下键盘的 F12,打开浏览器开发者工具,选择 network,找到 www.meituan.com headers,找到里面的 token 字段。我们将它的值赋值到 meituanCookie 即可。注意一定是 Ag 开头的 token 字段。
  3. 当 token 过期时,可以重新直接访问 https://www.meituan.com/ 抓取 toekn。
# 定时启动

创建一个脚本,用来管理 meituan 的运行。

vim meituan.sh
# meituan.sh
export meituanCookie="Ag**********"
/=YOUR_NODE_PATH=/node /=YOUR_PATH=/DeathNote/meituanV3.js
# 退出给脚本添加执行权限
chmod +x meituan.sh

结合 crontab 定时启动, crontab -e 进入编辑

# 每天 10 点 15 点 17 点有券可以抽
2 0,10,15,17,21 * * *  /=YOUR_PATH=/DeathNote/meituan.sh > /=YOUR_PATH=/DeathNote/meituan.log 2>&1

# 设置 QQ 提醒

# 部署 QQ 机器人

参考 https://lagrangedev.github.io/Lagrange.Doc/Lagrange.OneBot/Config/ 快速部署自己的 QQ 机器人

# 可执行权限(可选)
chmod +x ./Lagrange.OneBot
# 运行
./Lagrange.OneBot

扫码登录 QQ 机器人,然后在生成的配置文件中添加正向 HTTP 配置,重新运行 ./Lagrange.OneBot 。关于 HTTP POST 配置本人没有配置成功,就先搁置了。

# 测试 QQ 机器人服务

测试服务是否启动:

import requests
params = {'user_id': ADMIN_QQ, 'message': '测试', 'access_token': ''}
r = requests.get(url="http://127.0.0.1:8083/send_private_msg", params=params)
print(r.text)

image-20240423191859766

# 修改提醒文件

DeathNote 的提醒文件是 sendNotify.js ,要开启 QQ 提醒,首先要完善相关变量。

image-20240423192718210

我们开启了 get 请求,所以把源码中的 post 请求改为 get 请求,改动了三处代码,具体更改如下:

image-20240423193333190

新增的代码截取不全,具体如下:

const queryString = Object.entries({
    message: `${text}\n${desp}`,
    user_id: GOBOT_QQ,
    access_token: GOBOT_TOKEN
}).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&');

  1. 滴滴自动领取优惠券 - 王明的文章 - 知乎 ↩︎

  2. 美团 Token 获取教程 ↩︎