Closed airdge closed 4 years ago
不确定性太大,除非有人专门维护才会 merge。 其实直接替换成以下 js 就能工作。
+++if (Ee.indexOf("!re &&") == -1) {
+++ var Ee = Ee.replace("re &&", "!re &&");
+++} else {
+++ var Ee = Ee.replace("!re &&", "re &&");
+++}
eval(Ee);
不确定性太大,除非有人专门维护才会 merge。 其实直接替换成以下 js 就能工作。
+++if (Ee.indexOf("!re &&") == -1) { +++ var Ee = Ee.replace("re &&", "!re &&"); +++} else { +++ var Ee = Ee.replace("!re &&", "re &&"); +++} eval(Ee);
請問這個要加在livepy的哪裡才能運作
@airdge 给出的代码就能正常工作,我给出的是极简化版本,容错性非常差。
Thanks very much!
添加eval(a)(b,c,d)判断 因还原形式基本都差不多,故没做进一步判断
# 替换字符串
replaceString = '''
// eval(%(workflow)s);
// let workfolw = %(workflow)s ;
var endEval = '';
var newString = "'" + %(workflow)s + "';";
// 获取还原过的代码
var evalString = eval(newString);
// DOM检测
if (/(\w+)=(window|document)/g.exec(evalString)) {
var execWin = /(\w+)=window/g.exec(evalString);
var execDoc = /(\w+)=document/g.exec(evalString);
window.isWin = execWin ? execWin[1] : '';
document.isDoc = execDoc ? execDoc[1] : '';
}
// 如果还原代码中含有eval自执行 eval(a)(b,c,d)
if (/eval\(\w+\)\(/g.exec(evalString)) {
endEval = 1;
}
// 如果还原代码中还有eval();
else if (/eval\(/g.exec(evalString)) {
var encString=evalString.replace(/eval\(\w+\)/g,'');
eval(encString);
if (/function/g.exec(%(workflow)s) && (%(workflow)s.indexOf(window.isWin) > 0 || %(workflow)s.indexOf(document.isDoc) > 0)) {
var reString = /var (\w+)=/g.exec(%(workflow)s);
reString && (evalString = %(workflow)s.replace(reString[0], reString[0] + "!"));
// 如果还原代码中还包含了混淆代码段
let reEval = /\(function\(\)\{(.*)\}\)\(\)/g.exec(encString);
if (reEval && />>>|<<<|^/g.exec(reEval[1])) {
var xxxxxxxxxxx = function() {
eval(reEval[1]);
var funcString = /var (\w+)=/g.exec(%(workflow)s);
funcString && (evalString = %(workflow)s.replace(reString[0], reString[0] + "!"));
return evalString;
}();
}
}
// 如果还原代码不包含function
else if (/>>>|<<<|^/g.exec(%(workflow)s)) {
endEval = 1;
}
} else {
// 如果还原代码中含有function函数,以及包含DOM,则对function test逻辑取反(a = b -> a = !b)
if (/function/g.exec(evalString) && (evalString.indexOf(window.isWin) > 0 || evalString.indexOf(document.isDoc) > 0)) {
var reString = /var (\w+)=/g.exec(evalString);
reString && (evalString = evalString.replace(reString[0], reString[0] + "!"));
}
}
endEval ? eval(%(workflow)s) : eval(evalString);
'''% {'workflow': workflow}
虽然写了是『临时』,还是问一下,请问你有兴趣持续维护吗?仅单指这种 javascript patch。
斗鱼所有直播都改成这种混淆了,看来不改不行。。。
全部需要DOM了,斗鱼的网页端很是难搞,还经常变
修改 @airdge 提供的代码后解决了原本出现的异常 'document' is not defined 然而又出现了 'window' is not defined 异常
我重写了一个看起来不那么复杂的,以 /;(!?)(\w+ && \(function\()/g
来判断替换反转,并添加了调试代码。
如果有更好的方法,请继续提出来,非常感谢!
我重写了一个看起来不那么复杂的,以
/;(!?)(\w+ && \(function\()/g
来判断替换反转,并添加了调试代码。如果有更好的方法,请继续提出来,非常感谢!
经测试基本完美,可以正常录制 只是偶尔会出现以下讯息 Unexpected identifier after numeric literal 然而还是非常感谢几位大老的协助
再次感谢 @SeaHOH 修正新的程式码 经测试不再出现 Unexpected identifier after numeric literal 讯息 这次是真的完美了
使用的方法就是 @airdge 提供的,只是重写针对的点不同,可以稍微简化逻辑处理。 而这个 bug 也是我使用随机名称才引入的,并不是混淆的结果。
YKDL https://www.douyu.com/288016 https://www.douyu.com/998 https://www.douyu.com/987
1.随意选几个正在直播的直播间,只能录制第一个,其他的都不能。(不知道怎么弄,麻烦指点下,谢谢)
3.不知道能不能监听直播间,以防断流后,自动再次录制。
PS F:\> ykdl https://www.douyu.com/998
site: 斗鱼直播 (DouyuTV)
title: 重播丨15日总决eStar vs RNG - 王者荣耀官方赛事
artist: 王者荣耀官方赛事
streams:
- format: BD10M
container: flv
video-profile: 蓝光10M
# download-with: ykdl --format=BD10M [URL]
Now downloading: 重播丨15日总决eStar vs RNG - 王者荣耀官方赛事_BD10M_2019-06-11T19-09-41.871858.flv
测试正常
1.随意选几个正在直播的直播间,只能录制第一个,其他的都不能。
测试直接播放和录制都正常。
2.偶尔会出现断开(但是手机打开直播间看还在直播的) 3.不知道能不能监听直播间,以防断流后,自动再次录制。
不能。
1.随意选几个正在直播的直播间,只能录制第一个,其他的都不能。
测试直接播放和录制都正常。
2.偶尔会出现断开(但是手机打开直播间看还在直播的) 3.不知道能不能监听直播间,以防断流后,自动再次录制。
不能。
I:\新建文件夹 (4)\ykdl\新建文件夹> YKDL https://www.douyu.com/288016 https://www.douyu.com/998 https://www.douyu.com/987 site: 斗鱼直播 (DouyuTV) title: LPL夏季赛FPXvs RW - 英雄联盟赛事 artist: 英雄联盟赛事 streams:
Now downloading: LPL夏季赛FPXvs RW - 英雄联盟赛事_BD10M_2019-06-11T20-01-46.497040.flv stop downloading by press 'q' Input #0, flv, from 'https://tc-tct.douyucdn2.cn/dyliveflv1a/288016rlols5_1024p.flv?wsAuth=015c97826b518386ceba2d82019ca756&token=web-h5-0-288016-e9416291174176ee3b7ad1c01c0d54b42b75ed5d79e37fa7&logo=0&expire=0&did=224063bc7eed414fb2e5dc62b73459e8&pt=2&st=0&mix=0&isp=': Metadata: audiochannels : 2 2.1 : false 3.1 : false 4.0 : false 4.1 : false 5.1 : false 7.1 : false encoder : Lavf57.0.100 topSpeedMode : 1 cdn_ip : 14.204.139.162 Duration: 00:00:00.00, start: 7455.450000, bitrate: N/A Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 196 kb/s Stream #0:1: Video: h264 (High), yuv420p(progressive), 1920x1080, 15561 kb/s, 62 fps, 59.94 tbr, 1k tbn, 124 tbc Output #0, flv, to 'LPL澶忓璧汧PXvs RW - 鑻遍泟鑱旂洘璧涗簨_BD10M_2019-06-11T20-01-46.497040.flv': Metadata: audiochannels : 2 2.1 : false 3.1 : false 4.0 : false 4.1 : false 5.1 : false 7.1 : false cdn_ip : 14.204.139.162 topSpeedMode : 1 encoder : Lavf58.20.100 Stream #0:0: Video: h264 (High) ([7][0][0][0] / 0x0007), yuv420p(progressive), 1920x1080, q=2-31, 15561 kb/s, 62 fps, 59.94 tbr, 1k tbn, 1k tbc Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, stereo, fltp, 196 kb/s Stream mapping: Stream #0:1 -> #0:0 (copy) Stream #0:0 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 3087 fps= 74 q=-1.0 Lsize= 33219kB time=00:00:51.48 bitrate=5285.7kbits/s speed=1.23x video:32330kB audio:788kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.304725% site: 斗鱼直播 (DouyuTV) title: 重播丨15日总决eStar vs RNG - 王者荣耀官方赛事 artist: 王者荣耀官方赛事 streams:
Now downloading: 重播丨15日总决eStar vs RNG - 王者荣耀官方赛事_BD10M_2019-06-11T20-02-30.248290.flv stop downloading by press 'q' Input #0, flv, from 'https://tc-tct.douyucdn2.cn/dyliveflv1/1863767rkpl_1024p.flv?wsAuth=ee7c5c597cd289c12a8dc0e0072047b3&token=web-h5-0-1863767-7b520f6fe0a2b18dfd8cbc7c0efc8f3725df64cacaf653f0&logo=0&expire=0&did=e433f78a42c64d78a8f5e35096224bda&pt=2&st=0&mix=0&isp=': Metadata: audiodelay : 0 server : SRS/2.0.234(ZhouGuowen) srs_primary : SRS/1.0release srs_authors : winlin,wenjie.zhao server_version : 2.0.234 encoder : Lavf58.27.103 topSpeedMode : 1 cdn_ip : 58.144.154.113 Duration: 00:00:00.00, start: 105489.618000, bitrate: N/A Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 327 kb/s Stream #0:1: Video: h264 (High), yuv420p(progressive), 1920x1080, 3072 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc Output #0, flv, to '閲嶆挱涓?5鏃ユ€诲喅eStar vs RNG - 鐜嬭€呰崳鑰€瀹樻柟璧涗簨_BD10M_2019-06-11T20-02-30.248290.flv': Metadata: audiodelay : 0 server : SRS/2.0.234(ZhouGuowen) srs_primary : SRS/1.0release srs_authors : winlin,wenjie.zhao server_version : 2.0.234 cdn_ip : 58.144.154.113 topSpeedMode : 1 encoder : Lavf58.20.100 Stream #0:0: Video: h264 (High) ([7][0][0][0] / 0x0007), yuv420p(progressive), 1920x1080, q=2-31, 3072 kb/s, 25 fps, 25 tbr, 1k tbn, 1k tbc Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 327 kb/s Stream mapping: Stream #0:1 -> #0:0 (copy) Stream #0:0 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 430 fps= 39 q=-1.0 size= 6656kB time=00:00:17.16 bitrate=3177.5kbits/s speed=1.56x
还是不可以同时录制几个直播间啊,不知道是不是我操作错误,这3个直播间都在直播。
开三个命令行窗口
开三个命令行窗口
是这样的,无法同时播放或录制单个命令,需要分别运行。
ubuntu16.04此时,下载的zip包,对任意房间使用后显示如下错误
Gjs-Message: JS WARNING: [/tmp/execjsze1d78o3.js 5]: variable n redeclares argument
Gjs-Message: JS WARNING: [/tmp/execjsze1d78o3.js 10]: assignment to undeclared variable result
Gjs-Message: JS WARNING: [/tmp/execjsrry1siij.js 6]: variable n redeclares argument
Gjs-Message: JS WARNING: [/tmp/execjsrry1siij.js 11]: assignment to undeclared variable hqznH926
Gjs-Message: JS WARNING: [/tmp/execjsrry1siij.js 12]: "window" is read-only
Gjs-Message: JS WARNING: [/tmp/execjsrry1siij.js 13]: assignment to undeclared variable document
Gjs-Message: JS WARNING: [/tmp/execjsrry1siij.js 10]: assignment to undeclared variable result
Gjs-Message: JS WARNING: [/tmp/execjsu02q3fly.js 6]: variable n redeclares argument
Gjs-Message: JS WARNING: [/tmp/execjsu02q3fly.js 11]: assignment to undeclared variable hqznH926
Gjs-Message: JS WARNING: [/tmp/execjsu02q3fly.js 12]: "window" is read-only
Gjs-Message: JS WARNING: [/tmp/execjsu02q3fly.js 13]: assignment to undeclared variable document
Traceback (most recent call last):
File "/usr/local/bin/ykdl", line 9, in
@TaoziDB Which character should i replace?
only possible illegal character might be ` (back-tick) in js_patch due to limited support of some js engine for template string, in this case, replace all ` (back-tick) with " (double-quote) should work too
I replaced back-tick with " in js_patch and it failed.
ykdl RETURN ykdl.util.jsengine.ProgramError: SyntaxError: unterminated string literal
seems there are too many " to accomplish ''' ''' str's grammar. What should I do?
only 2 `, don't confuse with single quote
it just did not work.
"
不支持换行,删掉换行试试。
@SeaHOH @TaoziDB 谢谢。测试成功 ubuntu16.04
再次简化,只修改 DOM 检测函数。
试了下,似乎很短时间之后就会中断? 更新,测试4m以及以上会断,超清坚挺
三个线路:主线路 ws-h5,备用线路5 tct-h5,备用线路6 ali-h5 只有用备用线路5 tct-h5的时候不会断,其它两个线路过几秒就会断,怀疑流文件格式不标准
关于线路问题,这只和用户网络相关,即使同一线路,不同用户播放效果也会有不同表现。
本项目不会强制选择,如有需要请自行修改源码中的cdn
参数。
@airdge @SeaHOH 天才,神一样的存在,感谢你们的commit
@SeaHOH
ROOMID: 7020364 报错 kinako鏌効 鐨勭洿鎾棿 - kinako鏌効_BD4M_2020-03-13T00-16-51.395533.flv: Invalid argument
douyu.com/g_yz (随便选一个手机播的,2人正在PK的,竖屏的都是手机播的)
只要是用手机播的,2人PK的话,只能下载到一个人的画面。(电脑播的没有这个问题)
遇到2人PK,它会刷新一个新的视频源(2人PK的画面),原始源降码率且一直有效(但是一直是一个人画面)。 PK结束后这个视频源自动失效。
之前的太过麻烦
函数通过获取
oog['test'](obj)
真假来给v赋值 所以只要强行将oog['test'](obj)
返回true就行了========================================================================
========================================================================
========================================================================
大概流程就是通过匹配 eval(encrypt)的encrypt 通过
来获取还原代码decrypt 再通过decrypt代码分析斗鱼js所要执行的情况,做进一步的替换处理和还原
不是每次都能使用,现在并没有完全解决问题 现只遇到三种形式,只对其中两种情况作了处理,还有一种情况相对麻烦 因homeH5Enc返回的数据不是每次都相同,刷新几次或者等几分钟应该能解析 先做临时使用,另外的有时间再分析
不影响原有的py代码,只在解析不到ub98484234时候运行 但必须给所有的房间都添加DOM对象,这个不影响正常房间的解析
douyu/live.py