[Python] 纯文本查看 复制代码
import json
import hashlib
import time
from curl_cffi import requests
import time
import os
import execjs
import subprocess
from functools import partial
import re
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
# 1. 定义参数对象 (将 JS 的 null/false/true 转换为 Python 的 None/False/True)
params = {
"enc": "utf-8",
"pvid": "8e9a18b33d3b418f9d0980a2072c2984",
"area": "14_1114_19784_19809",
"page": 1,
"mode": None,
"concise": False,
"newAdvRepeat": False,
"new_interval": True,
"s": 1
}
# 2. 核心步骤:生成 body 的 SHA-256 哈希值
# JSON.stringify(params) 对应 json.dumps(params, separators=(',', ':'))
# separators=(',', ':') 确保生成的 JSON 是紧凑的,没有多余空格,与 JS 行为一致
json_str = json.dumps(params, separators=(',', ':'))
# cryptoJs.SHA256(...).toString() 对应 hashlib.sha256(...).hexdigest()
body_hash = hashlib.sha256(json_str.encode('utf-8')).hexdigest()
# 3. 构建签名参数对象
params_h5sign = {
"appid": "search-pc-java",
"functionId": "pc_search_adv_Search",
"client": "pc",
"clientVersion": "1.0.0",
"t": int(time.time() * 1000), # JS 的 new Date().getTime() 是毫秒级时间戳
"body": body_hash
}
# 4. 输出结果
# print("生成的 JSON 字符串:", json_str)
# print("\nSHA-256 Hash (body):", body_hash)
# print("\n生成的签名参数对象:")
# print(params_h5sign)
import subprocess
import json
# ... (前面的代码保持不变) ...
cmd = ["node", "./h5st.js", json.dumps(params_h5sign)]
output_text= subprocess.check_output(cmd)
# print(output_text)
def extract_h5st_method2(text):
# 匹配从 { 开始到 } 结束的完整对象
pattern = r'{\s*appid:\s*[^}]+\bh5st:\s*\'([^\']+)\'[^}]*}'
match = re.search(pattern, text, re.DOTALL)
if match:
return match.group(1)
return None
h5st_value = extract_h5st_method2(output_text)
print(f"提取到的 h5st 值: {h5st_value}")
print(f"h5st 长度: {len(h5st_value)}" if h5st_value else "未找到 h5st")
headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"cache-control": "no-cache",
"origin": "https://search.jd.com",
"pragma": "no-cache",
"priority": "u=1, i",
"referer": "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA&pvid=8e9a18b33d3b418f9d0980a2072c2984&spmTag=YTAyMTkuYjAwMjM1Ni5jMDAwMDQ2ODkuc2VhcmNoX2NvbmZpcm0",
"sec-ch-ua": "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft Edge\";v=\"146\"",
"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/146.0.0.0 Safari/537.36 Edg/146.0.0.0",
"x-referer-page": "https://search.jd.com/Search",
"x-rp-client": "h5_1.0.0"
}
cookies = {
"shshshfpa": "e80d2f89-6292-f19a-e0c8-671692edb298-1742822842",
"shshshfpx": "e80d2f89-6292-f19a-e0c8-671692edb298-1742822842",
"jcap_dvzw_fp": "PLhLqG2LrDtMiUuyD4QWFhQLXG6Cd3Z23cCa89BkFTIMdKyQPSGeo6oQ6jD8CuzUENnSXuq8cco2LjwFcUpsXg==",
"TrackID": "1ch5FnVVeapQOpa6oJmKKgD76cFl6STv72ZKPWGr7kQ0xxgBAQHTwTw1KvfMxQhRZjLzK1DikMDjbiUetxYLARZ03kd1vy_U1Wh0yI53nlL3gsb-pHW4IxdvLIWgMc0a5",
"light_key": "AASBKE7rOxgWQziEhC_QY6yaX4xvIMOL4UEYMgSsTdgFgcVind4BIOYgYh6WKnf9QMkrRmQr",
"__jdu": "17653628168171158152459",
"mt_xid": "V2_52007VwMUVVlaVVkWSR5VBWEDElZUWFZZGk0RbAxuAxMHXF5RCB0aTggNZAQiUVxbVUYeSwVfDHYCE1lYXVlYHXkbbAdXMxVaWl9T",
"unpl": "JF8EALNnNSttXEtWDBpXE0JETA1cW1sPHx8DbmMDAVxZTVUCTwJMEBh7XlVdWhRKFR9sbhRVXFNOUQ4eAysSEXteU11bD00VB2xXXAQDGhUQR09SWEBJJVpRXlUKSBEDa2YNZG1bS2QFGjIbFBdPX1NdVAhMHgNpZwVQVFhPVwAfCisTIExtZG5eDEkRCl9mNVVtGh8IBxwHGRERBl1SWVkKTBQKb2AMVFtYS1AMGwYYFxRDbVVuXg",
"__jdv": "232945309|haosou-search|t_262767352_haosousearch|cpc|64193271509_0_51380d9ae6a9476e91057d00706e1f39|1774629880734",
"areaId": "14",
"cid": "9",
"ipLoc-djd": "14-1114-19784-19809",
"TARGET_UNIT": "bjcenter",
"cn": "10",
"__jdc": "143920055",
"3AB9D23F7A4B3CSS": "jdd03MTKEBANDFYXLCEUFHEGQVZJBQPA54PN72JHLPIFDAUFA5IB3JJ2XJXIJEY5DTJZ7T6KYCFZUV4TRU7KGPSEP2CXWAMAAAAM5LDRD2JYAAAAADIX3P4SERHS7D4X",
"thor": "E6F82FA843064E81389B64A7C320EA2C9AE0864145C47388FA445A73D95626E3D797E7B00C720905378FED205E63D2AD1A47A4B9BBFE05015F8190040F232FC0ED711DD0EDD5B5E3FF78F27BF6523EE6E00991199C58B484F1EEEF28BD14C3E07E2C10CF70488B45BABF31DAB317D7CCE2131E3D21F72947DBBF59D2DF6A058EF745CFB5029EFC3E195FD7F489621EC2F60A05EACE435628D4F5837ACD6BB562",
"shshshfpb": "BApXWmMvqW_hA-4GZkNUfLlIBDmEpKwNCBgDDL21j9xJ1ItZfQtCEkUu9jn_-N9BwKuOOiyCAsqFbdL5k7PsP49kvNFvg_TSENjyC",
"3AB9D23F7A4B3C9B": "MTKEBANDFYXLCEUFHEGQVZJBQPA54PN72JHLPIFDAUFA5IB3JJ2XJXIJEY5DTJZ7T6KYCFZUV4TRU7KGPSEP2CXWAM",
"flash": "3_8OCbLX_iHgW77S5rt3Zl3QbdBRrh5wCaETro8_zOBLy7QoyzAdexVu7Xzfkx9wAhZ9rBgIbKcjEtccotpzpscz87t9Fc5llnGKO0uuZPazrlZ_b2qWEGz63yhs4SnRhW9eA9SlLdAPDqp3ABgfhlI-uTSF7cKkez1sTFZTktINxcQHj*",
"__jda": "143920055.17653628168171158152459.1765362817.1775312713.1775316253.20",
"__jdb": "143920055.1.17653628168171158152459|20.1775316253",
"sdtoken": "AAbEsBpEIOVjqTAKCQtvQu17CSHOQDkV3LHEmNho4SfHGVvYmeYlOkp7Hnu-nxRXVDJ0gNJbv4-W6cZ7O2WPZscUwzPZ7QD3VZ0u8HP0PvazJ0f_HAxGn-8ERY0iz289EGodBGAW2wcOobqi1phO2eM"
}
url = "https://api.m.jd.com/api"
params = {
"appid": "search-pc-java",
"t": [
params_h5sign['t'],
str(int(time.time() * 1000))
],
"client": "pc",
"clientVersion": "1.0.0",
"cthr": "1",
"uuid": "17653628168171158152459",
"loginType": "3",
"keyword": "手机",
"functionId": "pc_search_searchWare",
"body": "\\{\"enc\":\"utf-8\",\"pvid\":\"8e9a18b33d3b418f9d0980a2072c2984\",\"area\":\"14_1114_19784_19809\",\"page\":1,\"mode\":null,\"concise\":false,\"newAdvRepeat\":false,\"new_interval\":true,\"s\":1\\}",
"x-api-eid-token": "jdd03MTKEBANDFYXLCEUFHEGQVZJBQPA54PN72JHLPIFDAUFA5IB3JJ2XJXIJEY5DTJZ7T6KYCFZUV4TRU7KGPSEP2CXWAMAAAAM5LDRD2JYAAAAADIX3P4SERHS7D4X",
"h5st": h5st_value}
response = requests.get(url, headers=headers, cookies=cookies, params=params)
print(response.text)
print(response)