|
|
很多影视聚合站都在 m3u8 里面直接加入广告,并且切片 url 都用 md5 混淆,想通过特征来去除基本上不太可能了,于是找了个无广告的视频站,试着直接抓一下播放链接。
首先打开站点 https://www.keke1.app/
f12 无效,通过浏览器菜单打开开发者工具
开启了防 debugger

点击确定,重新加载,在弹窗重新打开时不要点确定,查看接口请求,发现 vf.mgdnka.cn/vod_pc_static_kkdy/frameworks/disable-devtool/latest/index.min.js?ver=ffffeee,直接添加到 Network request blocking,刷新后可以正常 debugger

首先检查一下播放页html,代码很多,那基本上就排除了通过 js 来加载播放链接的逻辑,大概率是在 html 页里面,翻一下代码,看到有个显眼的 gogogo 函数:
- ...
- const parameterName = "role";
- const paramValue = getURLParameter(window.location.search, parameterName);
- if (paramValue !== null && md5(paramValue) == 'b18c4beb8b0b9077b37af22a01324c23') {
- gogogo()
- } else {
- fetchWithTimeout(window.whatTMDwhatTMDApiDomain + '/app/userArea', 5000)
- .then(async data => {
- if (data.country == 'China' && data.countryCode == 'CN') {
- gogogo()
- } else {
- OFFICIALPOPUP.show(await getAlertDLPopupConfiguration("安装APP,免费观看4K超清影片", "对不起,您所在的地区可以使用APP观看。"));
- }
- })
- .catch(error => {
- console.error('Error occurred:', error);
- gogogo()
- OFFICIALPOPUP.hide();
- });
- }
- let clickTimer = null;
- ...
复制代码
找到 gogogo 函数,发现做了混淆,丢个 chatgpt 看看,不得不说有了 AI 之后这个效率杠杠的
- gogogo() {
- var _0xee81bd=(711499^711490)+(862694^862691);const playSource={'\u0073\u0072\u0063':"\u0068\u0074\u0074\u0070\u0073\u003A\u002F\u002F\u0073\u0076\u0069\u0070\u0073\u0076\u0069\u0070\u002E\u0066\u0066\u007A\u0079\u0072\u0065\u0061\u0064\u0031\u002E\u0063\u006F\u006D\u002F\u0032\u0030\u0032\u0035\u0030\u0031\u0032\u0033\u002F\u0033\u0035\u0033\u0030\u0034\u005F\u0036\u0032\u0034\u0034\u0032\u0061\u0061\u0061\u002F\u0069\u006E\u0064\u0065\u0078\u002E\u006D\u0033\u0075\u0038",'\u0074\u0079\u0070\u0065':"\u0061\u0070\u0070\u006C\u0069\u0063\u0061\u0074\u0069\u006F\u006E\u002F\u0078\u002D\u006D\u0070\u0065\u0067\u0055\u0052\u004C"};_0xee81bd=(795600^795609)+(424590^424591);let _0x8b5gb;const config={"lang":'zh',"id":"\u006D\u0079\u002D\u0076\u0069\u0064\u0065\u006F",'\u0061\u0075\u0074\u006F\u0070\u006C\u0061\u0079':!![],'\u0075\u0072\u006C':KKYS['\u0073\u0061\u0066\u0065\u0050\u006C\u0061\u0079']()['\u0075\u0072\u006C']("\u0049\u0073\u0075\u0037\u0066\u004F\u0041\u0076\u0049\u0036\u0021\u0026\u0049\u004B\u0070\u0041\u0062\u0056\u0064\u0068\u0066\u0026\u005E\u0046"),"playsinline":!![],'\u0070\u0069\u0070':!![],"keyShortcut":'on','\u0068\u0065\u0069\u0067\u0068\u0074':"\u0031\u0030\u0030\u0025",'\u0077\u0069\u0064\u0074\u0068':"\u0031\u0030\u0030\u0025","plugins":[],'x5-video-player-type':'h5',"\u0078\u0035\u002D\u0076\u0069\u0064\u0065\u006F\u002D\u0070\u006C\u0061\u0079\u0065\u0072\u002D\u0066\u0075\u006C\u006C\u0073\u0063\u0072\u0065\u0065\u006E":!![],"\u0078\u0035\u002D\u0076\u0069\u0064\u0065\u006F\u002D\u006F\u0072\u0069\u0065\u006E\u0074\u0061\u0074\u0069\u006F\u006E":"\u006C\u0061\u006E\u0064\u0073\u0063\u0061\u0070\u0065",'\u0063\u006F\u006D\u006D\u006F\u006E\u0053\u0074\u0079\u006C\u0065':{"playedColor":'var(--fs-primary-color)','\u0076\u006F\u006C\u0075\u006D\u0065\u0043\u006F\u006C\u006F\u0072':'var(--fs-primary-color)'},"playbackRate":{'\u006C\u0069\u0073\u0074':[{"text":"\u0032\u002E\u0030\u0058",'\u0072\u0061\u0074\u0065':2.0},{"text":"\u0031\u002E\u0035\u0058",'\u0072\u0061\u0074\u0065':1.5},{"text":"\u0031\u002E\u0032\u0035\u0058",'\u0072\u0061\u0074\u0065':1.25},{"text":'1X',"iconText":'倍速','\u0072\u0061\u0074\u0065':1},{"text":'0.75X','\u0072\u0061\u0074\u0065':0.75},{'\u0074\u0065\u0078\u0074':"\u0030\u002E\u0035\u0058",'\u0072\u0061\u0074\u0065':0.5}]}};_0x8b5gb='\u0068\u006C\u0062\u0068\u0068\u0069';if(playSource['\u0074\u0079\u0070\u0065']=="\u0061\u0070\u0070\u006C\u0069\u0063\u0061\u0074\u0069\u006F\u006E\u002F\u0078\u002D\u006D\u0070\u0065\u0067\u0055\u0052\u004C"&&HlsPlayer['\u0069\u0073\u0053\u0075\u0070\u0070\u006F\u0072\u0074\u0065\u0064']()){config['\u0070\u006C\u0075\u0067\u0069\u006E\u0073']['\u0070\u0075\u0073\u0068'](window['\u0048\u006C\u0073\u0050\u006C\u0061\u0079\u0065\u0072']);config['\u0068\u006C\u0073']={"retryCount":30,'\u0072\u0065\u0074\u0072\u0079\u0044\u0065\u006C\u0061\u0079':1000,'\u006C\u006F\u0061\u0064\u0054\u0069\u006D\u0065\u006F\u0075\u0074':10000,"fetchOptions":{"mode":"\u0063\u006F\u0072\u0073","headers":{'\u004F\u0072\u0069\u0067\u0069\u006E':''},'\u0072\u0065\u0066\u0065\u0072\u0072\u0065\u0072':"\u006E\u006F\u002D\u0072\u0065\u0066\u0065\u0072\u0072\u0065\u0072"}};}else if(playSource['\u0074\u0079\u0070\u0065']=="\u0076\u0069\u0064\u0065\u006F\u002F\u006D\u0070\u0034"){config['\u0070\u006C\u0075\u0067\u0069\u006E\u0073']['\u0070\u0075\u0073\u0068'](window['\u004D\u0070\u0034\u0050\u006C\u0075\u0067\u0069\u006E']);config['\u006D\u0070\u0034\u0070\u006C\u0075\u0067\u0069\u006E']={'\u006D\u0061\u0078\u0042\u0075\u0066\u0066\u0065\u0072\u004C\u0065\u006E\u0067\u0074\u0068':50,'\u006D\u0069\u006E\u0042\u0075\u0066\u0066\u0065\u0072\u004C\u0065\u006E\u0067\u0074\u0068':10};}else{}xgplayer=new window['\u0050\u006C\u0061\u0079\u0065\u0072'](config);var _0x351b1d=(482744^482748)+(448319^448319);const playProgress=window['\u006C\u006F\u0063\u0061\u006C\u0053\u0074\u006F\u0072\u0061\u0067\u0065']['\u0067\u0065\u0074\u0049\u0074\u0065\u006D'](config['\u0075\u0072\u006C']);_0x351b1d='\u0064\u0071\u0064\u0064\u0064\u006E';if(playProgress){xgplayer['\u0063\u0075\u0072\u0072\u0065\u006E\u0074\u0054\u0069\u006D\u0065']=parseFloat(playProgress);}const Events=window['\u0050\u006C\u0061\u0079\u0065\u0072']['\u0045\u0076\u0065\u006E\u0074\u0073'];xgplayer['\u006F\u006E'](Events['\u004C\u004F\u0041\u0044\u005F\u0053\u0054\u0041\u0052\u0054'],onPlayerLoadStartHandler);xgplayer['\u006F\u006E'](Events['\u004C\u004F\u0041\u0044\u0045\u0044\u005F\u0044\u0041\u0054\u0041'],onPlayerLoadedDataHandler);xgplayer['\u006F\u006E'](Events['\u0050\u004C\u0041\u0059'],onPlayerPlayHandler);xgplayer['\u006F\u006E'](Events['\u0050\u0041\u0055\u0053\u0045'],onPlayerPauseHandler);xgplayer['\u006F\u006E'](Events['\u0045\u004E\u0044\u0045\u0044'],onPlayerEndedHandler);xgplayer['\u006F\u006E'](Events['\u0045\u0052\u0052\u004F\u0052'],onPlayerErrorHandler);xgplayer['\u006F\u006E'](Events['\u0054\u0049\u004D\u0045\u005F\u0055\u0050\u0044\u0041\u0054\u0045'],onPlayerTimeUpdateHandler);xgplayer['\u006F\u006E'](Events['\u0057\u0041\u0049\u0054\u0049\u004E\u0047'],onPlayerWaitingHandler);xgplayer['\u006F\u006E'](Events['\u0053\u0045\u0045\u004B\u0049\u004E\u0047'],onPlayerSeekingHandler);xgplayer['\u006F\u006E'](Events['\u0053\u0045\u0045\u004B\u0045\u0044'],onPlayerSeekedHandler);updatePlayBoxSize();
- }
- // 转换后
- function gogogo() {
- var _0xee81bd = (711499 ^ 711490) + (862694 ^ 862691);
- const playSource = {
- src: "https://svipsvip.ffzyread1.com/20250123/35304_62442aaa/index.m3u8",
- type: "application/x-mpegURL"
- };
- _0xee81bd = (795600 ^ 795609) + (424590 ^ 424591);
- let _0x8b5gb;
- const config = {
- lang: 'zh',
- id: "my-video",
- autoplay: true,
- url: KKYS.safePlay().url("Isu7fOAvI6!&IKpAbVdhf&^F"),
- playsinline: true,
- pip: true,
- keyShortcut: 'on',
- height: "100%",
- width: "100%",
- plugins: [],
- 'x5-video-player-type': 'h5',
- 'x5-video-player-fullscreen': true,
- 'x5-video-orientation': "landscape",
- commonStyle: {
- playedColor: 'var(--fs-primary-color)',
- volumeColor: 'var(--fs-primary-color)'
- },
- playbackRate: {
- list: [
- { text: "2.0X", rate: 2.0 },
- { text: "1.5X", rate: 1.5 },
- { text: "1.25X", rate: 1.25 },
- { text: "1X", iconText: '倍速', rate: 1 },
- { text: '0.75X', rate: 0.75 },
- { text: "0.5X", rate: 0.5 }
- ]
- }
- };
- _0x8b5gb = 'hlbhhi';
- if (playSource.type === "application/x-mpegURL" && HlsPlayer.isSupported()) {
- config.plugins.push(window.HlsPlayer);
- config.hls = {
- retryCount: 30,
- retryDelay: 1000,
- loadTimeout: 10000,
- fetchOptions: {
- mode: "cors",
- headers: { Origin: '' },
- referrer: "no-referrer"
- }
- };
- } else if (playSource.type === "video/mp4") {
- config.plugins.push(window.Mp4Plugin);
- config.mp4plugin = {
- maxBufferLength: 50,
- minBufferLength: 10
- };
- }
- const xgplayer = new window.Player(config);
- var _0x351b1d = (482744 ^ 482748) + (448319 ^ 448319);
- const playProgress = window.localStorage.getItem(config.url);
- _0x351b1d = 'qdddn';
- if (playProgress) {
- xgplayer.currentTime = parseFloat(playProgress);
- }
- const Events = window.Player.Events;
- xgplayer.on(Events.LOAD_START, onPlayerLoadStartHandler);
- xgplayer.on(Events.LOADED_DATA, onPlayerLoadedDataHandler);
- xgplayer.on(Events.PLAY, onPlayerPlayHandler);
- xgplayer.on(Events.PAUSE, onPlayerPauseHandler);
- xgplayer.on(Events.ENDED, onPlayerEndedHandler);
- xgplayer.on(Events.ERROR, onPlayerErrorHandler);
- xgplayer.on(Events.TIME_UPDATE, onPlayerTimeUpdateHandler);
- xgplayer.on(Events.WAITING, onPlayerWaitingHandler);
- xgplayer.on(Events.SEEKING, onPlayerSeekingHandler);
- xgplayer.on(Events.SEEKED, onPlayerSeekedHandler);
- updatePlayBoxSize();
- }
复制代码
KKYS.safePlay().url(“Isu7fOAvI6!&IKpAbVdhf&^F”) 这一行就是获取实际代码的位置,打个断点,找到源码,丢给 chatgpt,让他写个解析的函数来:
- 'url': function(_0x568646=_0x3e87b3) {
- function _0x2c39a9(_0x4a7539, _0x34f7c7, _0x1a2124, _0x3e7506) {
- return _0x391b7f(_0x4a7539 - -0x31, _0x34f7c7 - 0x188, _0x34f7c7, _0x3e7506 - 0xe9);
- }
- function _0xa69db3(_0x2bed71, _0x19d5be, _0x4387b3, _0x163261) {
- return _0x18be3a(_0x2bed71 - 0x68, _0x19d5be - 0x79, _0x4387b3 - -0x187, _0x19d5be);
- }
- if (_0x19b3dd[_0x2c39a9(-0x1ca, -0x218, -0x199, -0x225)] !== _0x19b3dd[_0xa69db3(-0x117, 0x4e, -0x7e, 0x2e)])
- try {
- var _0x527427 = CryptoJS[_0xa69db3(-0x188, -0xb6, -0xf5, -0x96)][_0x2c39a9(-0x167, -0x118, -0x117, -0x13e)]['parse'](_0x568646);
- let _0x264b22 = window[_0x2c39a9(-0x178, -0x11e, -0x148, -0xea) + _0xa69db3(-0xe8, -0x13f, -0xe3, -0x82)];
- var _0x33e517 = CryptoJS[_0x2c39a9(-0x1e3, -0x229, -0x12c, -0x297)]['Base64'][_0x2c39a9(-0xcf, -0xb2, -0x31, -0x150)](_0x264b22);
- const _0x240c87 = {};
- _0x240c87[_0xa69db3(-0xf4, -0xa8, -0x7f, -0x8a)] = _0x33e517;
- var _0x358b25 = CryptoJS[_0xa69db3(-0x14, -0xb2, -0x4d, 0x5c)][_0x2c39a9(-0xc1, -0x11, -0x11e, -0x1b)](_0x240c87, _0x527427, {
- 'mode': CryptoJS[_0xa69db3(0x33, -0xa7, -0x30, 0x24)][_0x2c39a9(-0x8b, -0x6c, 0x2e, -0xd8)],
- 'padding': CryptoJS['pad'][_0xa69db3(-0x11b, -0xce, -0xbe, -0xe5)]
- })
- , _0x4f3e21 = _0x358b25[_0x2c39a9(-0xa5, 0x22, -0xbf, -0x88)](CryptoJS[_0x2c39a9(-0x1e3, -0x11f, -0x157, -0x204)][_0x2c39a9(-0x167, -0xcc, -0x146, -0x1f9)]);
- return _0x4f3e21;
- } catch (_0x38162c) {
- return _0x2c39a9(-0x13f, -0x71, -0x17e, -0xc2);
- }
- else {
- const _0xffa502 = _0x10f4b1['apply'](_0x5324aa, arguments);
- return _0x2f1b95 = null,
- _0xffa502;
- }
- }
- function getUrl(secret = 'Isu7fOAvI6!&IKpAbVdhf&^F', key = 's9Wqfwm5nA1uGOqZZ1k6NdRIXtRQHPs3qQLkAGEx5/kD+ggNX1NPf8o1jI9HpV8s4h9pt7JnJRADFmhc+uKtuKxaiT6gC9OlJHDd2nyNwgzkN/+FlGw/F7X2/gicqjf20vWUoeORf6DEXkF/AXxGPeXm6E3yuiJkBUSmZWKNKqtXrSn7E+DHvs9k6rrnlJmOAF52z2/C2axzbhhfXQd9ghfPEjCs8JOh4kvoQ4ThFTk=') {
- const secretData = CryptoJS.enc.Utf8.parse(secret);
- const keyData = CryptoJS.enc.Base64.parse(key);
- const payload = {
- ciphertext: keyData,
- }
- const data = CryptoJS.AES.decrypt(payload, secretData, {
- mode: CryptoJS.mode.ECB,
- padding: CryptoJS.pad.Pkcs7
- });
- return data.toString(CryptoJS.enc.Utf8)
- }
复制代码
secret 值来源于 gogogo 里面的调用参数,而 key 的值来源于 window.whatTMDwhatTMDPPPP
|
|