当前位置: 首页 > article >正文

保姆级教程:手把手教你用Python复现大麦网H5/Web端sign签名算法(附完整代码)

深入解析大麦网H5/Web端sign签名机制与Python实战实现在当今互联网应用中数据安全与接口防护已成为开发者必须面对的重要课题。各大平台纷纷采用各种签名机制来验证请求的合法性防止恶意爬取和非法调用。作为国内领先的票务平台大麦网采用了基于MD5的sign签名算法来保护其API接口。本文将带您深入理解这一签名机制的工作原理并手把手教您如何用Python完整复现这一过程。1. 大麦网sign签名机制解析大麦网的sign签名主要用于H5和Web端接口请求的身份验证其核心思想是通过将多个关键参数按特定规则组合后进行MD5加密生成一个唯一的签名值。服务器端会以同样的方式计算签名只有两者匹配时才认为请求合法。签名生成涉及以下几个关键要素token来源于cookie中的_m_h5_tk字段如果没有该字段则使用字符串undefined时间戳(ts)当前请求的时间戳精确到毫秒appKey固定值12574478根据实际抓包分析请求数据(data)接口请求的主体数据通常是JSON字符串签名生成的基本公式为sign md5(token ts appKey data)2. 环境准备与工具选择在开始编码实现之前我们需要准备适当的开发环境和工具2.1 必备工具Python 3.7推荐使用最新稳定版requests库用于发送HTTP请求hashlib库Python内置的加密库用于MD5计算浏览器开发者工具用于抓包和分析网络请求Fiddler/Charles可选更专业的抓包工具2.2 开发环境配置# 创建虚拟环境推荐 python -m venv damai_env source damai_env/bin/activate # Linux/Mac damai_env\Scripts\activate # Windows # 安装必要依赖 pip install requests3. 签名生成的核心实现下面我们将分步骤实现大麦网sign签名的生成逻辑。完整的Python类实现如下import hashlib import time from typing import Dict, Optional class DamaiSignGenerator: def __init__(self, cookies: Optional[Dict[str, str]] None): 初始化签名生成器 :param cookies: 包含_m_h5_tk的cookie字典可选 self.cookies cookies or {} self.app_key 12574478 # 大麦网固定appKey def get_sign(self, data: str) - str: 生成大麦网sign签名 :param data: 请求的JSON数据字符串 :return: 生成的sign签名值 # 获取当前时间戳毫秒 ts str(int(time.time() * 1000)) # 从cookie中提取token token self._extract_token() # 构造待加密字符串 text_to_hash f{token}{ts}{self.app_key}{data} # 计算MD5值 return self._calculate_md5(text_to_hash) def _extract_token(self) - str: 从cookie中提取token :return: 提取到的token或undefined if _m_h5_tk in self.cookies: return self.cookies[_m_h5_tk].split(_)[0] return undefined def _calculate_md5(self, text: str) - str: 计算字符串的MD5值 :param text: 待加密字符串 :return: MD5哈希值 md5 hashlib.md5() md5.update(text.encode(utf-8)) return md5.hexdigest()3.1 关键代码解析时间戳获取ts str(int(time.time() * 1000))大麦网使用毫秒级时间戳因此需要将当前时间乘以1000后取整。token提取if _m_h5_tk in self.cookies: return self.cookies[_m_h5_tk].split(_)[0]_m_h5_tk通常格式为token_时间戳我们只需要下划线前的部分。MD5计算md5 hashlib.md5() md5.update(text.encode(utf-8)) return md5.hexdigest()注意需要先将字符串编码为UTF-8格式再进行哈希计算。4. 实战应用与接口调用有了签名生成器后我们可以实际调用大麦网的API接口。以下是一个完整的示例import json import requests # 示例数据根据实际接口调整 request_data { itemId: 123456, performId: 789, skuId: 101112 } # 初始化签名生成器需提供实际cookie cookies { _m_h5_tk: abcdef123456_1620000000000, # 其他必要cookie... } signer DamaiSignGenerator(cookies) # 准备请求参数 data_str json.dumps(request_data, separators(,, :), ensure_asciiFalse) sign signer.get_sign(data_str) timestamp str(int(time.time() * 1000)) # 构造请求头 headers { Content-Type: application/json, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 } # 发送请求 params { appKey: 12574478, t: timestamp, sign: sign, data: data_str } response requests.post( https://mtop.damai.cn/h5/mtop.damai.wireless.item.detail/1.0/, paramsparams, headersheaders, cookiescookies ) print(response.json())4.1 请求参数说明参数名类型说明appKey字符串固定值12574478t字符串时间戳与签名计算使用的一致sign字符串计算得到的签名值dataJSON字符串请求的主体数据4.2 常见问题与调试技巧签名验证失败检查时间戳是否同步服务器时间可能有微小差异确认data字符串是否完全一致注意空格和特殊字符验证token是否正确提取cookie获取首次访问可能没有_m_h5_tk需要先访问首页获取该cookie通常有有效期过期后需要重新获取数据格式化json.dumps(request_data, separators(,, :), ensure_asciiFalse)使用separators去除多余空格确保与前端生成的一致5. 进阶优化与安全考量在实际应用中我们还需要考虑以下方面来完善我们的实现5.1 性能优化对于高频请求可以对签名生成进行优化from functools import lru_cache lru_cache(maxsize128) def get_sign_cached(self, data: str) - str: 带缓存的签名生成方法 return self.get_sign(data)注意缓存仅适用于短时间内相同参数的重复请求对于实时性要求高的场景慎用5.2 错误处理完善的错误处理机制可以增强代码的健壮性def safe_get_sign(self, data: str, max_retry3) - Optional[str]: 带重试机制的签名生成 for attempt in range(max_retry): try: return self.get_sign(data) except Exception as e: if attempt max_retry - 1: print(f生成签名失败: {str(e)}) return None time.sleep(1 * (attempt 1))5.3 安全最佳实践妥善保管cookie信息不要硬编码在代码中考虑使用环境变量或配置文件存储敏感信息限制请求频率避免被封禁遵守网站robots.txt规定6. 完整代码整合以下是整合了所有功能的完整实现import hashlib import time import json from typing import Dict, Optional, Any import requests from functools import lru_cache class DamaiAPI: def __init__(self, cookies: Optional[Dict[str, str]] None): self.cookies cookies or {} self.app_key 12574478 self.base_url https://mtop.damai.cn/h5 self.session requests.Session() def get_sign(self, data: str) - str: 生成签名 ts str(int(time.time() * 1000)) token self._extract_token() text f{token}{ts}{self.app_key}{data} return self._calculate_md5(text) lru_cache(maxsize128) def get_sign_cached(self, data: str) - str: 带缓存的签名生成 return self.get_sign(data) def call_api(self, api_path: str, data: Dict[str, Any], methodpost) - Dict[str, Any]: 调用大麦网API data_str json.dumps(data, separators(,, :), ensure_asciiFalse) sign self.get_sign(data_str) timestamp str(int(time.time() * 1000)) params { appKey: self.app_key, t: timestamp, sign: sign, data: data_str } headers { Content-Type: application/json, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)... } url f{self.base_url}{api_path} if method.lower() post: response self.session.post(url, paramsparams, headersheaders, cookiesself.cookies) else: response self.session.get(url, paramsparams, headersheaders, cookiesself.cookies) return response.json() def _extract_token(self) - str: 从cookie中提取token if _m_h5_tk in self.cookies: return self.cookies[_m_h5_tk].split(_)[0] return undefined def _calculate_md5(self, text: str) - str: 计算MD5值 md5 hashlib.md5() md5.update(text.encode(utf-8)) return md5.hexdigest() # 使用示例 if __name__ __main__: cookies { _m_h5_tk: your_token_here, # 其他必要cookie... } damai DamaiAPI(cookies) # 调用商品详情接口 result damai.call_api( /mtop.damai.wireless.item.detail/1.0/, {itemId: 123456} ) print(result)这个完整的实现类包含了签名生成、API调用、缓存优化等功能可以直接集成到您的项目中。

