吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17847|回复: 155
收起左侧

[Web逆向] 清风DJ网在线播放地址JS解密转MP3方法

    [复制链接]
paxj168 发表于 2021-10-26 19:44
前面看到@ehepls 兄弟发布的易语言版,我来发一个python版的


准备工作:


1、网址:https://www.vvvdj.com/play/221250.html
2、python3.9
3、发条JS工具
4、格式工厂


1、抓包
              1-1、谷妹儿浏览器,F12  
              1-2、具体内看@ehepls 兄弟发布的方法
抓包01.jpg

经过分析发现,他的JS并不是独立的,而是在播放页面里面先执行,取得吗m3u8播放地址 + upt的值 + news
[HTML] 纯文本查看 复制代码
https://tspc.vvvdj.com/c1/2021/10/221250-bf40bf/221250.m3u8?upt=d75e43361637855999&news


抓包02.jpg

2、解密

[JavaScript] 纯文本查看 复制代码
    function DeCode() {
        this.OO0O00OO00OO = function (a, b) {
            return b > 0 ? a.substring(0, b) : null;
        }, this.OO00OO0O00O0 = function (a, b) {
            return a.length - b >= 0 && a.length >= 0 && a.length - b <= a.length ? a.substring(a.length - b, a.length) : null;
        }, this.O0000OO0OO00O0 = function (a, b) {
            var c, d, e, f, g, h, i, j, k = "";
            for (c = 0; c < b.length; c++) {
                k += b.charCodeAt(c).toString();
            }
            for (d = Math.floor(k.length / 5), e = parseInt(k.charAt(d) + k.charAt(2 * d) + k.charAt(3 * d) + k.charAt(4 * d) + k.charAt(5 * d)),
                     f = Math.round(b.length / 2), g = Math.pow(2, 31) - 1, h = parseInt(a.substring(a.length - 8, a.length), 16),
                     a = a.substring(0, a.length - 8), k += h; k.length > 10; ) {
                k = (parseInt(k.substring(0, 10)) + parseInt(k.substring(10, k.length))).toString();
            }
            for (k = (e * k + f) % g, i = "", j = "", c = 0; c < a.length; c += 2) {
                i = parseInt(parseInt(a.substring(c, c + 2), 16) ^ Math.floor(255 * (k / g))), j += String.fromCharCode(i),
                    k = (e * k + f) % g;
            }
            return j;
        }, this.O0000OO0OO00O = function (a, b, c) {
            return a.length >= 0 ? a.substr(b, c) : null;
        }, this.O0O000000O0O0 = function (a) {
            return a.length;
        }, this.O000O0OO0O0OO = function (a,b) {           
            var h, i, j, k, l, m, n, o, p, c = b, d = this.O0O000000O0O0(c), e = d, f = new Array(), g = new Array();
            for (l = 1; d >= l; l++) {
                f[l] = this.O0000OO0OO00O(c, l - 1, 1).charCodeAt(0), g[e] = f[l], e -= 1;
            }
            for (h = "", i = a, m = this.OO0O00OO00OO(i, 2), i = this.OO00OO0O00O0(i, this.O0O000000O0O0(i) - 2),
                     l = 0; l < this.O0O000000O0O0(i); l += 4) {
                j = this.O0000OO0OO00O(i, l, 4), "" != j && (b = this.OO0O00OO00OO(j, 1), k = (parseInt(this.OO00OO0O00O0(j, 3)) - 100) / 3,
                    m == this.O0000OO0OO00O0("a9ab044c634a", "O0000OO0OO00O") ? (n = 2 * parseInt(b.charCodeAt(0)),
                        o = parseInt(f[k]), p = n - o, h += String.fromCharCode(p)) : (n = 2 * parseInt(b.charCodeAt(0)),
                        o = parseInt(g[k]), p = n - o, h += String.fromCharCode(p)));
            }
            return h;
        };
    }
    var x=new DeCode();
    playurl=x.O000O0OO0O0OO('e0>187Q190q193k196Q202N208?214m220W223_226M229o232I235j238[250k2591262J268R271C277:280>283D292A295?298I3012304C31053193325A3281331K3379343C346K355k358<361D373M379[382M385S388M394:397;400P406<4092412q421;448g4574463I466v469]472n475D478K484A490B499o502R5055523J526M532O535H538=541H547A556V559O571N574B57755835586Z595l601X610l613','3DVyqLyrEBCoQP9eNuqpyUEX42V4MsncH289YPId8H6tdqINVGJhi3P1sLWBLSiVQOa4LWOS8W4Q0Ha7BY7M4pDIyeX98PktWhCDvkH6JvuHpnT4fhXC6jY50SwJhKi2LKzNOypTh4th7aKdmZGbYGyJwlvnicKz1DGyF0sbF9eZknPKsHOSzBRdiHh5wG79VOi6B5tfsR0sBAMqzYgP2InT8uR08mz9UXsFGK6qNn8Ult1EOXZFGsBwj58G2NcPgxfKxWXgYMcEcx6uhlOrJ25RrPyPK7svsh8pqQWdXjvl6GVG4ZZjYq8XeDfTRJXCfJvAtKSocvxr5sNJePq6IivoX2Pe0xU47CSipsqUL9AjCwJTqkfweSjiFIzf4mT1pCJgDw9S6omu0udx3rN8kXv46IKWGrS0spAXN2mf3qpwcHDUO8bFojPlHkwtEH8iMeRhISsA4DtKsrWUPdBuCAAd0sNI3ICH4fQ0xvkBdNXE27FSyuTpaM3ZajvoH3Z2');


