Skip to content

Commit

Permalink
Feat: 增加eslint & 可配置提交次数 (#17)
Browse files Browse the repository at this point in the history
* Feat: 增加eslint & 可配置提交次数
  • Loading branch information
meooxx authored Mar 6, 2021
1 parent 5271332 commit 341e8bc
Show file tree
Hide file tree
Showing 9 changed files with 901 additions and 120 deletions.
23 changes: 23 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module.exports = {
env: {
browser: true,
commonjs: true,
es2021: true,
},
extends: ['airbnb-base'],
parserOptions: {
ecmaVersion: 12,
},
rules: {
'no-shadow': 0,
'no-nested-ternary': 0,
eqeqeq: 0,
'no-await-in-loop': 0,
'comma-dangle': 0,
'no-use-before-define': 0,
'arrow-parens': 0,
'no-plusplus': 0,
'no-console': 0,
},
plugins: ['prettier'],
};
35 changes: 17 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@ https://github.com/xxxXXX95/yuyue/tree/master

1. 到时间直接抢购, 也叫秒杀(例如以前的口罩, 类似茅台(茅台现在限定App中抢购了😄))
2. 到时间先添加购物车 -> 到购物车提交订单(普通显卡预约抢购类)
3. 原价到时间变价

写在前面

1. 模式 1 特别说明: 此模式商品展示无明显特征(console 控制台倒是可以打印对应参数区分).**`抢购时间有可能立即开始, 也有可能需要预约结束后再等一小段时间(几分钟到半个小时不等)才可以抢购`**。需要不需要再等都遇到过。抢购时注意终端中会提示 `"当前流程是预约秒杀流程`, 这样的提示就是此模式.
2. 如果需要再等, 提交会失败但是提示有货但是抢购失败.此时请手机或者浏览器查看状态.流程页处理一部分情况请注意打印文字提示
2. 如果需要再等, 提交会失败但是提示有货.此时请手机或者浏览器查看商品最新状态.流程也处理一部分情况请注意打印文字提示
3. 模式 1 再说明: 区分流程的特征, 狗东最晚在开抢前几分钟内才设置, 程序现在已经支持自动区分了
4. 因为狗东有红包的话, 会自动勾选使用红包.为了抢购成功和快速, 配置文件中最好填写 6 位支付密码(保存密码的`config.js` **`不会从你本地上传到任何地方,请放心!!`**)
5. 已知 `windows` 系统自带终端打印出来的二维码错位, 请更换终端或者手动打开自动生成的本目录下`qrcode.png`文件扫码
6.`jd_by_mask` 改名 `jd_yuyue`.之前使用错别字防止搜索且买口罩也不符合现在仓库内容, 所以改名 yuyue
4. 因为狗东有红包的话, 会自动勾选使用红包.为了抢购成功和快速, 配置文件中`最好填写 6 位支付密码`(保存密码的`config.js` **`不会从你本地上传到任何地方,请放心!!`**)
5. 已知 `windows` 系统自带终端打印出来的二维码错位, 请更换终端或者手动打开自动生成在本目录下`qrcode.png`文件, 进行扫码
6.`jd_by_mask` 改名 `jd_yuyue`.之前使用错别字防止搜索且买口罩也不符合现在仓库内容, 所以改名 `jd_yuyue`
7.`jd_yuyue` 改名 `yuyue`, 被x东邮件通知下架. 避免出问题, 规避搜索

TG Group
Expand Down Expand Up @@ -71,7 +72,8 @@ module.exports = config;

3 在`本项目目录`(不是 nodejs 安装目录)下执行 `npm install --production` 或者 `yarn --prod`(不熟悉的, 就直接使用 npm 效果一样的) 安装依赖, 已经默认配置使用 `taobao` 镜像地址下载依赖包

4 配置`tasks-pool.js`(以前在*index.js* 中, 现在迁移出来了) 中设置日期 `date`, `forceKO`, `areadId`(如果已在 `config.js` 中设置了`areadId`, 这里无需再设置) 和要抢购的 `skuId`, 格式如下
4 配置`tasks-pool.js`(以前在*index.js* 中, 现在迁移出来了) 中设置日期 `date`, `forceKO`, `areadId`(如果已在 `config.js` 中设置了`areadId`, 这里无需再设置) 和要抢购的 `skuId`, 可选参数 新增 `submitTimes` 不填默认 10, `maxWaitingMS` 不填默认 800
格式如下

```js
// 年 月 日 时 分 秒 毫秒
Expand All @@ -90,21 +92,17 @@ const dd2 = new Date(2020, 2, 3, 20, 0, 0, 400).getTime();
// 2020/3/3 21:00:00.400
const dd3 = new Date(2020, 2, 3, 21, 0, 0, 400).getTime();

// 修改这里, 添加skuId, 抢购时间 date, 强制使用秒杀流程 forceKO(已经不推荐使用, 程序自动会判断), areaId.
// 修改这里, 添加skuId, 抢购时间 date, 强制使用秒杀流程 forceKO(已经不推荐使用, 程序自动会判断), areaId, 选填项 submitTimes, maxWaitingMS
// 需要更改 年/月/日 时:分:秒.毫秒
// skuId 获取方法, 打开任意一个商品详情页如 `https://item.jd.com/100011521400.html`, 则 `100011521400` 就是其skuId
exports.pool = [
// 1 *现在必须设置areaId*
// 如果上面 `config.js`中已经配置过了, 此处可以不用再配置`areaId`, areaId 获取在第 5 步骤说明
// 2 forceKO: true/false(已经不推荐使用, 程序自动会判断)
// true 则为强制使用秒杀流程(自己100%确定流程是秒杀时开启.常见商品maotai)
// false 的话自动判断流程

// 2 forceKO: true/false (废弃不用)
// 3 此脚本也可在非预约抢购流程中的秒杀(到时间变价那种)使用,为防止提交原价订单, 可配置提交订单重试次数 推荐 2-3 次(不明白的忽略)
// 4 如果抢购过程中出现 `请求结算页面超过xxx ms`, 请增大maxWaitingMS, 建议1000-2000之间, 不设置默认 800
{ skuId: '100011621642', date: dd1, areaId: `2_2825_51936` },
// 新增同一时间抢购多个商品
// 同一时间的不要复制多个项目同时运行, 而是像如下填写就可以
// 复制同时运行容易触发频率限制导致提交全部失败
{ skuId: ['100011621642', '100011621643'], date: dd2, areaId: `2_2825_51936` },
// skuId: '10022991959725',areaId: `2_2825_51936`, date: dd1, submitTimes: 3, maxWaitingMS: 1000
// 不同时间的sku, 复制上述项修改值, 填写在下方
];
// 设置要强制扫码登录(没搞懂使用场景的忽略此配置)
Expand All @@ -122,7 +120,7 @@ exports.forceLogin = false;
7 扫描终端中的二维码登录, 24 小时之内重启不需要再次扫码登录, `cookie` 串会保留在本地文件 `cookie.json` 中. 过期的话必须重新扫码(代码自动校验)

## Todo
- [ ] 子进程推出前, dump cookie

- [x] 合并抢购流程为添加购物车抢购流程的进程
- [x] 狗东太恶心了, 区分流程的关键参数, 等到开抢前几分钟才获取到, 要想办法兼容
- [x] 如果预约时间结束, 还需要等待一小段时间后才抢购, 程序自动等待执行(1h 内)
Expand All @@ -140,8 +138,7 @@ exports.forceLogin = false;

- 反对 jd 耍猴, 更反对滥用盈利作恶!
-`windows` 系统不友好, 有问题反馈
- 距离开始前几分钟启动, 最好不要让自己电脑在这期间黑屏待机
- 注意使用最好提前个 `1s`, 因为提交订单前要请求其他俩个接口, 提前 1s 差不多正好, 各地区不一致提前参数请参考终端提示
- 距离开始前稍近时启动, 最好不要让自己电脑在这期间黑屏待机
- 每天最好提前做一次扫码, 免得程序启动时候登录有效, 抢购过程中登录失效
- 预约每个人都很容易拿到, 不用使用脚本执行预约
- 这是 node 版本, 不熟悉的可使用 python 版本.(本版本借鉴/使用了下面部分功能和资源)
Expand All @@ -159,7 +156,9 @@ exports.forceLogin = false;

- 订单<img src="https://user-images.githubusercontent.com/13815865/77068877-56728700-6a22-11ea-8102-925cc25a4b92.png" />

更多案例: [issues/2](https://github.com/meooxx/jd_by_mask/issues/2)
- 成功案例太多了, tg群很多人都抢到了, 尤其日用品, 如日用纸, 和0.01的水果

更多案例(☝️加群): [issues/2](https://github.com/meooxx/jd_by_mask/issues/2)

## Advanced(废弃)

Expand Down
1 change: 1 addition & 0 deletions dayjs.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 17 additions & 9 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
const cluster = require('cluster');
const path = require('path');
const filePath = path.join(__dirname, 'config.js');
const fs = require('fs');
const dayjs = require('./dayjs.min.js');

const filePath = path.join(__dirname, 'config.js');
try {
fs.accessSync(filePath, fs.constants.F_OK);
} catch (e) {
Expand All @@ -13,6 +15,7 @@ try {
const { login, submitOrderProcess } = require('./jobs');
const { pool, forceLogin } = require('./tasks-pool');
const config = require('./config');

if (!config.eid || !config.fp) {
console.log('请在 config.js 按备注填写 `eid` 和 `fp`');
process.exit();
Expand All @@ -29,22 +32,26 @@ if (cluster.isWorker) {
return login(item.forceLogin);
};
const setupWork = item => {
const { date, skuId, areaId = config.areaId, forceKO = false } = item;
const {
date,
skuId,
areaId = config.areaId,
forceKO = false,
...rest
} = item;
const expectedDate = new Date(item.date);
// 任务进程
console.log(
'process.worker:',
process.pid,
'时间:',
`${expectedDate.toLocaleString('en-US', {
hour12: false,
})}.${expectedDate.getMilliseconds()}`,
dayjs(expectedDate).format('YYYY-MM-DD HH:mm:ss.SSS'),
'sku',
item.skuId
);
submitOrderProcess(date, skuId, areaId, forceKO);
submitOrderProcess(date, skuId, areaId, { forceKO, ...rest });
};
process.on('unhandledRejection', (reason, promise) => {
process.on('unhandledRejection', reason => {
console.log(reason);
});
cluster.worker.on('message', async job => {
Expand All @@ -63,16 +70,17 @@ if (cluster.isWorker) {
cluster.on('message', (_, message) => {
// 登陆流程
if (message.doneWork === 'login') {
// eslint-disable-next-line global-require
require('./codeInfo');
// 登陆完成后
for (i = 0; i < pool.length; i++) {
for (let i = 0; i < pool.length; i++) {
const item = pool[i];
cluster.fork().send({ ...item, type: 'task' });
}
}
// fork 秒杀流程
if (message.doneWork === 'forkKO') {
for (i = 0; i < message.items.length; i++) {
for (let i = 0; i < message.items.length; i++) {
const item = message.items[i];
cluster.fork().send({ ...item, type: 'task', forceKO: true });
}
Expand Down
Loading

0 comments on commit 341e8bc

Please sign in to comment.