import base64 import json import os import platform import random import re import time import execjs import redis import requests import traceback import urllib.parse from logger import get_logger from utils.icon import JdIcon from utils.slide import save_photo_and_check logger = get_logger() class JdSpider(object): def __init__(self, card_pwd, order_num, cookies): # 接收参数 self.card_pwd = card_pwd self.order_num = order_num self.cookies = cookies self.client = "m" current_os = platform.system() logger.info(f"当前系统:{current_os}") if current_os == "Linux": redis_url = 'redis://:jd2024@10.0.0.211:6379/0' js_path = r"/app/js" node_modules_path = r"/app/node_modules" else: # redis_url = 'redis://:km128sf45@qq@120.24.83.163:6379/32' redis_url = 'redis://:jd2024@120.79.27.250:6379/0' js_path = "js" node_modules_path = "node_modules" # 读取js代码 captcha_path = os.path.join(js_path, 'captcha_m.js') self.js_m = execjs.compile( open(captcha_path, encoding='utf8').read(), cwd=node_modules_path ) REDIS_POOL = redis.ConnectionPool.from_url(redis_url) self.redis_conn = redis.StrictRedis(connection_pool=REDIS_POOL) # ip代理池 self.proxy_list = [] self.proxies = {} self.session = requests.Session() # ua self.user_agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36' self.headers = { 'authority': 'mygiftcard.jd.com', 'accept': 'application/json, text/plain, */*', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'cache-control': 'no-cache', 'content-length': '0', 'content-type': 'application/x-www-form-urlencoded', 'origin': 'https://mygiftcard.jd.com', 'pragma': 'no-cache', 'referer': 'https://mygiftcard.jd.com/giftcardForM.html?source=JDM&sceneval=2&jxsid=17072329877299776610&appCode=ms0ca95114', 'sec-ch-ua-mobile': '?1', 'sec-ch-ua-platform': '"Android"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', } # jd api接口 self.si_url = "https://mygiftcard.jd.com/giftcard/querySid/app" self.fp_url = "https://jcap.m.jd.com/cgi-bin/api/fp" self.captcha_url = "https://jcap.m.jd.com/cgi-bin/api/check" self.refresh_url = "https://jcap.m.jd.com/cgi-bin/api/refresh" self.card_url = "https://api.m.jd.com/api" # 超时时间 self.common_timeout = 3 # 参数 self.fp = "Fdevghie0g0SsIhPsOE18HuAx_sg8FYyW3Hz4pBaX79dn0lkIsNzSEuH0Nr9rdwqE3R6RWhX8N22rZw7hkOa1g==" self.sid = None self.stt = None self.st = None self.pwd_key = None # 点选验证码 self.icon = JdIcon() # 备注 self.remark = "" def rebuild_cookies(self): self.fp = self.fp.replace("7", str(random.randint(1, 9))) pt_key = re.findall(r"pt_key=(.*?);", self.cookies)[0] pt_pin = re.findall(r"pt_pin=(.*?);", self.cookies)[0] ck = f"pt_key={pt_key};pt_pin={pt_pin};" self.cookies = ck + f"appCode=ms0ca95114; webp=1; jcap_dvzw_fp={self.fp};" logger.info(f"订单号:{self.order_num},处理后的cookies:{self.cookies}") def get_proxies(self): proxy_list = self.redis_conn.lrange('proxy_list', 0, -1) self.proxy_list = [i.decode("utf-8") for i in proxy_list] logger.info(f"订单ID:{self.order_num},当前IP代理池:{self.proxy_list}") def query_jd_si(self, cookie): ua = self.user_agent.replace('121', str(random.randint(100, 121))) self.headers['user-agent'] = ua self.headers['cookie'] = cookie params = ( ('source', 'JDM'), ) response = self.session.post( self.si_url, headers=self.headers, proxies=self.proxies, params=params, timeout=self.common_timeout ) return response def check_ip(self): for _ in self.proxy_list: ip = random.choice(self.proxy_list) self.proxies = { "http": ip, "https": ip, } try: response = self.query_jd_si(cookie="") if response.status_code == 200: logger.info(f"订单ID:{self.order_num},当前IP:{ip},是否可用:True") break else: self.proxy_list.remove(ip) logger.info(f"订单ID:{self.order_num},当前IP:{ip},是否可用:False") continue except: self.proxy_list.remove(ip) logger.info(f"订单ID:{self.order_num},当前IP:{ip},是否可用:False") continue def get_si(self): response = self.query_jd_si(cookie=self.cookies) logger.info(f"订单ID:{self.order_num},获取si返回:{response.text}") return response.json() def query_by_type(self, type_num, result=None): url = None data = None text = None if type_num == 0: url = self.fp_url data = self.js_m.call('result', self.sid, 0, '', '', self.client, self.fp) text = "获取fp返回:" if type_num == 1: url = self.captcha_url data = self.js_m.call('result', self.sid, 1, self.st, '', self.client, self.fp) text = "获取captcha类型返回:" if type_num == 2: url = self.captcha_url data = self.js_m.call('result', self.sid, 2, self.stt, result, self.client, self.fp) text = "校验验证码返回:" if type_num == 3: url = self.refresh_url data = self.js_m.call('result', self.sid, 3, self.stt, '', self.client, self.fp) text = "刷新验证码返回:" response = self.session.post( url, proxies=self.proxies, timeout=self.common_timeout, data=data ) if type_num in [1, 3]: logger.info(f"订单ID:{self.order_num},{text}{response.json().get('tp')}") else: logger.info(f"订单ID:{self.order_num},{text}{response.text}") return response.json() def icon_verify(self): icon_res = self.query_by_type(type_num=3) self.stt = icon_res['st'] img = json.loads(icon_res['img']) bg = img['b1'].split(',')[1] fg = img['b2'].split(',')[1] icon_res = self.icon.main(bg=bg, icon=fg) logger.info(f"订单ID:{self.order_num},图标验证码识别:{icon_res}") dx_list = icon_res['centre_xy'][0] distance_dict = {} distance_dict['6@hH@X'] = "H%io5u" distance_dict['P7cH*^'] = "aOr*7C" distance_dict['ht'] = 179 distance_dict['wt'] = 290 distance_dict['x'] = dx_list[0] distance_dict['y'] = dx_list[1] photo_distance = str(json.dumps(distance_dict)) photo_distance = photo_distance.replace(" ", '') result = urllib.parse.quote(photo_distance, safe=':,') icon_res = self.query_by_type(type_num=2, result=result) return icon_res def slide_verify(self): slide_res = self.query_by_type(type_num=3) self.stt = slide_res['st'] img = json.loads(slide_res['img']) img1 = img['b1'] img2 = img['b2'] result = save_photo_and_check( base64.b64decode(img1.split(',')[1]), base64.b64decode(img2.split(',')[1]) ) slide_res = self.query_by_type(type_num=2, result=result) return slide_res def verify_captcha(self, img): # 滑块验证 img1 = img['b1'] img2 = img['b2'] result = save_photo_and_check( base64.b64decode(img1.split(',')[1]), base64.b64decode(img2.split(',')[1]) ) verify_res = self.query_by_type(type_num=2, result=result) s_code = verify_res.get("s_code") for i in range(5): if s_code == 16102: verify_res = self.icon_verify() if s_code == 16104: verify_res = self.slide_verify() if verify_res.get("vt"): return verify_res def check_card(self, verify_res): headers = { "accept": "application/json, text/plain, */*", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "no-cache", "content-type": "application/x-www-form-urlencoded;charset=UTF-8", "origin": "https://mygiftcard.jd.com", "pragma": "no-cache", "priority": "u=1, i", "referer": "https://mygiftcard.jd.com/", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-site", "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", "x-referer-page": "https://mygiftcard.jd.com/giftcardForM.html", "x-rp-client": "h5_1.0.0", "cookie": self.cookies } params = { "functionId": "queryBindGiftCardComApp" } timestamp_seconds = int(time.time()) timestamp_milliseconds = int(timestamp_seconds * 1000) data = { "cthr": "1", "client": self.client, "clientVersion": "", "t": f"{timestamp_milliseconds}", "loginWQBiz": "", "appid": "mygiftcard", "functionId": "queryBindGiftCardComApp", "body": "{\"giftCardPwd\":\"%s\",\"verifyCode\":\"%s\",\"sessionId\":\"%s\",\"doBindFlag\":\"0\",\"queryGiftCardType\":\"0\",\"eid\":\"4TBJTR5FCBII3F54PRQD6TXYAKOQLBNWEV6NVBWLHM7PM7PW27OCOZIIAILSZQBTX6NVUETCTSYQCDSPPXHQAGBZCM\"}" % ( self.card_pwd, verify_res["vt"], self.sid), "h5st": "20240614130840508;gg5g5nt6izm5g994;42e80;tk03wd9801d3918n8tHxp2fK2kXiBNcqXstVdyWawbLcWUotcu_14np6lQRBH6Gd7pM0hOZfzQ7qgWephK5qZV1BwooJ;8d635249ff3c200b20c68cda72ce7ddf65f659d8ca2147b89270fb8a9f65b0b9;4.7;1718341720508;UOWdfjkAqWdQiPtxRyyFaURqU8PWe4C1usSHvvs9cC7LFjIslb323aQngUcJCtE3apF16Bdoyp5fzK1HHUEAoEz1RbZIu6N4QYVYnAYRU8r_dBvMmfGygldhJU_GGH6-63XdX1tPXA8BPWbiWCkHVlDL_ll94QassdEHu96T8Md7wqRF0BQXSazN2muy9-iwvfuXZFp_HHdZM0NAzacOqGvZhgbnjPp4WB_AVZZ-H4IPDyY_iHztjeoBiRZMSKGdkAAbbNGUgSMqjPmOOkP4Nt5vwUfD-gDY0amq1vGn6j_uRHoPiq4gWZ-EbJa0hZ_Aqyrw2EtYxBXGSgh_7hjmAvN4iREdAt4ZOXqBfL3u0td3PUxwOkANs4yvS7qqBiecMpwu81MI1sPHONuFPWpxh1baggE7nDk8PeheJO0dl8zjLad9Prk3hGJ0DQIeqffFGvzEemLTD52YgeDqWQHLXbk3", "x-api-eid-token": "jdd034TBJTR5FCBII3F54PRQD6TXYAKOQLBNWEV6NVBWLHM7PM7PW27OCOZIIAILSZQBTX6NVUETCTSYQCDSPPXHQAGBZCMAAAAMPMGWY7YQAAAAADLFECBBTN2M6QMX" } res = {} for i in range(10): try: response = self.session.post( self.card_url, data=data, headers=headers, params=params, proxies=self.proxies, timeout=self.common_timeout ) logger.info(f"订单ID:{self.order_num},京东查卡返回:{response.text}") except Exception as e: logger.info(f'订单ID:{self.order_num},发送京东请求查卡异常:{traceback.format_exc()}') continue res = response.json() # 查卡出现error继续重新执行 if res.get("code") == "error": logger.info(f'订单ID:{self.order_num},查卡返回:{res},出error重新提交查卡...') time.sleep(1) continue break if not res.get("code"): logger.info(f'订单ID:{self.order_num},查卡返回:{res},十次请求绑卡没有内容....') # 查卡出现error继续重新执行 if res.get("code") == "error": logger.info(f'订单ID:{self.order_num},查卡返回:{res},等待10s重新请求....') # 验证码错误,请填写正确的验证码 if res.get("code") == "verifyerr": logger.info(f'订单ID:{self.order_num},查卡返回:{res},验证码错误重新请求....') return res def check_card_status(self, res): code = res.get("code") if code == "nobind": self.pwd_key = res["data"]["pwdKey"] return 200 elif code == "success": self.remark = "绑卡成功" return 100 elif code == 0: self.remark = "点选验证失败" return 110 elif "频繁" in res.get("data", {}).get("msg", ""): self.remark = "账号操作频繁" return 115 elif code == "NotLogin": self.remark = "ck已失效" return 113 elif code == "flask_wrong": self.remark = "滑块验证失败" return 110 elif code == "agent_error": self.remark = "暂无可用代理" return 110 elif code == "nofind": self.remark = "卡密不存在" return 105 elif code == "bindedself": self.remark = "该账户已经绑定过该卡密" return 104 elif code == "bindedother": self.remark = "该卡密已绑定在其他账户" return 104 elif code == "nofindmany": self.remark = "输错卡密次数太多次" return 115 elif code == "frequently": self.remark = "操作频繁" return 115 elif code == "risk": self.remark = "卡密或账号存在风险" return 120 elif code == "error": self.remark = "提交错误" return 120 elif code == "inactive": self.remark = "卡未激活,请激活后重新提交" return 105 elif code == "cardFreeze": self.remark = "该卡处于冻结状态!" return 115 elif code == "verifyerr": self.remark = "验证失效!" return 110 else: self.remark = "check_card_status未知状态码" return 111 def bind_card(self): headers = { "Accept": "*/*", "x-rp-client": "h5_1.0.0", "Accept-Language": "zh-CN,zh;q=0.9", "content-type": "application/x-www-form-urlencoded;charset=UTF-8", "Origin": "https://mygiftcard.jd.com", "Referer": "https://mygiftcard.jd.com/", "x-referer-page": "https://mygiftcard.jd.com/giftcardForM.html", "Connection": "keep-alive", "Cookie": self.cookies, "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS " + str(random.randint(13, 17)) + "_" + str(random.randint(1, 4)) + "_" + str(random.randint(1, 7)) + " like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E" + str(random.randint(101, 999)) + " Safari/604.1" } params = ( ('functionId', 'queryBindGiftCardComApp'), ) functionId = "queryBindGiftCardComApp" body = "{\"pwdKey\":\"%s\",\"giftCardPwd\":\"%s\",\"doBindFlag\":\"1\",\"queryGiftCardType\":\"0\",\"eid\":\"6SYEB56PYKTUT2NILGP6SYACMVR2UGYMQDSA4WMPIIWT5VINQAYVKYB3IT4DKITJ67N4ZQBQHTJ2OJAEUIFTSFVZDU\"}" % ( self.pwd_key, self.card_pwd ) data = { "cthr": "1", "client": self.client, "clientVersion": "", "t": "1717768647989", "loginWQBiz": "", "appid": "mygiftcard", "functionId": functionId, "body": body, "x-api-eid-token": "jdd03FA6ADNTHNOCBBKUPNKJDGHAHWYKPSR2C264VP3YSVIDS3IM6MEG6YT7UIAZZUHFDO6BIOO5HRNSAEF76JPA7NH4GWUAAAAMP6L6X3OQAAAAACBHIFE2PO77RWQX", "h5st": "20240607220020880%3Biyiizi56m9tgizy4%3B42e80%3Btk03w9be51bf118nVtoEb2q0oAKNVPqCgwBA3TrhaJ9-Jy5YcM1xtb1e_qmCpF602spIo13rIuCBlY20evmwuSMgV7w9%3B44a95c1efaf765e6f5e3c385c4ffa56abcf59be82e2bf128a9aac52587afae93%3B4.7%3B1717768820880%3BUO2sJ1o-YpgJ0kliExcXRV6JB3qlvh_KUj1iWE5l3TMeSDx7kl-Zvv7VNjvHeW3SswQngbBvGqrAsQ81lCYnjLSOzGXhYD8l8fTBN9wK_By8_uEk6Fcs76Ah3nSnl94K7H5-dz6XPzt_fJWYnrasWWNlbbHRf_ApOU6kI5R9YErFoIOrh8hWhEiTfkwYGbqE0n0C66Z7g0G9Ef_HqLTwAdjNnWc8G7Tl4KRABCXuVKPigl7xjfOuxXhXlGlHHITPgJhWLoAPt1aM8DnmFx5A2jisxxiKu8LnXGy2yKqALeZQcS2bEZnoYZSAmAX0wDnE6DHc7vJd6IE11dQ-ZW5WiHkU_FL3XGKvG5FG2upmOFljOFYHyMGC7EUpKulEgKq0ljakAdV7FmFOwUMXelSekPVoJ0ItwNNxuBSgXhis6TWihsqe3KzB7K89QdjAvxWa1hwGxzRNDtBwYXJoTMRJ0YDA" } response = self.session.post( url=self.card_url, params=params, headers=headers, data=data, proxies=self.proxies, timeout=60 ) logger.info(f"订单ID:{self.order_num},执行绑卡返回:{response.json()}.") return response.json() def create_response(self, status_code, data=None): """创建统一的返回结构""" return { "code": status_code, "msg": self.remark, "data": data } def run(self): i = 0 while i < 10: i += 1 try: # 构建ck self.rebuild_cookies() # # 获取ip代理 # self.get_proxies() # # 检查ip代理 # self.check_ip() # if not self.proxies: # continue # logger.info(f"订单:{self.order_num}, 当前代理ip:{self.proxies}") # 获取si si_res = self.get_si() if si_res.get("error") == "NotLogin": self.remark = "ck失效" return self.create_response(113) self.sid = si_res['data'] # 获取fp fp_res = self.query_by_type(type_num=0) if not fp_res.get("fp"): i -= 1 logger.info(f"订单ID:{self.order_num},没有获取到fp,重新执行...") continue self.st = fp_res['st'] self.fp = fp_res['fp'] # 获取验证码 captcha_res = self.query_by_type(type_num=1) self.stt = captcha_res['st'] img = json.loads(captcha_res['img']) # 校验验证码 verify_res = self.verify_captcha(img=img) # 查卡 if verify_res.get("code") == 0: res = self.check_card(verify_res) status_code = self.check_card_status(res) if status_code == 200: # 绑卡 res = self.bind_card() status_code = self.check_card_status(res) return self.create_response(status_code, data=res) else: continue except Exception as e: logger.info(f"订单ID:{self.order_num},报错:{traceback.format_exc()}") continue return self.create_response(110) def func(item): id = item.get("id") ck = item.get("ck").strip() account = item.get("account") # 打印参数信息 logger.info(f"订单ID{id},ck:{ck}") logger.info(f"订单ID:{id},account:{account}") proxies = {} logger.info(f"订单id:{id},当前使用代理IP:{proxies}") # 查询京东e卡余额 if "pt_key" in ck: headers = { "Host": "api.m.jd.com", "accept": "application/json, text/plain, */*", "x-rp-client": "h5_1.0.0", "content-type": "application/x-www-form-urlencoded;charset=UTF-8", "user-agent": "jdapp;android;13.2.0;;;M/5.0;appBuild/99580;ef/1;ep/%7B%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22ts%22%3A1735527628177%2C%22ridx%22%3A-1%2C%22cipher%22%3A%7B%22sv%22%3A%22EG%3D%3D%22%2C%22ad%22%3A%22DNYzZNGyEJG5ENLsZwZwZq%3D%3D%22%2C%22od%22%3A%22%22%2C%22ov%22%3A%22Ctq%3D%22%2C%22ud%22%3A%22DNYzZNGyEJG5ENLsZwZwZq%3D%3D%22%7D%2C%22ciphertype%22%3A5%2C%22version%22%3A%221.2.0%22%2C%22appname%22%3A%22com.jingdong.app.mall%22%7D;jdSupportDarkMode/0;Mozilla/5.0 (Linux; Android 9; SM-N9760 Build/PQ3B.190801.06281543; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.72 MQQBrowser/6.2 TBS/046248 Mobile Safari/537.36", "x-referer-page": "https://o.jd.com/", "origin": "https://o.jd.com", "x-requested-with": "com.jingdong.app.mall", "sec-fetch-site": "same-site", "sec-fetch-mode": "cors", "sec-fetch-dest": "empty", "referer": "https://o.jd.com/", "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "cookie": ck } url = "https://api.m.jd.com/api" params = { "functionId": "queryChannelUserCard" } data = { "cthr": "1", "client": "h5", "clientVersion": "", "t": "1735527632064", "loginWQBiz": "", "appid": "mygiftcard", "functionId": "queryChannelUserCard", "body": "null", "h5st": "20241230110035086;sp3ac9xxwwdddx28;aea58;tk04w1830583241lMysyR0tZSE9BXRZLn5SA1Ij8i4S7gNDBmZi9ZZJZFD45BdhOlB2Ji5FElMU9gl2NsMGNgBmNiZmM;9f1fc8c5b9de0ada4dacb1b882c8e51430c35aff970db8f3a3ccd7e3692fbcfe;5.0;1735527635086;WNpZcw5RhRW71ITAi8S7h0mB4MW9mQXRfRX9zQXR5xZOlZ3L3hjB2QXR5xZO3VzAgBGAzEWN4E2AoNDNnN2B4Y2M4ADL3EjBkFzMmBGB3Z3L3ZyIt8zB08yR5Z3XtRHNhVzAiFDMzIGNiFGMiNjN3AzN0ETM0ETN2EGBzUGAkRXRfRn94Ay_4MzR5Z3XtRHNrZ2OkBiC0oD-zcEMxQXRfR383ZXRPp3RuM0GKwUIE4y-AcD9GQXRfRH_qIz_4QyR5Z3XtRX_iBC_nUTRhEy_wo1R5x2RzYyR5Z3XtlSR5xZN5x2RhFyB3ZXR5Z3XtR3R5x2RiFyB3ZXR5Z3Xt9GN5x2RjFyB3ZXR5Z3XtZWRfRHMkQzR5ZXR5xZOpZ3L3JG83QXR5ZXRPpnNoZ3L3NG83QXR5ZXRPpHNsZ3L3RG83QXR5ZXRPpHN5x2RpVG83QXR5ZXRPp3RlhHNrZ2R5x2RoFyB3ZXR5Z3XtZWRfRn-iQXR5ZXRPpXN5x2RmozR5ZXR5xZOpZ3L3pzR5ZXR5xZOpZ3L3Jj83ZXR5Z3XeY3L3Jz_0IS70QXR5xZOcYXRPRHM08GLn5GBiZWM4YGM6Iz-3Z3L3VW93ZXR5Z3XeY3L3ZS93ZXRPp3Rj8SReNWMkVWLnBWNrVWNhZGLoh3JmVUFqJT_wEyJ5Z2Mi12GsllF5tGL5JD-qQSArUVRe5C8r0TG3Z3L3VD8mQXR5xp7;0860364254eeed316cf03b6e9189b81156a1dbfe46b14f11bb737ef9ca94590a", "x-api-eid-token": "jdd03RTK2EWBHSQB57Z3GBX3KNGP6S2WJI223SDGHBNZRKROF6Y3XB6SXBFCHYODUG2HT2HUB4DTAMYLVG4KA4CBPRLEIYEAAAAMUCWA2AHQAAAAADF6RHEQ5KRPGBAX" } else: headers = { "accept": "application/json, text/plain, */*", "accept-language": "zh-CN,zh;q=0.9", "cache-control": "no-cache", "content-type": "application/x-www-form-urlencoded;charset=UTF-8", "origin": "https://mygiftcard.jd.com", "pragma": "no-cache", "priority": "u=1, i", "referer": "https://mygiftcard.jd.com/", "sec-ch-ua": "\"Chromium\";v=\"130\", \"Google Chrome\";v=\"130\", \"Not?A_Brand\";v=\"99\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", "x-referer-page": "https://mygiftcard.jd.com/giftcard/myGiftCardInit.action", "x-rp-client": "h5_1.0.0", "cookie": ck } url = "https://api.m.jd.com/api" data = { "cthr": "1", "client": "pc", "clientVersion": "", "t": "1730966590942", "loginWQBiz": "", "appid": "mygiftcard", "functionId": "queryGiftCardCountStatusComPc", "body": "{\"queryList\":\"a,b,c,d,e,f\"}", "h5st": "20241107160311414;8qef0ylv4z1144z4;6d3e8;tk03w90a71be018ny5d1NgFyNvS0NKiRk389_3HcPi4mGdz2JO3nrm6BwRAkqKfugs54-lV7fJviJWigXI7s2KdEfoFn;0790ddb3307a07756f70d0cd80af4242;4.9;1730966591414;pjbMhjpexaoe6nIN3TkQyqISGmkdJrJdJrESJrpjh7Jf6rJdJz1TIipjLDrgJTISJSVS6PYd1jof0bFTKqIfJqoe1rYTImFf1LofzfITJrJdJrEa-OFTGOEjLrJp-jJS5ToeyT4e6nodGSld4j4TJeYe7PYS4bVT6T1fFSYTyjpjxj5PKSEQKeFjLrJp-jJf9HIg3T0UG6VRFuWeDipjxjJOJrpjh7Jjyf2OVmUbeioY1LYWJrJdJ31QHyVT5ipjLDrgJj4f9G1WJrJdJTlPJrpjh7ZMLrJp7rJdJLYOJipjLrpjh7JjJrJdJPYOJipjLrpjh7Je6rJdJTYOJipjLrpjh7pfLDIj2XETJrpjLrJp-rojxjpe2iFjLrpjLDrgyfojxj5f2iFjLrpjLDrg53pjxjJf2iFjLrpjLDrgJbIg6zpfJrJdJnYOJipjLrpjh7pfLDIjAOEjLrpjLDrg2rJdJfkQJrpjLrJp-rojxjpQJrpjLrJp-rojxjpS0ipjLrpjh-kjxjpS9WlOzWFjLrJp-3kjLDLjSSnQGiEV0mXbZG3RMaFRJrJdJjoPJrpjLrJpwqJdJrkPJrpjh7Jj3ToNL-oe1zVRUq5d7zpf6rpWdq5P0ulS9G1WJrJdJnVO4ipjLD7N;864b5100b061d9e8cccbce6cd6690197", "x-api-eid-token": "jdd03MOMPSVKGBFF6WCM3KNQK34LGPGSCNKB2WACDOVKFUNXQWAWDEVXSHMGQEQLJ6EUKKXZ7ARQA4CPF6EMRRUP5P7ETLEAAAAMTAWSXN6YAAAAACSZG7ABNML6KU4X" } params = {} response = requests.post(url, headers=headers, params=params, data=data, proxies=proxies) res = response.json() logger.info(f"订单id:{id},获取余额JD返回:{res}") if res.get("code") == "000000": item["money"] = res["data"]["totalAmount"] return item elif res.get("code") == "success": item["money"] = res["data"]["a"] return item elif res.get("error") == "NotLogin": item["money"] = "0.00" return item else: item["money"] = "0.00" return item