// ==UserScript== // @name 通用视频会员 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 视频解析:爱优腾、B站、芒果TV、搜狐、乐视、1905、PPTV // @author 那年那tu那些事 // @include *://*.iqiyi.com/* // @include *://*.iq.com/* // @include *://*.youku.com/* // @include *://*v.qq.com/* // @include *://*.bilibili.com/* // @include *://*.acfun.cn/* // @include *://*.mgtv.com/* // @include *://*tv.sohu.com/* // @include *://*.le.com/* // @include *://*.1905.com/* // @include *://*.pptv.com/* // @license MIT // @downloadURL none // ==/UserScript== (function() { var clickOrLongPressFn = function(target, clickEvent, longPressEvent) { var Event0, Event1, Timer; if (check.ua() === "mobile") { Event0 = "touchstart"; Event1 = "touchend"; } else { Event0 = "mousedown"; Event1 = "mouseup"; } var flag = null; target.addEventListener(Event0, function() { flag = false; setTimeout(function() { if (flag) { flag = null; clickEvent(); } else { flag = null; longPressEvent(); } }, 300); }); target.addEventListener(Event1, function() { if (flag !== null) { flag = true; } }); } var set = { data: { "box-top": "100px", "box-right": "2px", "main-height": "30px", "main-width": "50px", "main-border-radius": "20px", "menu-height": "310px", "menu-width": "120px", "menu-border-radius": "20px", "item-font-size": "18px", "item-color": "white", "background": "rgb(217, 6, 9)" }, backupData: {}, init: function() { this.backupData = this.data; var localData = JSON.parse(localStorage.getItem("vipParseSettingsData")); if (localData) { var newData = { ...this.data, ...localData }; this.data = newData; } }, get: function(key) { return this.data[key]; }, edit: function(key, value) { this.data[key] = value; }, store: function() { localStorage.setItem("vipParseSettingsData", JSON.stringify(this.data)); }, save: function() { var setPage = document.getElementById("vipParseBtnSetting"); var inputBox = setPage.getElementsByTagName("input"); for (let i in inputBox) { this.edit(inputBox[i].name, inputBox[i].value); } }, apply: function() { var flag = false; if (document.getElementById("vipParseBtnMenu").style.display !== "none") { flag = true; } document.getElementById("vipParseBtnBox").remove(); btn.create(); if (flag) { btn.clickMain(); } }, revert: function() { var setPage = document.getElementById("vipParseBtnSetting"); var inputBox = setPage.getElementsByTagName("input"); for (let i in inputBox) { inputBox[i].value = this.backupData[inputBox[i].name]; } }, create: function() { var setting = document.createElement("div"); var wid = 400; var hei = 260; var screenW = document.documentElement.clientWidth; var screenH = document.documentElement.clientHeight; var settingH = (screenH - hei) / 2; var settingW = (screenW - wid) / 2; setting.style = "display:none;width:" + wid + "px;height:" + hei + "px;overflow:hidden;position:absolute;top:" + settingH + "px;right:" + settingW + "px;border-radius:15px;padding:20px;background:" + this.get("background") + ";color:white;font-size:12px;overflow-y:auto;z-index: 99999;"; setting.id = "vipParseBtnSetting"; setting.appendChild(this.createHead()); setting.appendChild(this.createBody()); setting.appendChild(this.createFoot()); document.body.insertBefore(setting, document.body.firstChild); }, createHead: function() { var head = document.createElement("div"); head.style = "width:100%;height:30px;font-size:20px;text-align:center;margin-bottom:20px;"; head.innerText = "脚本相关设置(仅对"+check.site("name")+"生效)"; return head; }, createBody: function() { var body = document.createElement("div"); body.style = "width:115%;height:calc(100% - 60px);overflow: hidden scroll;" var setMenu = [{ "name": "按钮距离顶部", "key": "box-top" }, { "name": "按钮距离右侧", "key": "box-right" }, { "name": "按钮高度", "key": "main-height" }, { "name": "按钮宽度", "key": "main-width" }, { "name": "按钮圆角", "key": "main-border-radius" }, { "name": "菜单圆角", "key": "menu-border-radius" }, { "name": "菜单高度", "key": "menu-height" }, { "name": "菜单宽度", "key": "menu-width" }, { "name": "菜单字体大小", "key": "item-font-size" }, { "name": "菜单字体颜色", "key": "item-color" }, { "name": "主题背景色调", "key": "background" }]; for (let i in setMenu) { body.appendChild(this.createOpt(setMenu[i])); } return body; }, createFoot: function() { var foot = document.createElement("div"); var revertBtn = this.createBtn("revert"); var saveBtn = this.createBtn("save"); var closeBtn = this.createBtn("close"); foot.style = "width:100%;height:30px;position:absolute;bottom:10px;"; foot.appendChild(revertBtn); foot.appendChild(saveBtn); foot.appendChild(closeBtn); return foot; }, createOpt: function(data) { var optBox = document.createElement("div"); var tittleBox = document.createElement("span"); var textBox = document.createElement("input"); optBox.style = "height:30px;float:left;" tittleBox.innerText = data.name; tittleBox.style = "width:90px;float:left;margin-bottom:8px;"; textBox.name = data.key; textBox.style = "width:90px;float:left;color:black;margin-bottom:8px;margin-right:10px;"; textBox.value = set.get(data.key); optBox.appendChild(tittleBox); optBox.appendChild(textBox); return optBox; }, createBtn: function(name) { var btnBox = document.createElement("span"); var btnObj = document.createElement("div"); var text, func, id; btnObj.style = "margin-right:12px;padding:0 10px;cursor:pointer;border:white thin solid;border-radius:10px;float:left"; if (name === "revert") { text = "恢复默认"; id = "vipParseBtnSetting-" + name + "Btn"; func = function() { set.revert() } } else if (name === "save") { text = "保存并应用"; id = "vipParseBtnSetting-" + name + "Btn"; func = function() { if (confirm("是否确认保存并应用新设置?")) { set.save(); set.store(); set.apply(); document.querySelector("#vipParseBtnSetting-closeBtn").click(); } } } else if (name === "close") { text = "关闭设置"; id = "vipParseBtnSetting-" + name + "Btn"; func = function() { var setting = document.getElementById("vipParseBtnSetting"); setting.style.display = "none"; } } btnObj.innerText = text; btnObj.id = id; btnObj.onclick = func; btnBox.appendChild(btnObj); return btnBox; } }; var check = { list: { 0: { "id": "iqiyi", "name": "爱奇艺", "host": "iqiyi.com|iq.com" }, 1: { "id": "youku", "name": "优酷", "host": "youku.com" }, 2: { "id": "tencentvideo", "name": "腾讯视频", "host": "v.qq.com" }, 3: { "id": "bilibili", "name": "B站", "host": "bilibili.com" }, 4: { "id": "acfun", "name": "A站", "host": "acfun.cn" }, 5: { "id": "mgtv", "name": "芒果TV", "host": "mgtv.com" }, 6: { "id": "sohu", "name": "搜狐视频", "host": "tv.sohu.com" }, 7: { "id": "le", "name": "乐视视频", "host": "le.com" }, 8: { "id": "1905", "name": "1905电影网", "host": "1905.com" }, 9: { "id": "pptv", "name": "PP视频", "host": "pptv.com" } }, ua: function() { var uaStr = "pc"; if (/Android|webOS|HarmonyOS|iPhone|iPod|BlackBerry|mobile/i.test(navigator.userAgent)) { uaStr = "mobile"; } return uaStr; }, site: function(type) { var site = "unknow"; var host = location.hostname; for (let i in this.list) { if (host.match(new RegExp(this.list[i].host))) { site = this.list[i][type]; } } return site; } } var vip = { map: { "iqiyi": { "pc": "flashbox", "mobile": "m-box" }, "youku": { "pc": "ykPlayer", "mobile": "h5-detail-player" }, "tencentvideo": { "pc": "mod_player", "mobile": "mod_player" }, "bilibili": { "pc": "bilibili-player-video-wrap|player-limit-mask", "mobile": "bilibiliPlayer|player-wrapper" }, "acfun": { "pc": "ACPlayer", "mobile": "#ACPlayer" }, "mgtv": { "pc": "mgtv-player-wrap", "mobile": "video-area" }, "sohu": { "pc": "x-player", "mobile": "player-view" }, "le": { "pc": "fla_box", "mobile": "playB" }, "1905": { "pc": "player", "mobile": "player" }, "pptv": { "pc": "pplive-player", "mobile": "pp-details-video" } }, get: function(site, ua) { var res = false; if (site && ua) { var key = this.map[site][ua]; if (key) { key = key.split("|"); for (let i = 0; i < key.length; i++) { res = this.search(key[i]); if (res) { break; } } } } return res; }, search: function(key) { var player = document.getElementById(key); if (player) { return player; } player = document.getElementsByClassName(key)[0]; if (player) { return player; } player = false; return player; }, on: function() { var site = check.site("id"); if (site !== "unknow") { set.init(); set.create(); btn.create(); } } } var btn = { interface: ["https://z1.m1907.cn/?eps=0&jx=", "https://vip.parwix.com:4433/player/?url=", "https://vip.bljiex.com/?v=", "https://lecurl.cn/?url=", "https://jx.m3u8.tv/jiexi/?url=", "https://api.leduotv.com/wp-api/ifr.php?isDp=1&vid=", "https://okjx.cc/?url=", "https://m2090.com/?url=", "http://51wujin.net/?url=", "https://vip.2ktvb.com/player/?url=", "https://660e.com/?url=", "https://api.sigujx.com/?url=", "https://jiexi.janan.net/jiexi/?url=", "https://jx.618g.com/?url=", "https://jx.ergan.top/?url=", "https://api.147g.cc/m3u8.php?url=", "http://17kyun.com/api.php?url=" ], get: function() { return this.interface; }, create: function() { var box = document.createElement("div"); box.style = "cursor: pointer; position: fixed; top: " + set.get("box-top") + ";right: " + set .get("box-right") + ";z-index: 99999;"; box.id = "vipParseBtnBox"; var main = this.createMain(); var menu = this.createMenu(); box.appendChild(main); box.appendChild(menu); document.body.insertBefore(box, document.body.firstChild); }, createMain: function() { var main = document.createElement("div"); var pH = set.get("main-height"); pH = (pH.slice(0, pH.search("px")) - 30) / 2; var pW = set.get("main-width"); pW = (pW.slice(0, pW.search("px")) - 50) / 2; main.style = "height:" + set.get("main-height") + ";width:" + set.get("main-width") + ";background:" + set.get("background") + ";border-radius:" + set.get("main-border-radius") + ";box-sizing:border-box;padding:" + pH + "px " + pW + "px;"; main.id = "vipParseBtnMain"; main.innerHTML = ""; clickOrLongPressFn(main, btn.clickMain, btn.longPressMain); return main; }, createMenu: function() { var menu = document.createElement("div"); var posTop=set.get("main-height"); posTop=posTop.slice(0,posTop.search("px")); posTop=parseFloat(posTop)+5; menu.style = "display:none;width:" + set.get("menu-width") + ";height:" + set.get("menu-height") + ";overflow:hidden;position:absolute;top:"+posTop+"px;right:0px;border-radius:" + set.get( "menu-border-radius") + ";transition: all 0.2s"; menu.id = "vipParseBtnMenu"; var innerMenu = document.createElement("div"); innerMenu.style = "width:115%;height:100%;overflow-y:scroll;overflow-x:hidden;"; var parseIF = this.get(); for (let i = 0; i < parseIF.length; i++) { innerMenu.appendChild(this.createItem(i, parseIF[i])); } menu.appendChild(innerMenu); return menu; }, createItem: function(i, url) { var item = document.createElement("span"); item.style = "color:"+set.get("item-color")+";font-size:" + set.get("item-font-size") + ";display:block;padding:10px 6px 6px 10px;width:calc(100% + 30px);background:" + set.get("background") + ";border-bottom:white solid;" item.setAttribute("url", url); var nameText = ""; if (i < 9) { nameText = "0" + (i + 1).toString(); } else { nameText = (i + 1).toString(); } item.innerText = "播放线路 " + nameText; item.onclick = function() { btn.clickItem(url); console.log("当前解析接口:" + url); } item.onmouseover = function() { this.style.background = set.get("item-color"); this.style.color = set.get("background"); } item.onmouseleave = function() { this.style.background = set.get("background"); this.style.color = set.get("item-color"); } return item; }, clickMain: function() { var menu = document.getElementById("vipParseBtnMenu"); if (menu.style.display !== "none") { menu.style.display = "none"; } else { menu.style.display = "block"; } }, longPressMain: function() { var setting = document.getElementById("vipParseBtnSetting"); if (setting.style.display !== "none") { setting.style.display = "none"; } else { setting.style.display = "block"; } }, clickItem: function(url) { var newPlayer = document.createElement("iframe"); newPlayer.frameBorder = "no"; newPlayer.width = "100%"; newPlayer.height = "100%"; newPlayer.allowFullscreen = "true"; newPlayer.allowTransparency = "true"; newPlayer.scrolling = "no"; newPlayer.id = "newPlayerParseIframe"; newPlayer.src = url + location.href; var player = vip.get(check.site("id"), check.ua()); if (player) { player.innerHTML = ""; if (check.ua() === "mobile") { player.style.height = "225px"; } player.appendChild(newPlayer); } } } vip.on(); })();