Browse Source

<refactor>(README): Add more guides and comments

master
Louis Young 3 years ago
parent
commit
7fc3745058
  1. 12
      .idea/workspace.xml
  2. 107
      README.md
  3. 1
      config.ini
  4. 25
      get_eid_fp.html
  5. 3
      requirements.txt

12
.idea/workspace.xml

@ -2,9 +2,10 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="557626c8-a0b7-4bf6-b000-aaaff199c3dd" name="默认更改列表" comment=""> <list default="true" id="557626c8-a0b7-4bf6-b000-aaaff199c3dd" name="默认更改列表" comment="">
<change afterPath="$PROJECT_DIR$/README的副本.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/get_eid_fp.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/JD_SHOPPER.log" beforeDir="false" afterPath="$PROJECT_DIR$/JD_SHOPPER.log" afterDir="false" /> <change beforePath="$PROJECT_DIR$/config.ini" beforeDir="false" afterPath="$PROJECT_DIR$/config.ini" afterDir="false" />
<change beforePath="$PROJECT_DIR$/WaitingAndBuy.py" beforeDir="false" afterPath="$PROJECT_DIR$/WaitingAndBuy.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -26,6 +27,11 @@
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" /> <property name="last_opened_file_path" value="$PROJECT_DIR$" />
</component> </component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
</key>
</component>
<component name="RunManager"> <component name="RunManager">
<configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="jd-shopper" /> <module name="jd-shopper" />
@ -66,7 +72,7 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1625960643880</updated> <updated>1625960643880</updated>
<workItem from="1625960646818" duration="5632000" /> <workItem from="1625960646818" duration="5632000" />
<workItem from="1625970377756" duration="1076000" /> <workItem from="1625970377756" duration="2848000" />
</task> </task>
<servers /> <servers />
</component> </component>

107
README.md

