盒马鲜生app商品详情查询 python 淘宝h5 sign

包含查询分类商品列表 mtop.wdk.classify.queryclassifyitemsv4

查询商品详细数据 mtop.wdk.detail.openservice

 

import time
import requests
import hashlib

from requests.api import post

# js源码: c.appKey || ("waptest" === d.subDomain ? "4272" : "23228014")
# 如果是 waptest appkey则是4272 否则则是 23228014
# 联系 QQ 214783030 app全接口数据
APP_KEY="23228014"


def main():
    # 需要 时间戳 和 sign两个参数
    url = "http://acs.m.taobao.com/h5/mtop.wdk.classify.queryclassifyitemsv4/1.0/?jsv=2.5.1&appKey=23228014&t={}&sign={}&type=originaljson&dataType=json&timeout=5000"
    # 13位时间戳
    timestr = int(round(time.time() * 1000))
    # header头
    headers = {
        "content-type": "application/x-www-form-urlencoded",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
        "accept": "application/json"
    }


    post_data = r"""{"needFullPageSize":"true","needProperties":"0","originCatId":"205954909","trackInfo":"{\"hotSourceType\":\"hotSell_270819\",\"moudleIndex\":\"2.2\",\"spm-pre\":\"a21dw.8199429.category.2\"}","bizType":"sx","pagination":"29-10-1-0","enableTmdSelect":"0","secCatId":"205954909","enableNisitc":"0","catId":"205954909","curItemCatId":"205954909","isNOInventory":"true","shopIds":"156775275,360861272,331458382,292982260,535423019,577743005,214016065,160039352,232747349,234340026,190417236,571201201,677950313","rn":"1c7828aee56d43d788f7dfe77fc48644","catIds":"[{\"catId\":\"205954909\",\"catTemplateId\":\"3\",\"categoryType\":\"3\",\"displayProperties\":\"0\",\"enableNisitc\":\"0\",\"enableOrder\":\"0\",\"enableTmdSelect\":\"0\",\"extend\":{}}]"}"""

    # 组装参数 得到sign
    arg = f"undefined&{timestr}&{APP_KEY}&{post_data}"
    sign = hashlib.md5(arg.encode()).hexdigest()

    # 第一次请求得到 _m_h5_tk 和 _m_h5_tk_enc 两个cookie
    resp = requests.post(url.format(timestr, sign), data={"data": post_data}, headers=headers)
    resp1=resp
    print(f"第一次请求: {resp1.text}\n")

    # 需要从cookie的_m_h5_tk中得到token
    token=''
    for name, value in resp.cookies.items():
        if name == "_m_h5_tk":
            token = value.split("_")[0]
   # 再次得到时间戳
    timestr = int(round(time.time() * 1000))
    # 此次arg的第一个参数需要 token
    arg = f"{token}&{timestr}&{APP_KEY}&{post_data}"
    sign = hashlib.md5(arg.encode()).hexdigest()

    print(f"token: {token}\nsign: {sign}\n")
    ###
    #alipay  查询商品详情  shopIds 盒马门店ID itemId 商品ID
    url = "http://h5api.m.taobao.com/h5/mtop.wdk.detail.openservice/1.0/?jsv=2.5.1&appKey=23228014&t={}&sign={}&type=originaljson&dataType=json&timeout=5000"
    post_data = r'{"extParam":"false_20200707","ifSkuPanel":"false","itemId":"650472945903","poi":"118.302649,31.260759","shopIds":"189031339","showSeries":false,"showSeriesTitle":false,"skuId":0,"source":"alipay","terminal":"HEMA_APPLETS"}'
    headers = {
        "content-type": "application/x-www-form-urlencoded",
        "user-agent": "MTOPSDK%2F3.1.1.7+%28Android%3B11%3BXiaomi%3BMi+10+Pro%29",
        "accept": "application/json"
    }

    timestr = int(round(time.time() * 1000))
    # 此次arg的第一个参数需要 token
    arg = f"{token}&{timestr}&{APP_KEY}&{post_data}"
    sign = hashlib.md5(arg.encode()).hexdigest()
    resp = requests.post(url.format(timestr, sign), data={"data": post_data}, headers=headers, cookies=requests.utils.dict_from_cookiejar(resp1.cookies))
    print(f"查询详情: {resp.text}\n")
\

if __name__ == '__main__':
    main()



### 淘宝详情页 Sign 参数的作用 Sign 参数的主要作用是对请求的安全性进行验证,防止恶意调用或伪造请求。具体来说,在淘宝 H5 页面中,为了降低 appsecret 泄露的风险,采用了基于 token 的机制来成签名[^2]。这种机制的核心在于通过服务端分配给每个用户的唯一 token 来计算 URL 请求参数的摘要值(即 sign),从而确保每次请求都经过授权。 当用户发起请求时,浏览器会自动携带存储在 cookie 中的 token 返回到服务器。随后,客户端依据此 token 对请求中的其他参数按照特定算法sign 值,并将其附加到请求中发送至服务端。服务端接收到请求后重新计算一次 sign 并与传入的 sign 进行对比,如果两者一致,则认为该请求合法;反之则拒绝处理。 ### 淘宝详情页 Sign 参数的成方法 根据已知的信息,sign 参数通常由以下几步逻辑构成: 1. **Token 获取**: 用户首次访问时,服务端会为其成一个唯一的 token 并存放在 Cookie 中。 2. **参数拼接**: 将所有需要参与签名的请求参数按字母顺序排列并连接成字符串形式。例如假设存在两个参数 `a=1` 和 `b=2` ,那么最终形成的待签名串可能是 `"a=1&b=2"` 或者加上固定前缀如 `"appkey={your_app_key}&a=1&b=2"`。 3. **密钥混合**: 使用上述整理好的字符串与预设定的应用私钥 (AppSecret) 结合起来形成新的整体输入源材料用于下一步操作。 4. **哈希运算**: 应用 MD5 或 SHA 系列等标准散列函数对此组合体执行单向加密转换得到固定长度的结果作为初步摘要信息。 5. **编码调整**: 如果必要的话还可以进一步做 Base64 编码或者其他自定义格式化步骤以便于网络传输兼容性和可读性的提最后产出的就是实际使用的 sign 字段内容了。 以下是模拟实现的一个简单 Python 版本例子: ```python import hashlib from urllib.parse import urlencode def generate_sign(params, app_secret): sorted_params = dict(sorted(params.items())) param_str = urlencode(sorted_params) raw_string = f"{param_str}{app_secret}" md5_hasher = hashlib.md5() md5_hasher.update(raw_string.encode('utf-8')) return md5_hasher.hexdigest().upper() # Example usage: params = { 'a': 1, 'b': 2 } app_secret = "example_app_secret" print(generate_sign(params, app_secret)) ``` 需要注意的是真实环境下的算法可能会更加复杂包含更多细节控制点比如时间戳有效期校验等等因此以上仅作为一个基础概念演示仅供参考不可直接应用于产环境中去替代官方提供的 SDK 功能模块。 ### API 接口中的应用实例 以淘宝商品详情页 API (`mtop.taobao.detail.data.get`)为例,开发者可以通过传递正确的 sign 参数与其他必需字段一起构建完整的 HTTP GET/POST 请求来获取目标产品的详细资料包括但不限于主图链接、SKU 列表及其对应的价格属性描述文案等内容[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值