相关文章:

保姆级教程:手把手教你用Python复现大麦网H5/Web端sign签名算法(附完整代码)

深入解析大麦网H5/Web端sign签名机制与Python实战实现 在当今互联网应用中,数据安全与接口防护已成为开发者必须面对的重要课题。各大平台纷纷采用各种签名机制来验证请求的合法性,防止恶意爬取和非法调用。作为国内领先的票务平台,大麦网采用…...

Phi-3 Forest Laboratory 实现简易搜索引擎:本地知识库的语义检索与问答

Phi-3 Forest Laboratory 实现简易搜索引擎:本地知识库的语义检索与问答 你有没有遇到过这种情况?公司内部的技术文档、产品手册、会议纪要散落在各个角落,想找一个具体问题的答案,要么是记不清文件名,要么是搜出来的…...

避坑指南:uniapp按钮退出小程序时千万别犯这3个错误

Uniapp小程序退出功能实战:避开3个致命陷阱的终极方案 当你第一次在Uniapp中实现小程序退出功能时,是否遇到过审核被拒、低版本闪退或用户投诉误触的问题?这些看似简单的按钮背后,藏着足以毁掉用户体验的技术陷阱。本文将揭示那些…...

SPIRAN ART SUMMONER实战:为你的游戏角色生成FFX风格原画

