mirror of
https://git.oceanpay.cc/danial/kami_jd_ck.git
synced 2025-12-18 12:34:24 +00:00
550 lines
26 KiB
Python
550 lines
26 KiB
Python
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 |