短酷无水印视频接口分析

简介: 短酷无水印视频接口分析

title: 短酷无水印视频接口分析
date: 2020-05-15 17:04:32.0
updated: 2020-09-27 21:55:26.0
url: https://www.ufec.cn/archives/duankusign.html
thumbnail: https://ghproxy.com/https://raw.githubusercontent.com/ufec/picGoImg/main/blog/2020/05/3-012033e2a02c4ea3ab2217546f094f58.webp
categories:

  • 代码
  • 调试

tags:

  • Fiddler
  • JavaScript

准备工作

找到接口,看必要参数
4.webp
断点调试,找出生成 sign 的方法所在的 js 文件,使用Fiddler替换文件(之前的文章已经讲过,不再赘述),这里指出一点,使用此方法会遇到跨域的问题(用了本地转发),不过没关系,Fiddler依旧可以解决。具体方法如下:

打开  Rules->Customize Rules... 搜索 OnBeforeResponse

增加
if(oSession.uriContains("要处理的url")){
            oSession.oResponse["Access-Control-Allow-Origin"] =  "允许的域名";
            oSession.oResponse["Access-Control-Allow-Credentials"] = true;
}
保存,刷新网页

3.webp
即可,QQ 音乐就有这个问题,腾讯视频也是。

开始操作

1.webp
这一行是生成 sign 的,不用管什么参数,全打印出来就完事。
2.webp
这里直接比对 sign 值就可以了,多次刷新网页发现 sign 不变,这就很有意思,很有可能说明是直接用了某个加密方法,看到 substr(8,16)极大可能就是 MD5 了,他虽然写了好几万行,但那个对象转 query 请求参数,我还特意去找他怎么写得,调过来调过去的,当打印出来发现跟 nodejs 的 querystring 模块功能一样,懵了!
生成 sign 的方法就是 MD5,不过没导包,直接手写 MD5 算法,好像网上也有。附上扒下来的代码:

var o = 0, r = "";
function i(e) {
    return c(a(d(e)))
}
function c(e) {
    for (var n, t = o ? "0123456789ABCDEF" : "0123456789abcdef", r = "", i = 0; i < e.length; i++)
        n = e.charCodeAt(i),
        r += t.charAt(n >>> 4 & 15) + t.charAt(15 & n);
    return r
}
function a(e) {
    return f(m(p(e), 8 * e.length))
}
function f(e) {
    for (var n = "", t = 0; t < 32 * e.length; t += 8)
        n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
    return n
}
function d(e) {
    for (var n, t, o = "", r = -1; ++r < e.length; )
        n = e.charCodeAt(r),
        t = r + 1 < e.length ? e.charCodeAt(r + 1) : 0,
        55296 <= n && n <= 56319 && 56320 <= t && t <= 57343 && (n = 65536 + ((1023 & n) << 10) + (1023 & t),
        r++),
        n <= 127 ? o += String.fromCharCode(n) : n <= 2047 ? o += String.fromCharCode(192 | n >>> 6 & 31, 128 | 63 & n) : n <= 65535 ? o += String.fromCharCode(224 | n >>> 12 & 15, 128 | n >>> 6 & 63, 128 | 63 & n) : n <= 2097151 && (o += String.fromCharCode(240 | n >>> 18 & 7, 128 | n >>> 12 & 63, 128 | n >>> 6 & 63, 128 | 63 & n));
    return o
}
function m(e, n) {
    e[n >> 5] |= 128 << n % 32,
    e[14 + (n + 64 >>> 9 << 4)] = n;
    for (var t = 1732584193, o = -271733879, r = -1732584194, i = 271733878, a = 0; a < e.length; a += 16) {
        var s = t
            , c = o
            , l = r
            , u = i;
        o = y(o = y(o = y(o = y(o = b(o = b(o = b(o = b(o = v(o = v(o = v(o = v(o = g(o = g(o = g(o = g(o, r = g(r, i = g(i, t = g(t, o, r, i, e[a + 0], 7, -680876936), o, r, e[a + 1], 12, -389564586), t, o, e[a + 2], 17, 606105819), i, t, e[a + 3], 22, -1044525330), r = g(r, i = g(i, t = g(t, o, r, i, e[a + 4], 7, -176418897), o, r, e[a + 5], 12, 1200080426), t, o, e[a + 6], 17, -1473231341), i, t, e[a + 7], 22, -45705983), r = g(r, i = g(i, t = g(t, o, r, i, e[a + 8], 7, 1770035416), o, r, e[a + 9], 12, -1958414417), t, o, e[a + 10], 17, -42063), i, t, e[a + 11], 22, -1990404162), r = g(r, i = g(i, t = g(t, o, r, i, e[a + 12], 7, 1804603682), o, r, e[a + 13], 12, -40341101), t, o, e[a + 14], 17, -1502002290), i, t, e[a + 15], 22, 1236535329), r = v(r, i = v(i, t = v(t, o, r, i, e[a + 1], 5, -165796510), o, r, e[a + 6], 9, -1069501632), t, o, e[a + 11], 14, 643717713), i, t, e[a + 0], 20, -373897302), r = v(r, i = v(i, t = v(t, o, r, i, e[a + 5], 5, -701558691), o, r, e[a + 10], 9, 38016083), t, o, e[a + 15], 14, -660478335), i, t, e[a + 4], 20, -405537848), r = v(r, i = v(i, t = v(t, o, r, i, e[a + 9], 5, 568446438), o, r, e[a + 14], 9, -1019803690), t, o, e[a + 3], 14, -187363961), i, t, e[a + 8], 20, 1163531501), r = v(r, i = v(i, t = v(t, o, r, i, e[a + 13], 5, -1444681467), o, r, e[a + 2], 9, -51403784), t, o, e[a + 7], 14, 1735328473), i, t, e[a + 12], 20, -1926607734), r = b(r, i = b(i, t = b(t, o, r, i, e[a + 5], 4, -378558), o, r, e[a + 8], 11, -2022574463), t, o, e[a + 11], 16, 1839030562), i, t, e[a + 14], 23, -35309556), r = b(r, i = b(i, t = b(t, o, r, i, e[a + 1], 4, -1530992060), o, r, e[a + 4], 11, 1272893353), t, o, e[a + 7], 16, -155497632), i, t, e[a + 10], 23, -1094730640), r = b(r, i = b(i, t = b(t, o, r, i, e[a + 13], 4, 681279174), o, r, e[a + 0], 11, -358537222), t, o, e[a + 3], 16, -722521979), i, t, e[a + 6], 23, 76029189), r = b(r, i = b(i, t = b(t, o, r, i, e[a + 9], 4, -640364487), o, r, e[a + 12], 11, -421815835), t, o, e[a + 15], 16, 530742520), i, t, e[a + 2], 23, -995338651), r = y(r, i = y(i, t = y(t, o, r, i, e[a + 0], 6, -198630844), o, r, e[a + 7], 10, 1126891415), t, o, e[a + 14], 15, -1416354905), i, t, e[a + 5], 21, -57434055), r = y(r, i = y(i, t = y(t, o, r, i, e[a + 12], 6, 1700485571), o, r, e[a + 3], 10, -1894986606), t, o, e[a + 10], 15, -1051523), i, t, e[a + 1], 21, -2054922799), r = y(r, i = y(i, t = y(t, o, r, i, e[a + 8], 6, 1873313359), o, r, e[a + 15], 10, -30611744), t, o, e[a + 6], 15, -1560198380), i, t, e[a + 13], 21, 1309151649), r = y(r, i = y(i, t = y(t, o, r, i, e[a + 4], 6, -145523070), o, r, e[a + 11], 10, -1120210379), t, o, e[a + 2], 15, 718787259), i, t, e[a + 9], 21, -343485551),
        t = _(t, s),
        o = _(o, c),
        r = _(r, l),
        i = _(i, u)
    }
    return Array(t, o, r, i)
}
function p(e) {
    for (var n = Array(e.length >> 2), t = 0; t < n.length; t++)
        n[t] = 0;
    for (t = 0; t < 8 * e.length; t += 8)
        n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
    return n
}
function y(e, n, t, o, r, i, a) {
    return h(t ^ (n | ~o), e, n, r, i, a)
}
function _(e, n) {
    var t = (65535 & e) + (65535 & n);
    return (e >> 16) + (n >> 16) + (t >> 16) << 16 | 65535 & t
}
function b(e, n, t, o, r, i, a) {
    return h(n ^ t ^ o, e, n, r, i, a)
}
function h(e, n, t, o, r, i) {
    return _((a = _(_(n, e), _(o, i))) << (s = r) | a >>> 32 - s, t);
    var a, s
}
function g(e, n, t, o, r, i, a) {
    return h(n & t | ~n & o, e, n, r, i, a)
}
function v(e, n, t, o, r, i, a) {
    return h(n & o | t & ~o, e, n, r, i, a)
}