@ -1,5 +1,12 @@
# JD_SHOPPER # JD_SHOPPER
[![version](https://img.shields.io/badge/python-3.4+-blue.svg)](https://www.python.org/download/releases/3.4.0/)
[![status](https://img.shields.io/badge/status-stable-green.svg)](https://github.com/tychxn/jd-assistant)
[![license](https://img.shields.io/badge/license-GPL-blue.svg)](./LICENSE)
[![star, issue](https://img.shields.io/badge/star%2C%20issue-welcome-brightgreen.svg)](https://github.com/tychxn/jd-assistant)
京东抢购助手( 1.预约商品 2.秒杀抢购商品 3.缺货上架自动加购物车下单)
## 特别声明: ## 特别声明:
* 本仓库发布的`JD_SHOPPER`项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 * 本仓库发布的`JD_SHOPPER`项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
@ -23,53 +30,25 @@
> ***您使用或者复制了本仓库且本人制作的任何代码或项目,则视为`已接受`此声明,请仔细阅读*** > ***您使用或者复制了本仓库且本人制作的任何代码或项目,则视为`已接受`此声明,请仔细阅读***
> ***您在本声明未发出之时点使用或者复制了本仓库且本人制作的任何代码或项目且此时还在使用,则视为`已接受`此声明,请仔细阅读*** > ***您在本声明未发出之时点使用或者复制了本仓库且本人制作的任何代码或项目且此时还在使用,则视为`已接受`此声明,请仔细阅读***
## 简介
通过我这段时间的使用(2020-12-12至2020-12-17),证实这个脚本确实能抢到茅台。我自己三个账号抢了四瓶,帮两个朋友抢了4瓶。
大家只要确认自己配置文件没有问题,Cookie没有失效,坚持下去总能成功的。
根据这段时间大家的反馈,除了茅台,其它不需要加购物车的商品也不能抢。具体原因还没有进行排查,应该是京东非茅台商品抢购流程发生了变化。
为了避免耽误大家的时间,先不要抢购非茅台商品。
等这个问题处理好了,会上线新版本。
## 暗中观察
根据12月14日以来抢茅台的日志分析,大胆推断再接再厉返回Json消息中`resultCode`与小白信用的关系。
这里主要分析出现频率最高的`90016`和`90008`。
### 样例JSON
```json
{'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 90016, 'skuId': 0, 'success': False}
{'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 90008, 'skuId': 0, 'success': False}
```
### 数据统计
| 案例 | 小白信用 | 90016 | 90008 | 抢到耗时 |
| ---- | ---- | ---- | ---- | ---- |
| 张三 | 63.8 | 59.63% | 40.37% | 暂未抢到 |
| 李四 | 92.9 | 72.05% | 27.94% | 4天 |
| 王五 | 99.6 | 75.70% | 24.29% | 暂未抢到 |
| 赵六 | 103.4 | 91.02% | 8.9% | 2天 |
### 猜测
推测返回90008是京东的风控机制,代表这次请求直接失败,不参与抢购。
小白信用越低越容易触发京东的风控。
从数据来看小白信用与风控的关系大概每十分为一个等级,所以赵六基本上没有被拦截,李四和王五的拦截几率相近,张三的拦截几率最高。
风控放行后才会进行抢购,这时候用的应该是水库计数模型,假设无法一次性拿到所有数据的情况下来尽量的做到抢购成功用户的均匀分布,这样就和概率相关了。
> 综上,张三想成功有点困难,小白信用是100+的用户成功几率最大。
## 主要功能 ## 主要功能
- 登陆京东商城([www.jd.com](http://www.jd.com/)) - 登陆京东商城([www.jd.com](http://www.jd.com/))
- 用京东APP扫码给出的二维码 - 手机扫码登录
- 预约茅台 - 保存/加载登录cookies (可验证cookies是否过期)
- 定时自动预约 - 商品查询操作
- 秒杀预约后等待抢购 - 提供完整的[`地址⇔ID`](./area_id/)对应关系
- 定时开始自动抢购 - 根据商品ID和地址ID查询库存
- 根据商品ID查询价格
- 购物车操作
- 清空/添加购物车 (无货商品也可以加入购物车,预约商品无法加入)
- 获取购物车商品详情
- 订单操作
- 获取订单结算页面信息 (商品详情, 应付总额, 收货地址, 收货人等)
- 提交订单(使用默认地址)
- 其他
- 商品预约
- 用户信息查询
## 运行环境 ## 运行环境
@ -77,10 +56,18 @@
## 第三方库 ## 第三方库
- 需要使用到的库已经放在requirements.txt,使用pip安装的可以使用指令 - [Requests](http://docs.python-requests.org/en/master/)
`pip install -r requirements.txt` - [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
- 如果国内安装第三方库比较慢,可以使用以下指令进行清华源加速 - [lxml](https://lxml.de)
`pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/`
安装:
```sh
pip install -r requirements.txt
```
如果国内安装第三方库比较慢,可以使用以下指令进行清华源加速:
```sh
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
```
## 使用教程 ## 使用教程
#### 1. 推荐Chrome浏览器 #### 1. 推荐Chrome浏览器
@ -88,10 +75,9 @@
#### 3. 填写config.ini配置信息 #### 3. 填写config.ini配置信息
(1)`eid`和`fp`找个普通商品随便下单,然后抓包就能看到,这两个值可以填固定的 (1)`eid`和`fp`找个普通商品随便下单,然后抓包就能看到,这两个值可以填固定的
> 随便找一个商品下单,然后进入结算页面,打开浏览器的调试窗口,切换到控制台Tab页,在控制台中输入变量`_JdTdudfp`,即可从输出的Json中获取`eid`和`fp`。 > 随便找一个商品下单,然后进入结算页面,打开浏览器的调试窗口,切换到控制台Tab页,在控制台中输入变量`_JdTdudfp`,即可从输出的Json中获取`eid`和`fp`。
> 不会的话参考原作者的issue https://github.com/zhou-xiaojun/jd_mask/issues/22 > 不会的话参考作者3的👉 [使用教程请参看Wiki](https://github.com/tychxn/jd-assistant/wiki/1.-%E4%BA%AC%E4%B8%9C%E6%8A%A2%E8%B4%AD%E5%8A%A9%E6%89%8B%E7%94%A8%E6%B3%95)
(2)`sku_id`,`DEFAULT_USER_AGENT` (2)`sku_id`,`DEFAULT_USER_AGENT`
> `sku_id`已经按照茅台的填好。 > `sku_id`已经按照Xbox Series S的填好。
> `cookies_string` 现在已经不需要填写了 > `cookies_string` 现在已经不需要填写了
> `DEFAULT_USER_AGENT` 可以用默认的。谷歌浏览器也可以浏览器地址栏中输入about:version 查看`USER_AGENT`替换 > `DEFAULT_USER_AGENT` 可以用默认的。谷歌浏览器也可以浏览器地址栏中输入about:version 查看`USER_AGENT`替换
@ -104,10 +90,9 @@
> 在程序开始运行后,会检测本地时间与京东服务器时间,输出的差值为本地时间-京东服务器时间,即-50为本地时间比京东服务器时间慢50ms。 > 在程序开始运行后,会检测本地时间与京东服务器时间,输出的差值为本地时间-京东服务器时间,即-50为本地时间比京东服务器时间慢50ms。
> 本代码的执行的抢购时间以本地电脑/服务器时间为准 > 本代码的执行的抢购时间以本地电脑/服务器时间为准
(4)修改抢购瓶数 (4)修改抢购件数
> 代码中默认抢购瓶数为2,且无法在配置文件中修改 > 代码中默认抢购件数为2
> 如果一个月内抢购过一瓶,最好修改抢购瓶数为1 > 具体修改为:在config.ini文件
> 具体修改为:在`jd_spider_requests.py`文件中搜索`self.seckill_num = 2`,将`2`改为`1`
#### 4.运行main.py #### 4.运行main.py
根据提示选择相应功能即可 根据提示选择相应功能即可
@ -117,9 +102,13 @@
搜索日志,出现“抢购成功,订单号xxxxx",代表成功抢到了,务必半小时内支付订单!程序暂时不支持自动停止,需要手动STOP! 搜索日志,出现“抢购成功,订单号xxxxx",代表成功抢到了,务必半小时内支付订单!程序暂时不支持自动停止,需要手动STOP!
若两分钟还未抢购成功,基本上就是没抢到!程序暂时不支持自动停止,需要手动STOP! 若两分钟还未抢购成功,基本上就是没抢到!程序暂时不支持自动停止,需要手动STOP!
## 打赏
不用再打赏了,抢到茅台的同学请保持这份喜悦,没抢到的继续加油 :)
## 感谢 ## 感谢
##### 感谢原作者 https://github.com/zhou-xiaojun/jd_mask 提供的代码 ##### 作者-1 https://github.com/zhou-xiaojun/jd_mask 提供的代码
##### 也非常感谢 https://github.com/wlwwu/jd_maotai 进行的优化 ##### 作者-2 https://github.com/wlwwu/jd_maotai 提供的代码
##### 作者-3 https://github.com/andyzys/jd_seckill 提供的代码
##### 作者-4 https://github.com/tychxn/jd-assistant 提供的代码
## Sponsor
[![JetBrains](./docs/jetbrains.svg)](https://www.jetbrains.com/?from=jd-assistant)

1
config.ini

@ -11,6 +11,7 @@ area = 21_1827_4101_40925
# 已经是xbox的sku_id了 # 已经是xbox的sku_id了
sku_id = 100021890778 sku_id = 100021890778
# sku_id = 7816155 # sku_id = 7816155
# XSX-100011513445 XSS-100021890778 百事可乐-7816155
# 设定时间 # 2020-12-09 10:00:00.100000 # 设定时间 # 2020-12-09 10:00:00.100000
# 修改成每天的几点几分几秒几毫秒 # 修改成每天的几点几分几秒几毫秒
buy_time = 2021-07-11 09:59:59.500 buy_time = 2021-07-11 09:59:59.500

25
get_eid_fp.html

@ -0,0 +1,25 @@
<html>
<head></head>
<body>
<div id="info">获取中……</div>
<hr>
<div id="eid"></div>
<div id="fp"></div>
</body>
</html>
<script src="https://gias.jd.com/js/td.js"></script>
<script>
setTimeout(function () {
try {
getJdEid(function (eid, fp, udfp) {
document.getElementById('info').innerText = '请把下面的内容复制到配置文件 config.ini 中的对应位置';
document.getElementById('eid').innerText = 'eid = ' + eid;
document.getElementById('fp').innerText = 'fp = ' + fp;
});
} catch (e) {
document.getElementById('info').innerText = e;
}
}, 1000);
</script>

3
requirements.txt

@ -0,0 +1,3 @@
lxml==4.5.1
bs4==0.0.1
requests==2.24.0
Loading…
Cancel
Save