SPIRAN ART SUMMONER实战:为你的游戏角色生成FFX风格原画 1. 认识SPIRAN ART SUMMONER SPIRAN ART SUMMONER是一款专为《最终幻想10》(FFX)风格艺术创作设计的AI图像生成工具。它基于Flux.1-Dev模型,融合了定制LoRA权重,能够生成极具FFX特色…...

璀璨星河效果展示:支持负向提示词的幻想边界控制案例

璀璨星河效果展示:支持负向提示词的幻想边界控制案例 1. 沉浸式艺术创作体验 璀璨星河(Starry Night)是一个让人眼前一亮的AI艺术生成平台,它完全打破了传统AI工具那种冷冰冰的工业感。打开界面的一瞬间,你会感觉自己…...

Chandra OCR在文档处理中的应用:如何用RTX 3060搭建智能OCR系统

Chandra OCR在文档处理中的应用:如何用RTX 3060搭建智能OCR系统 1. 为什么选择Chandra OCR 在日常办公和数据处理中,我们经常遇到这样的困扰: 扫描的合同或发票需要手动录入关键信息纸质文档转电子版后格式错乱表格数据识别不完整&#xf…...

Qwen3-4B Instruct-2507作品集:用户原始提问→模型思考链→最终回答三栏对照

Qwen3-4B Instruct-2507作品集:用户原始提问→模型思考链→最终回答三栏对照 今天,我想带大家看一个特别有意思的东西。我们经常用大模型,输入问题,得到答案,但中间那个“黑盒子”里到底发生了什么,模型是…...

【军工级C语言代码加密实战指南】:20年国防软件安全专家亲授7大不可逆加密策略与3个致命误区