这上面的就是他的加密代码,具体是干了些啥,反正我也不需要理解,主要是理解不了,但不影响我们
我们只知道他的加密入口及解密参数就行了

[JavaScript] 纯文本查看 复制代码
var x=new DeCode();
playurl=x.O000O0OO0O0OO(参数1,参数2)


先请求页面获取参数1,参数2,然后得到在带上参数请求m3u8视频流列表,知道参数怎么来的就好办了

2、python3.9获取参数
需要加载几个模块
import asyncio  //这个协助
import aiohttp   //这个是下载
import os   
import requests  
import re
import execjs  //这个是执行JS的


[JavaScript] 纯文本查看 复制代码
function DeCode() {
this.OO0O00OO00OO = function(a, b) {
    return b > 0 ? a.substring(0, b) : null;
},
this.OO00OO0O00O0 = function(a, b) {
    return a.length - b >= 0 && a.length >= 0 && a.length - b <= a.length ? a.substring(a.length - b, a.length) : null;
},
this.O0000OO0OO00O0 = function(a, b) {
    var c, d, e, f, g, h, i, j, k = "";
    for (c = 0; c < b.length; c++) {
        k += b.charCodeAt(c).toString();
    }
    for (d = Math.floor(k.length / 5), e = parseInt(k.charAt(d) + k.charAt(2 * d) + k.charAt(3 * d) + k.charAt(4 * d) + k.charAt(5 * d)), f = Math.round(b.length / 2), g = Math.pow(2, 31) - 1, h = parseInt(a.substring(a.length - 8, a.length), 16), a = a.substring(0, a.length - 8), k += h; k.length > 10;) {
        k = (parseInt(k.substring(0, 10)) + parseInt(k.substring(10, k.length))).toString();
    }
    for (k = (e * k + f) % g, i = "", j = "", c = 0; c < a.length; c += 2) {
        i = parseInt(parseInt(a.substring(c, c + 2), 16) ^ Math.floor(255 * (k / g))),
        j += String.fromCharCode(i),
        k = (e * k + f) % g;
    }
    return j;
},
this.O0000OO0OO00O = function(a, b, c) {
    return a.length >= 0 ? a.substr(b, c) : null;
},
this.O0O000000O0O0 = function(a) {
    return a.length;
},
this.O000O0OO0O0OO = function(a, b) {
    var h, i, j, k, l, m, n, o, p, c = b,
    d = this.O0O000000O0O0(c),
    e = d,
    f = new Array(),
    g = new Array();
    for (l = 1; d >= l; l++) {
        f[l] = this.O0000OO0OO00O(c, l - 1, 1).charCodeAt(0),
        g[e] = f[l],
        e -= 1;
    }
    for (h = "", i = a, m = this.OO0O00OO00OO(i, 2), i = this.OO00OO0O00O0(i, this.O0O000000O0O0(i) - 2), l = 0; l < this.O0O000000O0O0(i); l += 4) {
        j = this.O0000OO0OO00O(i, l, 4),
        "" != j && (b = this.OO0O00OO00OO(j, 1), k = (parseInt(this.OO00OO0O00O0(j, 3)) - 100) / 3, m == this.O0000OO0OO00O0("a9ab044c634a", "O0000OO0OO00O") ? (n = 2 * parseInt(b.charCodeAt(0)), o = parseInt(f[k]), p = n - o, h += String.fromCharCode(p)) : (n = 2 * parseInt(b.charCodeAt(0)), o = parseInt(g[k]), p = n - o, h += String.fromCharCode(p)));
    }
    return h;
};
}
function playurl(pj, pj1) {
var x = new DeCode();
playurl = x.O000O0OO0O0OO(pj, pj1);
return playurl;
}


