├── .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 | 7 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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 | ![img_2.png](img_2.png) 5 | # 更新日期2024.06.06目前JD 的PC端无法使用,(只支持APP协议) 6 | # 效果 7 | ![1gkq9-jl8qs.gif](xg%2F1gkq9-jl8qs.gif) 8 | ~# 现在可以免费测试(--带star截图--联系我获取激活码) 9 | ~当然!源码给钱也能出 哈哈哈 10 | # 联系方式 11 | 激活码联系邮箱 niudehua0927@outlook.com (长时间未回可以加V:dsaxqh1) 12 | 13 | # 有定制开发需求或者需要付费服务可加微信 记得备注一下 14 | ![img.png](img.png) 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 | ![img_1.png](img_1.png) 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 | ![抢到截图.png](抢到截图.png) 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 --------------------------------------------------------------------------------