第一章:军工级C语言代码加密的使命与边界军工级C语言代码加密并非单纯追求密钥长度或算法复杂度,而是以系统生存性、抗逆向能力、运行时完整性与可信执行环境协同为根本目标。其核心使命在于确保关键嵌入式控制逻辑(如飞控指令解析、加密协处…...

Qt 6.5 + OpenGL 实战:手把手教你打造一个可交互的3D动态曲线可视化工具

Qt 6.5与OpenGL实战:构建交互式3D动态曲线可视化工具 在数据可视化领域,3D动态曲线展示一直是个既基础又关键的需求。想象一下,你正在开发一个实时监控系统,需要直观展示传感器数据的空间变化;或者你正在分析金融市场&…...

Grove LED矩阵驱动模块技术解析:STM32协处理器与双色扫描原理

1. Grove - LED Matrix Driver 项目深度技术解析Grove - LED Matrix Driver 是 Seeed Studio 推出的一款面向嵌入式显示应用的专用驱动模块,其核心价值在于将复杂的双色 LED 矩阵扫描控制逻辑封装为可复用、低侵入的固件方案。该模块并非简单的 I/O 扩展器&#xff…...

从零开始解读SEO实战,提高网站流量的实用指南

在学习SEO的过程中,首先需要对其基本概念有一个清晰的了解。SEO,即搜索引擎优化,主要是通过优化网站内容和结构,以提升在搜索引擎中的排名,从而吸引更多用户访问。新手可以从关键词研究入手,找到受众普遍使…...

避坑指南:Flutter混合开发时Android依赖冲突的终极解决方案(含阿里云镜像配置)

Flutter混合开发中Android依赖冲突的深度解决方案与优化实践 Flutter混合开发已经成为许多团队的首选方案,但当你试图在现有Android项目中集成Flutter模块时,依赖冲突问题往往会让你陷入"构建地狱"。特别是当不同模块对同一库有不同版本要求时…...

3D Face HRN模型参数详解与调优指南

3D Face HRN模型参数详解与调优指南 1. 引言 如果你正在使用3D Face HRN模型进行人脸重建,可能会遇到这样的困惑:为什么同样的模型,别人生成的效果那么精细,而自己的结果总是不够理想?其实很多时候,问题不…...

别再手动点选了!Star-CCM+里用这个技巧批量命名零部件面,效率翻倍

Star-CCM批量命名技巧:告别低效手动操作,解锁工程仿真新姿势 每次打开包含数百个流道面的动力电池包模型时,你是否会对着密密麻麻的未命名面感到绝望?当领导要求在两小时内完成发动机缸体所有热源面的分组命名时,你的…...

ArduinoSocketIo:嵌入式设备轻量级Socket.IO协议实现

1. ArduinoSocketIo 库深度解析:面向嵌入式设备的轻量级 Socket.IO 协议实现1.1 项目定位与工程价值ArduinoSocketIo 是一个专为资源受限嵌入式平台(如 ESP32、ESP8266、Arduino MKR WiFi 1010 等)设计的 Socket.IO 客户端/服务器库。它并非从…...

Zabbix 核心代码目录结构

Zabbix 核心代码目录的功能分层围绕监控系统的核心能力模块设计,每个目录都承担明确的功能职责,且模块间解耦性强、扩展灵活。以下是按功能维度梳理的核心目录分层解析(附关键子目录/文件说明): 一、核心程序层&#x…...

DAMO-YOLO视觉探测系统:5分钟快速部署,小白也能玩转工业级AI质检

DAMO-YOLO视觉探测系统:5分钟快速部署,小白也能玩转工业级AI质检 1. 引言:零基础玩转AI质检 想象一下,你刚接手工厂质检工作,面对流水线上源源不断的产品,传统的人工检测方式让你手忙脚乱。现在&#xff…...

基于GEC6818的牛棚环境边缘闭环控制系统设计

1. 项目概述1.1 系统定位与工程背景现代规模化牛棚对环境参数的稳定性提出严苛要求:温度需维持在10–22℃区间,相对湿度宜控制在60–75%,氨气浓度须低于20ppm,饮水槽水位需保持在有效供水高度。人工巡检存在响应延迟(平…...

Qwen3-32B-Chat镜像实操:bash start_webui.sh一键启动,告别pip install报错

Qwen3-32B-Chat镜像实操:bash start_webui.sh一键启动,告别pip install报错 1. 镜像概述与核心优势 Qwen3-32B-Chat私有部署镜像专为RTX 4090D 24GB显存显卡深度优化,基于CUDA 12.4和驱动550.90.07构建。这个镜像的最大特点是开箱即用&…...

告别事件查看器!FullEventLogView实战:3步搞定Windows服务器日志分析

FullEventLogView进阶指南:企业级Windows日志分析实战 Windows服务器日志分析一直是系统管理员日常运维中的痛点。传统的事件查看器操作繁琐、筛选效率低下,面对海量日志时往往让人束手无策。FullEventLogView作为一款轻量级但功能强大的替代工具&#x…...

微信公众号自动回复功能实战:从零配置到高级关键词匹配(PHP原生代码版)

微信公众号自动回复功能实战:从零配置到高级关键词匹配(PHP原生代码版) 在当今社交媒体营销的浪潮中,微信公众号已成为企业与用户互动的重要桥梁。而自动回复功能,则是这个桥梁上最基础也最实用的"智能接待员&qu…...

Kotlin下OkHttp的LoggingInterceptor配置指南:从基础使用到高级定制

Kotlin下OkHttp的LoggingInterceptor配置指南:从基础使用到高级定制 在移动开发领域,网络请求日志记录是调试和问题排查的重要工具。OkHttp作为Android平台上最流行的HTTP客户端之一,其内置的LoggingInterceptor为开发者提供了便捷的日志记录…...

别再傻傻等conda下载了!手把手教你用迅雷+清华源离线安装PyTorch(附pip/conda双方案)

突破网络限制:PyTorch离线安装全攻略(清华源迅雷实战) 每次看到conda进度条卡住不动的时候,是不是特别想砸键盘?尤其是在公司内网或者校园网环境下,PyTorch的安装过程简直是一场噩梦。今天我要分享的这套方…...

ArcGIS新手必看:从安装到基础操作的完整指南(附常见问题解决方案)

ArcGIS新手必看:从安装到基础操作的完整指南(附常见问题解决方案) 如果你是第一次接触ArcGIS,可能会被它庞大的功能体系所震撼。作为地理信息系统(GIS)领域的行业标准软件,ArcGIS提供了从数据采…...

保姆级教程:用ThreeJS和3DTilesRendererJS加载无人机倾斜摄影模型(附源码)

从无人机航测到Web3D展示:ThreeJS与3DTiles全流程实战指南 倾斜摄影技术正逐渐成为数字城市建设、工程测绘等领域的重要工具。当您完成无人机航拍并获取了大量OSGB格式数据后,如何将这些专业数据转化为可在网页中流畅展示的3D模型?本文将带您…...

Ubuntu离线环境部署ClamTk:从依赖包处理到图形化扫描实战

1. 离线环境下的安全防护挑战 在企业的内网环境中,服务器和工作站通常处于严格的网络隔离状态。这种安全措施虽然有效防止了外部攻击,但也带来了软件部署的难题——尤其是杀毒软件这类需要频繁更新的安全工具。我去年就遇到过这样的场景:某金…...

配电网电压控制的二阶锥优化实战(MATLAB篇)

配电网电压控制、二阶锥优化SOCP、matlab、光伏风电机。 使用二阶锥模型对有源配电网进行电压控制。 系统:33节点配电网 被控对象:光伏、风机、SVC 平台:matlab 框架:集中式 算法:二阶锥 超级适合小白入门学习。最近在研究有源配电网电压控制时发现,二阶锥优化&…...

Ubuntu24.04下Qt6安装全攻略:从镜像加速到常见错误解决

Ubuntu 24.04下Qt6安装全攻略:从镜像加速到疑难排错 在Linux生态中,Qt框架一直是跨平台开发的标杆工具。随着Ubuntu 24.04 LTS的发布和Qt6的成熟,许多开发者开始在新系统上搭建开发环境。本文将带你完整走通Qt6的安装流程,并解决那…...

从Ring-Allreduce到实战:用DDP加速你的PyTorch多卡训练(附A100配置模板)

从Ring-Allreduce到实战:用DDP加速你的PyTorch多卡训练(附A100配置模板) 在深度学习模型规模爆炸式增长的今天,单卡训练已经无法满足大模型的需求。PyTorch的DistributedDataParallel(DDP)凭借其高效的Ring…...

COCO数据集迁移学习全攻略:从预训练模型到自定义数据集训练

COCO数据集迁移学习实战指南:从模型选择到自定义训练全流程 在计算机视觉领域,迁移学习已成为加速模型开发、提升性能的关键技术。作为业界标杆的COCO数据集,其预训练模型为各类视觉任务提供了强大的基础。本文将深入探讨如何基于COCO预训练模…...