python01.jpg

哈哈哈,可以得到我们想要的参数,请求时候记得一定要带上 headers
带上参数请求m3u8视频流列表信息
[Python] 纯文本查看 复制代码
def htmlm3u8list(htmls, headers):
    # 创建一个node对象
    node = execjs.get()
    # js源文件编译
    ctx = node.compile(open('./1-01.js', encoding='utf-8').read())
    # 执行JS涵数
    funcname = 'playurl("{0}","{1}")'.format(htmls[0], htmls[1])
    pwd = 'https:' + ctx.eval(funcname)
    tsurl = pwd.split(".m3u8")[0]
    numbeid = tsurl.split('/')[-1]
    data = requests.get(url=pwd, headers=headers).text
    name = numbeid + "-" + htmls[2].replace("(", "").replace(")", "")
    print(name)
    isExists = os.path.exists(name)
    if not isExists:
        os.makedirs(name)
    tslist = re.findall(r'-\d+.ts\?upt=[a-zA-Z0-9]+', data)
    urllist = []
    for ts in tslist:
        sss = tsurl + ts
        urllist.append(sss)
    urllists = [urllist, [name]]
    return urllists



到了这里就完成了兄弟前面的效果,但是我想把这个在加深一些,下载
下载有个问题就是,因为一个音频文件他会分成几百个流文件,如果单线程下载的话,会比较慢,然后我就用协程的方法这样快一些
python02.jpg


[Python] 纯文本查看 复制代码
async def downs(hj):
    async with aiohttp.ClientSession() as session:
        url_list = hj
        name = url_list[1][0]
        print(url_list)
        print(name)
        tasks = [asyncio.create_task(fetch(session, urls, name)) for urls in url_list[0]]
        await asyncio.wait(tasks)


async def fetch(session, urls, name):
    async with session.get(urls, verify_ssl=False) as response:
        content = await response.content.read()
        tslist = re.findall(r'-\d+.ts\?upt=[a-zA-Z0-9]+', urls)
        for ts in tslist:
            filename = ts.replace("-", "").split("?")[0]
            print(filename)
        path = './' + name + './' + filename
        with open(path, "wb") as f:
            f.write(content)


下载的时候把ID号和文件名建一个文件夹这样方便管理
例如:221250 + 四会DJ清扬-国粤语Club抖音DjHs华少秋风吹飘来好消息串烧


好,现在流文件下载下来了,就是解决文件合并和转MP3格式了


看到一个兄弟在说在线的视频流文件很小,音质达不到要求,我们把这个问题一起解决了
音质.jpg 音质1.jpg

网站显示的是 147.2MB   而我们下载下来的只有32.4MB,这个问题只要我们设置一下转换值就可以了
然后就是等几分钟转换好了


