/dingdong-node

叮咚买菜nodejs自动下单脚本,支持邮件强通知和定时任务,支持捡漏和高峰模式

Primary LanguageJavaScriptMIT LicenseMIT

注意事项

1. 本项目仅供技术学习和交流,纯属学习使用,不可用作商业行为,任何违法违规造成的问题与本人无关

2. 不要长时间运行, runInterval时长调长一些,不然有可能账号会被风控,导致无法获取购物车信息。

0. 前言

2022年初,由于上海疫情告急,出现了全民线上抢菜盛况

叮咚买菜每6:00,8:30开放让人们睡不好还基本抢不到

于是研究了一下叮咚买菜小程序,搞了这么一个脚本可以自动下单脚本

快速开始

git clone git@github.com:theajack/dingdong-node.git
cd dingdong-node
npm i

# 按照 2.填入用户配置 自行配置用户信息

npm start

1. 特性

  1. 自定义配置(用户相关信息需要自行抓包获取填入)
  2. 下单成功发送提醒邮件,可以像闹钟一样的提醒(需要配置两个邮箱)- 非必需
  3. 支持配置高峰和非高峰策略
  4. 支持配置最长运行时间,防止长时间运行被风控
  5. 定时运行(借助crontab)- 非必需

2. 填入用户配置

注意事项

  1. 本脚本针对的是叮咚买菜小程序,填入用户信息之后请不要再使用其他端,否则信息可能会失效
  2. 使用 charles 抓包, 教程

抓包环境安装配置好之后,在叮咚买菜小程序上刷新购物车,找到一条 /cart/index的请求,找 query-string,基本需要的参数都在里面了

module.exports = {    
    // 叮咚买菜小程序用户信息
    'uid': '',
    'longitude': '',
    'latitude': '',
    'station_id': '',
    'city_number': '',
    's_id': '',
    'openid': '',
    'device_token': '',

    // 以下为邮箱配置 非必需 如果要启动定时发送邮件提醒可以选一下 详情见readme.md
    'fromEmail': '', // 发送邮件的邮箱
    'toEmail': '', // 接受邮件的邮箱
    'emailCode': '', // 邮箱授权码, QQ邮箱在 设置 -> 账户 -> POP3/SMTP服务 中开启
    'emailHost': 'smtp.qq.com', // 邮箱服务器地址 如非qq邮箱 请自行更改

    // 抢菜策略,
    'runMode': 'traffic', // normal 为非高峰期策略,traffic 为高峰期策略
    'runInterval': 1000, // 每一个请求的轮询间隔
    'maxTime': 5, // 单次运行最长时间 防止被风控 单位分钟

    'useLogger': false, // 是否开启log,一般为调试使用
};

3. 邮件通知 非必需

邮件通知需要准备两个邮箱,这里以两个QQ邮箱为例

另外还需要使用iphone自带的邮件APP

发送邮箱

发送邮箱需要到 设置 => 账户 => 开启 POP3/SMTP服务;

然后将授权码和邮箱配置到 emailCode 和 fromEmail

接收邮箱

接受邮箱需要到 设置 => 账户 => 开启 IMAP/SMTP服务,复制下授权码

然后邮件APP绑定QQ邮箱,需要填入授权码

然后将邮箱配置到 toEmail

iphone绑定QQ邮箱教程;

另外,如要开启强通知(类似电话铃声),需要在iphone设置里面邮件提示声音

这个功能搭配服务器定时任务,可以有很多种玩法,比如固定时间给你发送通知,收到评论、回复通知到手机,比一般的APP通知提醒更好,可以像闹钟一样的开启

4. 配置抢菜策略

见config.js

{
    'runMode': 'normal', // normal 为非高峰期策略,traffic 为高峰期策略
    'runInterval': 1000, // 每一个请求的轮询间隔 可以自行修改
    'maxTime': 5, // 单次运行最长时间 防止被风控 单位分钟
}

5. 定时运行 非必需

以下方案适用于mac和linux,windows系统请自行找方案

命令行运行

crontab -e

在vim窗口输入

{min} {hour} * * * {nodePath} {path}/dingdong-node/main.js

min和hour表示时间,比如每天5:50开始运行,就是:50 5

nodePath 为你本地node程序的绝对目录

path为当前项目的绝对目录

定时运行教程