您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
当前为
// ==UserScript== // @name 云端课堂回放下载 // @license MIT // @namespace http://tampermonkey.net/ // @version 0.2 // @description try to take over the world! // @author You // @match https://e62580258.at.baijiayun.com/web/playback/index?* // @icon https://www.google.com/s2/favicons?sz=64&domain=baijiayun.com // @grant none // @require https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js // ==/UserScript== var i = function (e, t) { var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var n = r.indexOf(e.charAt(t)); if (-1 === n) throw "Cannot decode base64"; return n }; // 解密视频地址 var decryptVideo = function(e) { if ("" === e || 0 !== e.indexOf("bjcloudvod://")) return ""; var t = (e = e.slice("bjcloudvod://".length, e.length).replace(/-/g, "+").replace(/_/g, "/")).length % 4; 2 === t ? e += "==" : 3 === t && (e += "="); var n = (e = bb(e)).charCodeAt(0) % 8; e = e.slice(1, e.length); for (var i, a = [], s = 0; i = e[s]; s++) { var o = s % 4 * n + s % 3 + 1; a.push(String.fromCharCode(i.charCodeAt(0) - o)) } return a.join("").replace("https:", "").replace("http:", "") }; // 解密编码 var bb = function (e) { var t, n, r = 0, a = e.length, s = []; if (e = String(e), 0 === a) return e; if (a % 4 != 0) throw "Cannot decode base64"; for ("=" === e.charAt(a - 1) && (r = 1, "=" === e.charAt(a - 2) && (r = 2), a -= 4), t = 0; t < a; t += 4) n = i(e, t) << 18 | i(e, t + 1) << 12 | i(e, t + 2) << 6 | i(e, t + 3), s.push( String.fromCharCode(n >> 16, n >> 8 & 255, 255 & n)); switch (r) { case 1: n = i(e, t) << 18 | i(e, t + 1) << 12 | i(e, t + 2) << 6, s.push(String.fromCharCode( n >> 16, n >> 8 & 255)); break; case 2: n = i(e, t) << 18 | i(e, t + 1) << 12, s.push(String.fromCharCode(n >> 16)) } return s.join("") }; // 下载服务器的MP4文件 function downloadMp4(filePath,fileName){ fetch(filePath).then(res => res.blob()).then(blob => { const a = document.createElement('a'); //document.body.appendChild(a) a.style.display = 'none' // 使用获取到的blob对象创建的url const url = window.URL.createObjectURL(blob); a.href = url; // 指定下载的文件名 a.download = fileName; a.click(); document.body.removeChild(a) // 移除blob对象的url window.URL.revokeObjectURL(url); }); } (function() { console.log("云端课堂脚本下载开始"); // 视频信息 var videoInfo = null; /** * 云端课堂回放视频下载 */ function baijiayunVideoXhrHandler(e){ // 不符合url || 响应数据如果不为空 var flag = e.srcElement.responseURL.indexOf("/web/playback/getPlayInfo")==-1 || videoInfo!=null; if(flag){ return false; } console.log(e); // 响应数据 var responseBody = e.currentTarget.response; responseBody = responseBody.substring(responseBody.indexOf("(")+1,responseBody.lastIndexOf(")")); // 处理为json结构 responseBody = JSON.parse(responseBody); videoInfo = responseBody console.log(responseBody); // 默认获取画质最高的 var videoUrl = responseBody.data.play_info['superHD'] || responseBody.data.play_info['high'] || responseBody.data.play_info['720p']; videoUrl = videoUrl.cdn_list[0].enc_url; console.log(videoUrl); videoUrl = "http:" + decryptVideo(videoUrl); console.log('视频地址解析后:'+videoUrl); // 视频名称 var fileName = `${responseBody.data.video_info.title}.${responseBody.data.format}`; downloadMp4(videoUrl,fileName); // 触发下载后返回上一页 history.back(); } (function() { const originalOpen = XMLHttpRequest.prototype.open; console.log("添加xhr拦截器"); XMLHttpRequest.prototype.open = function() { this.addEventListener('readystatechange', (e) => { baijiayunVideoXhrHandler(e); }); originalOpen.apply(this, arguments); }; })(); })();