01.jpg 02.jpg

格式工厂比特率选择320,然后我们看一下转换后的文件是否与网站一致

03.jpg

一毛一样

这个是全代码
清风DJ.zip (2.13 KB, 下载次数: 472)



https://tspc.vvvdj.com/c1/2021/10/221250-bf40bf/221250.m3u8?upt=d75e43361637855999&news"
https://tspc.vvvdj.com/c1/2021/10/221250-bf40bf/221250.m3u8?upt=d75e43361637855999&news

免费评分

参与人数 35威望 +1 吾爱币 +55 热心值 +31 收起 理由
明天十九 + 1 + 1 谢谢@Thanks!
苏州 + 1 + 1 谢谢@Thanks!
lwq114 + 1 + 1 热心回复!
Flipped123 + 1 热心回复!
zyw52 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yang586lin + 1 + 1 楼主 有空搞搞https://www.tingxiaoshuo.cc这个网站吗?
pdc9911 + 1 + 1 谢谢@Thanks!
guoruihotel + 1 + 1 谢谢@Thanks!
抱歉、 + 1 用心讨论,共获提升!
lfm333 + 1 + 1 谢谢@Thanks!
ehepls + 2 + 1 我很赞同!
yan182 + 1 + 1 谢谢@Thanks!
sting0626 + 1 + 1 谢谢分享!
fazl + 1 + 1 热心回复!
赤火丿银狼 + 1 + 1 谢谢@Thanks!
晚风以晚 + 1 我很赞同!
YYL7535 + 1 + 1 谢谢@Thanks!
情受哥哥 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
quexinyan + 1 + 1 热心回复!
Rezalt + 1 我很赞同!
ordinarysoul + 1 + 1 我很赞同!
田馥甄 + 1 + 1 谢谢@Thanks!
灵魂歌手 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
darklure + 1 + 1 热心回复!
luoxuan + 1 + 1 谢谢@Thanks!
myqqq + 2 + 1 64k音质转320K音质是不一样的
chun418 + 1 + 1 热心回复!
Coolman + 1 + 1 用心讨论,共获提升!
pj2016 + 1 谢谢@Thanks!
windows12 + 1 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
longling + 1 + 1 用心讨论,共获提升!
cxp521 + 1 + 1 谢谢@Thanks!
igood + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Yo丨Se7ven 发表于 2021-10-26 21:04
一个idm批量嗅探就解决了,JS解析出来的只是128k低音质的。
 楼主| paxj168 发表于 2021-10-27 08:35
本帖最后由 paxj168 于 2021-10-27 08:44 编辑
yang586lin 发表于 2021-10-26 21:20
大神,请问https://m.i275.com/可以做个批量下载的工具出来吗?

我们只讨论技术,不做工具

https://audiopay.cos.tx.xmcdn.com/download/1.0.0/group3/M04/BF/F5/wKgMdl4xIwnADzZaADCdnSpb3VE778.m4a?buy_key=aed65595bbd6d943057c57973f8b5b93&sign=4783c36c8d75615f8f124930695b2139&timestamp=1635295239206000&token=5360&duration=1800
头像被屏蔽
wuti90 发表于 2021-10-27 08:19
igood 发表于 2021-10-26 20:51
优秀,非常不错的解析方法
A913830 发表于 2021-10-26 20:58
谢谢分享 thanks
yang586lin 发表于 2021-10-26 21:20
大神,请问https://m.i275.com/可以做个批量下载的工具出来吗?
liuyanqu929 发表于 2021-10-26 21:26
清风DJ网是我一直在用的网站,应该有十几年了。
吾爱有你更美 发表于 2021-10-26 21:38
播放的时候还是本音乐来着某某某网址
SDU123 发表于 2021-10-26 22:01
pycharm 社区版是不支持调用js文件吗?
longling 发表于 2021-10-26 22:08
感谢楼主分享               
aa361328 发表于 2021-10-26 22:16
楼主辛苦了~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-9 20:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表