调用方法

console.log(i("11111"));

整个过程用 PHP 写了一下,挺简单的,测试接口地址:http://47.115.40.125:1234/duanku.php?url=https://t.kugou.com/1VN2Ga8wlV3

写在结尾

网页调试很容易被表象迷惑,先看参数后找方法,不然就会被一些看似繁琐的代码带偏。
网页调试:断点看过程->不懂就替换->参数都输出->CV 大法直接用

目录
相关文章
|
1月前
|
编解码 JavaScript 前端开发
使用 MediaSource 规范实现自适应流播放
【10月更文挑战第26天】通过以上步骤,就可以使用MediaSource规范实现自适应流播放,根据网络状况动态地调整播放的码率,为用户提供更流畅的观看体验。需要注意的是,实际应用中还需要处理更多的细节和错误情况,以确保播放的稳定性和可靠性。
|
5月前
|
数据安全/隐私保护
软件开发常见流程之水印添加水印需求
软件开发常见流程之水印添加水印需求
|
7月前
|
开发工具 数据安全/隐私保护 Android开发
视觉智能平台常见问题之图片解析出的水印图判断是自己添加的水印图如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
100 1
|
7月前
|
存储 数据处理 API
视觉智能平台常见问题之通用视频生成接口声音和画面对不上如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
|
存储 编解码
ffmpeg CBR精准码流控制三个步骤
ffmpeg CBR精准码流控制三个步骤
490 0
|
人工智能
批量提取某音视频文案(二)
介绍批量提取视频文案的流程, 以及做视频的步骤
587 0
|
前端开发 JavaScript 数据安全/隐私保护
你知道前端水印功能是怎么实现的吗?(二)
你知道前端水印功能是怎么实现的吗?
151 0
|
JavaScript 前端开发 安全
你知道前端水印功能是怎么实现的吗?(一)
你知道前端水印功能是怎么实现的吗?
322 0
|
数据安全/隐私保护
生活中常用的图片去水印方法有哪些呢
有时候我们想换头像/微信背景墙了 是不是第一时间想到的是去某书逛逛,有时候看到有些博主分享的壁纸或者表情包等,忍不住的想保存下来,很多人应该还不知道如何下载吧,今天分享我的三个操作方法
|
人工智能 小程序 数据安全/隐私保护
微信8.0状态视频无水印素材+个人设置技巧
微信8.0状态视频无水印素材+个人设置技巧
316 0
微信8.0状态视频无水印素材+个人设置技巧