腾讯微视去水印API签名校验怎么做
一、为什么要研究微视去水印接口的签名校验
很多做短视频工具、二次分发或内容聚合的同学,都会遇到一个共同的需求:拿到微视视频的原始无水印播放地址,以便在自己的产品里做预览、剪辑或二次编辑。微视官方并没有公开“去水印”API,所以大家通常会通过抓包分析,找到视频详情接口,再去掉 URL 中的水印参数。
但微视的接口并不是裸请求就能拿到数据的,它在请求头或 URL 上加了签名校验(sign / sig),如果签名不对,服务器会直接返回空数据或报错。因此,搞清楚“签名是怎么算出来的”,就成为整个去水印流程里最关键的一步。下面我们从抓包开始,一步步拆解。
二、准备工作:抓包工具与环境
在动手之前,先把工具准备齐全。下面的清单是社区里比较通用的组合,Windows、macOS、Linux 都能跑:
- 抓包工具:Charles、Fiddler 或 mitmproxy,推荐 mitmproxy,命令行更方便写脚本;
- 安卓模拟器或真机一台,安装最新版本微视 App;
- Python 3.8+ 环境,用于复现签名算法;
- jadx 或 jeb 一类的安卓反编译工具,用来查看 APK 里的签名逻辑。
提示:抓包时一定要装好 HTTPS 证书,否则只能看到加密流量,看不到明文参数。
三、抓包定位关键接口
3.1 找到视频详情请求
打开微视 App,随机点开一条视频,让它完整播放一次。回到抓包工具,按域名搜索 v.flash2.qq.com 或 api.weishi.qq.com,你会看到类似 /detail、/feed/detail 的请求,这���是视频详情接口。
3.2 记录请求参数
点开这条请求,把 Query String 和 Header 都复制下来,重点关注以下字段:
vid:视频 ID;format:返回格式,一般是 JSON;sign或sig:签名结果;timestamp:毫秒级时间戳;appid、openid、access_token:用户身份信息。
把这些字段整理成一张表,多抓几次不同视频,对比参数变化规律。通常你会发现 vid、timestamp 每次都变,而 appid、openid 基本固定。
四、反编译 APK 找到签名算法
4.1 反编译入口
用 jadx 打开微视 APK,全局搜索关键字 sign、md5、sha1、HmacSHA1 等,一般都能定位到签名工具类,类名可能叫 SignUtils、SecurityHelper 之类。
4.2 还原签名步骤
常见的微视签名逻辑可以归纳为下面几步:
- 把所有请求参数(除 sign 本身)按 key 做字典序排序;
- 把排序后的 key=value 用 & 拼接成字符串;
- 在字符串末尾追加一个固定的盐值(salt),盐值通常是一个 16~32 位的字符串,反编译里能看到;
- 对拼接结果做 MD5 或 SHA1 计算,得到的结果就是 sign。
不同版本微视可能用 MD5,也可能用 HmacSHA1,但思路大同小异。下面给出一个典型的伪代码:
String raw = sortAndJoin(params) + "&salt=XXXXXXXX";
String sign = md5(raw).toLowerCase();
五、用 Python 复现签名
5.1 安装依赖
复现过程只需要标准库加一个 requests,命令如下:
- pip install requests
5.2 完整示例代码
下面这段代码演示了如何从分享链接提取 vid、构造参数、计算签名、请求详情接口并解析出无水印播放地址:
import requests, time, hashlib, re
SHARE_URL = "https://h5.weishi.qq.com/weishi/page/xxxxx"
SALT = "这里填你反编译得到的盐值"
APPID = "这里填固定的 appid"
def get_vid(url):
m = re.search(r"vid=(\w+)", url)
return m.group(1) if m else None
def make_sign(params):
raw = "&".join(f"{k}={v}" for k, v in sorted(params.items()))
raw += f"&salt={SALT}"
return hashlib.md5(raw.encode()).hexdigest()
def fetch_video(share_url):
vid = get_vid(share_url)
ts = str(int(time.time() * 1000))
params = {"vid": vid, "format": "json", "timestamp": ts, "appid": APPID}
params["sign"] = make_sign(params)
r = requests.get("https://api.weishi.qq.com/feed/detail", params=params, timeout=10)
data = r.json()
return data.get("data", {}).get("video_url", "")
if __name__ == "__main__":
print(fetch_video(SHARE_URL))
5.3 去掉水印参数
拿到 video_url 后,通常链接里会带 watermark=1 或 logo=1 之类的参数,直接把它替换成 0,或者用正则删掉这些 query,再请求一次,就是无水印地址了:
- 原 URL:https://xxx.video?v=abc&watermark=1
- 无水印:https://xxx.video?v=abc&watermark=0
六、常见问题与排查思路
6.1 返回 403 或空数据
大概率是签名不对。先确认盐值有没有复制完整、有没有多余空格;其次检查参数排序是不是严格按 ASCII;最后确认时间戳是不是毫秒级,有些接口要求带 13 位。
6.2 接口突然失效
微视会不定期更新签名算法或加更多风控字段。建议每次跑不通时,重新抓一次最新版本的请求,反编译最新 APK 里的签名类,更新 SALT 或新增字段即可。
6.3 频率过高被封
单 IP 高频请求容易被风控拦截。可以在代码里加随机延时(1~3 秒),或者用代理池轮询,必要时接入打码平台处理验证码。
七、合规与安全建议
去水印接口只是技术手段,最终用途一定要遵守平台规则和著作权法。下面几条原则请务必牢记:
- 不要把无水印视频用于商业盈利或二次上传;
- 在产品里明确标注视频来源,尊重原作者署名权;
- 不要破解用户登录态,不要批量爬取他人隐私数据;
- 接口仅供学习与个人测试,商用前请咨询微视官方或法务团队。
八、总结
微视去水印的核心其实就三步:抓包拿到原始请求、反编译 APK 还原签名算法、用���码复现并去掉水印参数。整条链路里最耗时的往往是反编译和定位盐值,一旦拿到关键常量,剩下的就是常规的字典排序加 MD5。建议大家把签名逻辑封装成一个独立函数,方便后续微视版本升级时快速适配。技术是把双刃剑,合规使用才能走得更远。
常见问题(FAQ)
如何获取腾讯微视去水印API签名校验怎么做的无水印内容?
复制分享链接到玲珑去水印工具,在线解析即可获得无水印原画质文件。