淘宝x-sign算法解密分析(更新时间:2020-07-04)
大家都知道只要有了x-sign基本上所有事情都可以干,包括但不仅限于商品信息,商品评价,秒杀活动等等
本文将演示如何获取淘宝商品评价信息,以iphone11为例 https://detail.tmall.com/item.htm?id=602659642364
联系qq: 407507121
抓包分析
通过frida禁用协议+charles手机抓包分析得出评价获取参数为如下几个:
url:https://guide-acs.m.taobao.com/gw/mtop.taobao.rate.detaillist.get/4.0/
参数:data={"hasPic":"1","pageNo":"1","pageSize":"10","auctionNumId":"602659642364"}
头信息:有好多头信息,最重要的x-sign
携带签名的请求头调用
先放一个调用服务获取headers成功请求到数据的图片
使用说明:
- 调用get_comment_headers方法,传入要请求的商品id,毫秒级获取携带加密x-sign请求头。调用该方法不限ip和机器,需要准备自己的redis,并可远程连接。
- x-sign加签服务部署在windows电脑或服务器,需安装安卓模拟器,不需要手机!x-sign加签服务部署,需要联系QQ获取。
- 该服务稳定性高,不限并发。成本极低,技术易掌握,同一版本app加密方法基本一致,参数会有变化,所以该服务同样可应用其他接口,掌握技术可以自己研究。这里只提供商品评价接口技术支持。
参数说明
- data:就是参数data, 包含要请求数据原始信息, data是原始值比如"{\"pageSize\":\"10\",\"foldFlag\":\"0\",\"hasPic\":\"1\",\"pageNo\":\"1\",\"auctionNumId\":\"602659642364\"}"。
- appKey:默认"21646297",且只能是"21646297",不管你是其他什么值,即使传了其他值也会被换掉,也就是说可以不传这个参数
- pv:默认"5.1"
- 如有其他疑问,或者需要帮助的请联系qq: 407507121
返回值说明
返回值就是一个请求头,字典类型,字段都不能少,发送http请求,携带该请求头,即可获取数据,简单易用。可用于requests 或者scrapy.
python 版本demo
运行条件: python3 + requests 库
import datetime
import urllib
import time
import requests
import redis
requests.packages.urllib3.disable_warnings()
redis_config = {
'host': '*',
'port': 6379,
'db': 2,
'password': '*',
'decode_responses': True
}
worker_conn = redis.Redis(**redis_config)
# 发布任务
def publish_task(task_key, task_id):
worker_conn.lpush(task_key, task_id)
# 获取任务结果
def get_result(task_key, task_id):
publish_task(task_key, task_id)
i = 0
while i<100:
data = worker_conn.lpop(task_id)
if data:
return eval(data)
else:
i += 1
time.sleep(0.1)
print("该任务执行时间超过10秒")
return None
def get_comment_headers(task_id):
return get_result('comment_task', task_id)
if __name__ == '__main__':
start = datetime.datetime.now()
nid = '602659642364'
data = '{"hasPic":"1","pageNo":"1","pageSize":"10","auctionNumId":"%s"}' % nid
url1 = 'https://guide-acs.m.taobao.com/gw/mtop.taobao.rate.detaillist.get/4.0/?data=' + urllib.parse.quote(data)
print(url1)
headers = get_comment_headers(nid)
print(headers)
print(type(headers))
end = datetime.datetime.now()
print("获取headers耗时:", end - start)
resp = requests.get(url1, headers=headers, verify=False).text
print(resp)
技术支持
联系qq: 407507121