├── .idea
├── .gitignore
├── JD_maotai_quick_buy.iml
├── inspectionProfiles
│ ├── Project_Default.xml
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
└── vcs.xml
├── README.md
├── core_script.py
├── img_1.png
├── img_2.png
├── xg
├── 1gkq9-jl8qs.gif
├── 6f7f34c07e152f32ce16888cb171a5be.mp4
├── img.png
└── img_1.png
└── 抢到截图.png
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/JD_maotai_quick_buy.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 需要源码学习可以联系邮箱 niudehua0927@outlook.com或者微信dsaxqh1
2 | 源码收费
3 | # 新增库存监控功能
4 | 
5 | # 更新日期2024.06.06目前JD 的PC端无法使用,(只支持APP协议)
6 | # 效果
7 | 
8 | ~# 现在可以免费测试(--带star截图--联系我获取激活码)
9 | ~当然!源码给钱也能出 哈哈哈
10 | # 联系方式
11 | 激活码联系邮箱 niudehua0927@outlook.com (长时间未回可以加V:dsaxqh1)
12 |
13 | # 有定制开发需求或者需要付费服务可加微信 记得备注一下
14 | 
15 |
16 | ### 暗中观察
17 |
18 | 根据 12 月 14 日以来抢茅台的日志分析,大胆推断再接再厉返回 Json 消息中`resultCode`与小白信用的关系。
19 | 这里主要分析出现频率最高的`90016`和`90008`。
20 |
21 | ### 样例 JSON
22 |
23 | ```json
24 | {'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 90016, 'skuId': 0, 'success': False}
25 | {'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 90008, 'skuId': 0, 'success': False}
26 | ```
27 |
28 | ### 数据统计
29 |
30 | | 案例 | 小白信用 | 90016 | 90008 | 抢到耗时 |
31 | | ---- | -------- | ------ | ------ | -------- |
32 | | 张三 | 63.8 | 59.63% | 40.37% | 暂未抢到 |
33 | | 李四 | 92.9 | 72.05% | 27.94% | 4 天 |
34 | | 王五 | 99.6 | 75.70% | 24.29% | 暂未抢到 |
35 | | 赵六 | 103.4 | 91.02% | 8.9% | 2 天 |
36 |
37 | ### 猜测
38 |
39 | 推测返回 90008 是京东的风控机制,代表这次请求直接失败,不参与抢购。
40 | 小白信用越低越容易触发京东的风控。
41 |
42 | 从数据来看小白信用与风控的关系大概每十分为一个等级,所以赵六基本上没有被拦截,李四和王五的拦截几率相近,张三的拦截几率最高。
43 |
44 | 风控放行后才会进行抢购,这时候用的应该是水库计数模型,假设无法一次性拿到所有数据的情况下来尽量的做到抢购成功用户的均匀分布,这样就和概率相关了。
45 |
46 | > 综上,张三想成功有点困难,小白信用是 100+的用户成功几率最大。
47 |
48 |
49 | # 更新了京东app的h5st4.7参数
50 | 最近某东也是在不断的维护升级 h5st 参数, 原因就是逐渐 VMP 化,现在已经到了 4.7 版本了,也相对稳定下来了
51 | 
52 |
53 |
54 | # 下载地址
55 | https://github.com/ord-kivy/JD_maotai_quick_buy/releases/tag/V8
56 |
57 | # 有3位用户反馈6月1号抢到了
58 | 6月1放量 10000瓶 好几位用户反馈抢到
59 | 都是晚上20点~~~ 笑哭
60 | 
61 |
62 | # 还有没有抢到的 邮件或wx反馈一下
63 |
64 |
--------------------------------------------------------------------------------
/core_script.py:
--------------------------------------------------------------------------------
1 | import configparser
2 | import json
3 | import warnings
4 | import requests
5 | import re
6 | from urllib import parse
7 | import time
8 | from tools import utils
9 | from tools.jd_sign import getSign
10 |
11 | warnings.filterwarnings("ignore")
12 |
13 |
14 | def getUrlParams(url):
15 | res = dict(parse.parse_qsl(url))
16 | return res
17 |
18 |
19 | def get_cookie_string(cookie):
20 | cookie_string = ""
21 | for cookie_key in cookie.keys():
22 | cookie_string += "%s=%s;" % (cookie_key, cookie[cookie_key])
23 | return cookie_string
24 |
25 |
26 | def get_jd_time():
27 | response = requests.get(
28 | url="https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5"
29 | )
30 | print(response.json())
31 |
32 |
33 | def get_sk(data):
34 | data_val = [val for val in data["data"].values()]
35 | n, o, p, q, r, s = (
36 | data_val[0],
37 | data_val[1],
38 | data_val[2],
39 | data_val[3],
40 | data_val[4],
41 | data_val[5],
42 | )
43 | sk_val = ""
44 | if n == "cca":
45 | sk_val = p[14:19].lower() + o[5:15].upper()
46 | if n == "ab": # check ok
47 | sk_val = r[10:18] + s[2:13].lower()
48 | if n == "ch":
49 | sk_val = q.upper() + r[6:10].upper()
50 | if n == "cbc": # check ok
51 | sk_val = q[3:13].upper() + p[10:19].lower()
52 | if n == "by":
53 | sk_val = o[5:8] + re.sub("a", "c", p, flags=re.IGNORECASE)
54 | if n == "xa":
55 | sk_val = o[1:16] + s[4:10]
56 | if n == "cza":
57 | sk_val = q[6:19].lower() + s[5:11]
58 | if n == "cb":
59 | sk_val = s[5:14] + p[2:13].upper()
60 |
61 | return sk_val
62 |
63 |
64 | class JDSecKillAPI:
65 | def __init__(self, sku, ck):
66 | self.skuId = sku
67 | self.s = requests.session()
68 | self.sku = sku
69 | self.ck = ck
70 | self.aid = "6f7e68aa-5b38-4a20-a971-41478d4f0772"
71 | self.eid = "eidAab4281218esdGQTaDRX9QrWRjWe8/TIYdxkE24gLaXbrVS2DA6FDHTA6DvyFJkD8" \
72 | "/3Fzn1ad3Zp8oA6oRyt6ElO8rOyq2RilE7ngakzDGKnEy3Va "
73 | self.uuid = "23191589d81d4ef4"
74 | self.uts = "0f31TVRjBSsqndu4/jgUPz6uymy50MQJNdGPA8M8DwcXPjMzKz5N8X6EVhIJQl35adLPXD96o2gJzoCjUIQ" \
75 | "+7VoW1pj2qDt3HCjvSWHxdAYMJkWSnOmfhVgpBY+bOAFaXupQw7n" \
76 | "+Z2K62cSNSbXgX4VkZUGqOD5MqVbly0IV4YG2kAQqRSFYDH7WeMCXIpEtFKVFPiRvFwDXt8RMEU69WQ== "
77 | self.wifiBssid = "80885293e4c5736445e7f418ee6ca1f2"
78 | # self.ua = "AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36"
79 | # self.ua = 'Mozilla/5.0 (Linux; Android 12; 22021211RC Build/SKQ1.211006.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.72 MQQBrowser/6.2 TBS/046011 Mobile Safari/537.36'
80 | # self.ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1"
81 | self.ua = "okhttp/3.12.16;jdmall;android;version/12.1.0;build/98893;"
82 |
83 | # 预约操作
84 | def appoint_sku(self):
85 | # 协议头
86 | headers = {
87 | 'Cookie': self.ck,
88 | 'J-E-C': '%7B%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22ts%22%3A1695984101202'
89 | '%2C%22ridx%22%3A-1%2C%22cipher%22%3A%7B%22pin%22%3A%22GwvxG29kZzUyCK%3D%3D%22%7D%2C'
90 | '%22ciphertype%22%3A5%2C%22version%22%3A%221.2.0%22%2C%22appname%22%3A%22com.jingdong.app.mall'
91 | '%22%7D',
92 | 'X-Rp-Client': 'android_3.0.0',
93 | 'jdgs': '{"b1":"6f620b67-a8af-423b-ae64-8a0efc68a355","b2":"3.2.3.1_0","b3":"2.1",'
94 | '"b4":"kvlMRxBK1LcMdkWOfMXPg48oH0dZkGBaI9Bv+zK8FifKYc3XHdsdC1xmn+a+rZ894h6wJz'
95 | '/RrIEUdzAzImwJM9rfx7JR2DDMrXeT'
96 | '+fvYeWyJ4rZpoiCp5pgGX9kzPIiP8FeIyAka2xYHazPuEMuQ2FKpOnxcnoBwg1KXh1OOxex+wuu'
97 | '+9TZJqW3DQF74gReIWzqN2V/DckGoeLlA/u0r016rxgaaOyg4hO0Iv0'
98 | '+n5hEAvHXyIL4G6gzwkJz2XFhaeuTcUsQAiQ8tYeG2QZPbGgsGUhjGSm6Fn'
99 | '/h4RSFpgR509Tqc6SRODQdeQG4ULpvR25NYK0y+GBDGNMmK1mEr0r/Hrzu/o6YaxSVt21apZJELBN1z'
100 | '+ECSCxPyNmejpSRHGUkfeOvIRyYfUYEwdg==","b5":"4f3b78c8fd4031a6ff4062b5bc2f5ed79e719cca",'
101 | '"b7":"1695984151563","b6":"9c9f112267f3cc63c809148badd0fdc712b22fa6"}',
102 | 'Connection': 'keep-alive',
103 | 'User-Agent': 'okhttp/3.12.16;jdmall;android;version/12.1.0;build/98893;',
104 | 'X-Referer-Package': 'com.jingdong.app.mall',
105 | 'Charset': 'UTF-8',
106 | 'X-Referer-Page': 'com.jd.lib.productdetail.ProductDetailActivity',
107 | 'Cache-Control': 'no-cache',
108 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
109 | 'Host': 'api.m.jd.com'
110 | }
111 |
112 | # 取13位时间戳
113 | ts = int(time.time() * 1000)
114 | # UUID
115 | uuid = self.uuid
116 | ep = utils.get_ep(ts, uuid)
117 | #
118 | query_params = {
119 | "functionId": "appoint",
120 | "clientVersion": "12.1.0",
121 | "build": "98893",
122 | "client": "android",
123 | "partner": "huaweiharmony",
124 | "oaid": self.aid,
125 | "sdkVersion": "29",
126 | "lang": "zh_CN",
127 | "harmonyOs": 1,
128 | "networkType": "wifi",
129 | "uts": self.uts,
130 | "uemps": "0-0-0",
131 | "ext": '{"prstate":"0","pvcStu":"1"}',
132 | "avifSupport": 1,
133 | "eid": self.eid,
134 | "ef": 1,
135 | 'ep': json.dumps(ep, ensure_ascii=False, separators=(',', ':')),
136 | }
137 | # 请求地址
138 | reserve_url = "https://api.m.jd.com/client.action"
139 |
140 | body = {
141 | "autoAddCart": "0",
142 | "bsid": "",
143 | "check": "0",
144 | "ctext": "",
145 | "isShowCode": "0",
146 | "mad": "0",
147 | "skuId": self.skuId,
148 | "type": "4",
149 | }
150 |
151 | plainTextDic = {
152 | "st": ts, # 毫秒级时间戳
153 | "sv": "120",
154 | "functionId": query_params["functionId"],
155 | "uuid": uuid,
156 | "client": query_params["client"],
157 | "clientVersion": query_params["clientVersion"],
158 | "body": json.dumps(body, ensure_ascii=False, separators=(",", ":")),
159 | }
160 | # 计算sign值
161 | st, sign, sv = getSign(plainTextDic)
162 | print("sign", sign)
163 | query_params.update(st=st)
164 | query_params.update(sign=sign)
165 | query_params.update(sv=sv)
166 | data = {"body": json.dumps(body, ensure_ascii=False, separators=(",", ":"))}
167 |
168 | response = self.s.post(
169 | url=reserve_url,
170 | params=query_params,
171 | data=data,
172 | headers=headers,
173 | allow_redirects=False,
174 | verify=False,
175 | timeout=3,
176 | )
177 | print(query_params)
178 | return response.json()
179 |
180 |
181 | # 获取token操作******************************************************************************************************
182 | def get_token_key(self):
183 | # 协议头
184 | headers = {
185 | 'Cookie': self.ck,
186 | 'J-E-C': '%7B%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22ts%22%3A1695984101202'
187 | '%2C%22ridx%22%3A-1%2C%22cipher%22%3A%7B%22pin%22%3A%22GwvxG29kZzUyCK%3D%3D%22%7D%2C'
188 | '%22ciphertype%22%3A5%2C%22version%22%3A%221.2.0%22%2C%22appname%22%3A%22com.jingdong.app.mall'
189 | '%22%7D',
190 | 'X-Rp-Client': 'android_3.0.0',
191 | 'jdgs': '{"b1":"6f620b67-a8af-423b-ae64-8a0efc68a355","b2":"3.2.3.1_0","b3":"2.1",'
192 | '"b4":"kvlMRxBK1LcMdkWOfMXPg48oH0dZkGBaI9Bv+zK8FifKYc3XHdsdC1xmn+a+rZ894h6wJz'
193 | '/RrIEUdzAzImwJM9rfx7JR2DDMrXeT'
194 | '+fvYeWyJ4rZpoiCp5pgGX9kzPIiP8FeIyAka2xYHazPuEMuQ2FKpOnxcnoBwg1KXh1OOxex+wuu'
195 | '+9TZJqW3DQF74gReIWzqN2V/DckGoeLlA/u0r016rxgaaOyg4hO0Iv0'
196 | '+n5hEAvHXyIL4G6gzwkJz2XFhaeuTcUsQAiQ8tYeG2QZPbGgsGUhjGSm6Fn'
197 | '/h4RSFpgR509Tqc6SRODQdeQG4ULpvR25NYK0y+GBDGNMmK1mEr0r/Hrzu/o6YaxSVt21apZJELBN1z'
198 | '+ECSCxPyNmejpSRHGUkfeOvIRyYfUYEwdg==","b5":"4f3b78c8fd4031a6ff4062b5bc2f5ed79e719cca",'
199 | '"b7":"1695984151563","b6":"9c9f112267f3cc63c809148badd0fdc712b22fa6"}',
200 | 'Connection': 'keep-alive',
201 | 'User-Agent': 'okhttp/3.12.16;jdmall;android;version/12.1.0;build/98893;',
202 | 'X-Referer-Package': 'com.jingdong.app.mall',
203 | 'Charset': 'UTF-8',
204 | 'X-Referer-Page': 'com.jd.lib.productdetail.ProductDetailActivity',
205 | 'Cache-Control': 'no-cache',
206 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
207 | 'Host': 'api.m.jd.com'
208 | }
209 | ts = int(time.time() * 1000)
210 | uuid = self.uuid
211 | ep = utils.get_ep(ts, uuid)
212 | query_params = {
213 | "functionId": "genToken",
214 | "clientVersion": "12.1.0",
215 | "build": "98893",
216 | "client": "android",
217 | "partner": "huaweiharmony",
218 | "oaid": self.aid,
219 | "sdkVersion": "29",
220 | "lang": "zh_CN",
221 | "harmonyOs=1": 1,
222 | "networkType": "wifi",
223 | "uts": self.uts,
224 | "uemps": "0-0-0",
225 | "ext": '{"prstate":"0","pvcStu":"1"}',
226 | "avifSupport": 1,
227 | "eid": self.eid,
228 | "ef": 1,
229 | 'ep': json.dumps(ep, ensure_ascii=False, separators=(',', ':')),
230 | }
231 |
232 | body = {
233 | "action": "to",
234 | "to": "https://divide.jd.com/user_routing?skuId=" + self.sku,
235 | }
236 |
237 | plainTextDic = {
238 | "st": ts, # 毫秒级时间戳
239 | "sv": "120",
240 | "functionId": query_params["functionId"],
241 | "uuid": uuid,
242 | "client": query_params["client"],
243 | "clientVersion": query_params["clientVersion"],
244 | "body": json.dumps(body, ensure_ascii=False, separators=(",", ":")),
245 | }
246 | st, sign, sv = getSign(plainTextDic)
247 |
248 | query_params.update(st=st)
249 | query_params.update(sign=sign)
250 | query_params.update(sv=sv)
251 |
252 | data = {"body": json.dumps(body, ensure_ascii=False, separators=(",", ":"))}
253 |
254 | response = self.s.post(
255 | url="https://api.m.jd.com/client.action",
256 | params=query_params,
257 | data=data,
258 | headers=headers,
259 | allow_redirects=False,
260 | verify=False,
261 | timeout=3,
262 | )
263 | token_key = response.json()['tokenKey']
264 | print("token_key",token_key)
265 | print('Token Key: ----------> %s' % response.json())
266 | print(response.status_code)
267 | json_obj = response.json()
268 | print("Get genToken--------------->%s" % str(json_obj))
269 | return json_obj
270 |
271 | def get_appjmp(self, token_params):
272 | headers = {"user-agent": self.ua}
273 | appjmp_url = token_params["url"]
274 | params = {
275 | "to": "https://divide.jd.com/user_routing?skuId=%s" % self.skuId,
276 | "tokenKey": token_params["tokenKey"],
277 | }
278 |
279 | response = self.s.get(
280 | url=appjmp_url,
281 | params=params,
282 | allow_redirects=False,
283 | verify=False,
284 | headers=headers,
285 | )
286 | print("Get Appjmp跳转链接-------------->%s" % response.headers["Location"])
287 | return response.headers["Location"]
288 |
289 | def get_divide(self, divide_url):
290 | headers = {"user-agent": self.ua}
291 | response = self.s.get(
292 | url=divide_url, allow_redirects=False, verify=False, headers=headers
293 | )
294 | print("Get Divide跳转链接-------------->%s" % response.headers["Location"])
295 | return response.headers["Location"]
296 |
297 | def get_captcha(self, captcha_url):
298 | headers = {"user-agent": self.ua}
299 | response = self.s.get(
300 | url=captcha_url, allow_redirects=False, verify=False, headers=headers
301 | )
302 | print("Get Captcha跳转链接-------------->%s" % response.headers["Location"])
303 | return response.headers["Location"]
304 |
305 | def visit_seckill(self, seckill_url):
306 | headers = {"user-agent": self.ua}
307 | response = self.s.get(
308 | url=seckill_url, allow_redirects=False, verify=False, headers=headers
309 | )
310 | return response
311 |
312 | # 抢单函数,num定义数量*********************************************************************************************
313 | # **************************************************************************************************************
314 | # 创建配置解析器对象
315 | config = configparser.ConfigParser()
316 | # 读取配置文件
317 | config.read('config.ini')
318 |
319 | # 获取配置项的值
320 |
321 | def init_action(self, num=config.get('number', 'num')):
322 | print("num:", num)
323 | try:
324 | headers = {"user-agent": self.ua, "Connection": "keep-alive"}
325 | init_action_url = (
326 | "https://marathon.jd.com/seckillnew/orderService/init.action"
327 | )
328 | data = {
329 | "sku": self.skuId,
330 | "num": num,
331 | "id": 0,
332 | "provinceId": 0,
333 | "cityId": 0,
334 | "countyId": 0,
335 | "townId": 0,
336 | }
337 | response = self.s.post(
338 | url=init_action_url,
339 | data=data,
340 | allow_redirects=False,
341 | verify=False,
342 | headers=headers,
343 | )
344 | print("init action返回数据:%s" % response.text)
345 | # JDSecKillSubmit.log("init action返回数据:%s" % response.text)
346 | return response.json()
347 | except Exception as e:
348 | print(str(e))
349 | return None
350 |
351 | def get_tak(self):
352 | try:
353 | headers = {"user-agent": self.ua, "Connection": "keep-alive"}
354 | tak_url = "https://tak.jd.com/t/871A9?_t=%d" % (
355 | int(round(time.time() * 1000))
356 | )
357 | response = self.s.get(
358 | url=tak_url, allow_redirects=False, verify=False, headers=headers
359 | )
360 | sk_val = get_sk(data=response.json())
361 | return sk_val
362 | except Exception as e:
363 | print(str(e))
364 | return ""
365 |
366 | def submit_order(self, order_data, sk):
367 | try:
368 | headers = {"user-agent": self.ua, "Connection": "keep-alive"}
369 | submit_order_url = (
370 | "https://marathon.jd.com/seckillnew/orderService/submitOrder.action?skuId=%s"
371 | % self.skuId
372 | )
373 | address_info = order_data["address"]
374 | invoice_info = order_data["invoiceInfo"]
375 | data = {
376 | "num": order_data["seckillSkuVO"]["num"],
377 | "addressId": address_info["id"],
378 | "yuShou": True,
379 | "isModifyAddress": False,
380 | "name": address_info["name"],
381 | "provinceId": address_info["provinceId"],
382 | "provinceName": address_info["provinceName"],
383 | "cityId": address_info["cityId"],
384 | "cityName": address_info["cityName"],
385 | "countyId": address_info["countyId"],
386 | "countyName": address_info["countyName"],
387 | "townId": address_info["townId"],
388 | "townName": address_info["townName"],
389 | "addressDetail": address_info["addressDetail"],
390 | "mobile": address_info["mobile"],
391 | "mobileKey": address_info["mobileKey"],
392 | "email": "",
393 | "invoiceTitle": invoice_info["invoiceTitle"],
394 | "invoiceContent": invoice_info["invoiceContentType"],
395 | "invoicePhone": invoice_info["invoicePhone"],
396 | "invoicePhoneKey": invoice_info["invoicePhoneKey"],
397 | "invoice": True,
398 | "codTimeType": "3",
399 | "paymentType": "4",
400 | "overseas": "0",
401 | "token": order_data["token"],
402 | # "sk": sk,
403 | }
404 |
405 | response = self.s.post(
406 | url=submit_order_url,
407 | data=data,
408 | allow_redirects=False,
409 | verify=False,
410 | headers=headers,
411 | )
412 | return response.json()
413 | except Exception as e:
414 | print("提交错误 error--->" + str(e))
415 | return None
416 |
417 | def send_message(self, content):
418 | pass
419 | # try:
420 | # # 推送token
421 | # PUSH_TOKEN = "AT_4XxUFvSjSLWTlFhX1nFmIepe1RNoGq8b"
422 |
423 | # UIDS = [
424 | # "UID_D77yyDO0pT7K0f1q2UijDTGnGthF",
425 | # ]
426 | # msg = WxPusher.send_message(content, uids=UIDS, token=PUSH_TOKEN)
427 | # except Exception as e:
428 | # print("send_message error--->" + str(e))
429 |
430 |
431 | if __name__ == "__main__":
432 | # 创建配置解析器对象
433 | config = configparser.ConfigParser()
434 | # 读取配置文件
435 | config.read('config.ini')
436 | # 获取配置项的值
437 | sku = config.get('skuId', 'sku')
438 | ck = config.get('cookies', 'ckLong')
439 | # ck = 'wskey=AARklXecAECOliANxM81qWLIXZ5ibhKwZB5uL7nBHtiSCwb5ORlpGqOa0_93VKW4rC2CxaEO2dDxAubnvJFdzogZ15QhIEiR;whwswswws=JD012145b9RiaZd1Kf3G169598410584505igLZWes-q_D_rkzmAUSfsktnhrwqUYfb5i2tsZwACxctDLLK5dCZ14nd0BapXj64oJQEpsKsuIcfe1wjK7xoaQ0yo642p~AAkEWiOCKEAAAAAAAAAAAAAAAACMZFYnYHU70fwAAAApCaWdDb25nNTIw;unionwsws={"devicefinger":"eidAab4281218esdGQTaDRX9QrWRjWe8\\/TIYdxkE24gLaXbrVS2DA6FDHTA6DvyFJkD8\\/3Fzn1ad3Zp8oA6oRyt6ElO8rOyq2RilE7ngakzDGKnEy3Va","jmafinger":"JD012145b9RiaZd1Kf3G169598410584505igLZWes-q_D_rkzmAUSfsktnhrwqUYfb5i2tsZwACxctDLLK5dCZ14nd0BapXj64oJQEpsKsuIcfe1wjK7xoaQ0yo642p~AAkEWiOCKEAAAAAAAAAAAAAAAACMZFYnYHU70fwAAAApCaWdDb25nNTIw"};pin_hash=1484288750;',
440 | jdapi = JDSecKillAPI(sku, ck)
441 | print("预约结果--->", jdapi.appoint_sku())
442 | # print("gentoken结果--->", jdapi.get_token_key())
--------------------------------------------------------------------------------
/img_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/img_1.png
--------------------------------------------------------------------------------
/img_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/img_2.png
--------------------------------------------------------------------------------
/xg/1gkq9-jl8qs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/xg/1gkq9-jl8qs.gif
--------------------------------------------------------------------------------
/xg/6f7f34c07e152f32ce16888cb171a5be.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/xg/6f7f34c07e152f32ce16888cb171a5be.mp4
--------------------------------------------------------------------------------
/xg/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/xg/img.png
--------------------------------------------------------------------------------
/xg/img_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/xg/img_1.png
--------------------------------------------------------------------------------
/抢到截图.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ord-kivy/JD_maotai_quick_buy/e9fdfc6ab33d8377236da2843d7c9b369db6ef35/抢到截图.png
--------------------------------------------------------------------------------