您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
(注:一同看官网能打开了就不需要用这个了,可能体验没一同看原生好,并且有时候会无法使用)该版本为“淘呀号”自营解析插件的苹果版,适用于苹果设备,该插件将不再依赖于一同看网站(一同看官网打不开的用户可以使用该插件),直接访问http://gv.gv1069.vip即可观看。
// ==UserScript== // @name 淘呀号解析自营(苹果版) // @namespace http://gv1069.vip/ // @version 1.3 // @description (注:一同看官网能打开了就不需要用这个了,可能体验没一同看原生好,并且有时候会无法使用)该版本为“淘呀号”自营解析插件的苹果版,适用于苹果设备,该插件将不再依赖于一同看网站(一同看官网打不开的用户可以使用该插件),直接访问http://gv.gv1069.vip即可观看。 // @author 淘呀号团队 // @match *://*/* // @grant GM.xmlHttpRequest // @grant GM.addStyle // @grant GM_setValue // @grant GM_getValue // @connect api.gv1069.vip // @exclude http://gv1069.vip/* // @exclude https://www.yuque.com/* // @exclude https://yuque.com/* // @exclude http://www.gv1069.vip/* // @exclude https://m3u8play.com/* // @exclude https://www.m3u8play.com/* // @exclude https://greasyfork.org/* // @exclude https://www.greasyfork.org/* // @license MIT // ==/UserScript== (function () { 'use strict'; // 定义登录 API 地址 var yitongkanBase = "http://api.gv1069.vip"; var page = 1; var searchPage = 1; // 在页面加载时创建登录弹框 window.addEventListener('load', function () { // 创建登录框的HTML const loginBoxHTML = ` <div id="loginBox" style="text-align: center; margin: 20px;"> <h3 style="margin-top:5px;color:blue;">(为防止迷路,请关注微信公众号“淘呀号”)</h3> <h4 style="margin-top:5px;color:red;">(请通过租号网站提供的按钮复制账户密码,其他任何方式都将无法登录)</h4> <h4 style="margin-top:5px;color:red;">(如果忘记,请前往gv1069.vip首页综合服务窗口找回)</h4> <h4 style="margin-top:5px;color:red;">(请确保只安装一个解析脚本,多个解析脚本将会导致冲突)</h4> <form id="loginForm"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> <br><br> <label for="password">密码:</label> <input type="password" id="password" name="password" required> <br><br> <button type="submit">登录</button> </form> <p id="loginError" style="color: red; display: none;">用户名或密码错误</p> </div> `; // 创建退出登录按钮的HTML const logoutButtonHTML = ` <button id="logoutButton" style="background: #D8D8D8; background-image: linear-gradient(135deg, #2F88FF 0%, #43CCF8 100%); border-radius: 20px; font-size: 16px; padding: 10px 20px; color: #FFFFFF; font-weight: 600;">退出登录</button> `; // 将登录框插入到homeso元素下面 const homeSoElement = document.getElementById('homeso'); if (homeSoElement) { homeSoElement.insertAdjacentHTML('afterend', loginBoxHTML); const loginBox = document.getElementById('loginBox'); // 获取 header 中的 authControls 元素 const authControls = document.getElementById('authControls'); // 如果存储的token为空,则显示登录框,否则隐藏登录框 if (GM_getValue("YTToken")==null||GM_getValue("YTToken")=="") { loginBox.style.display = 'block'; } else { loginBox.style.display = 'none'; // 添加退出登录按钮到 header authControls.innerHTML = logoutButtonHTML; } // 添加登录表单提交事件监听 const loginForm = document.getElementById('loginForm'); loginForm.addEventListener('submit', function(event) { event.preventDefault(); // 阻止默认表单提交 // 获取输入的用户名和密码 const username = document.getElementById('username').value; const password = document.getElementById('password').value; if(username==""||password==""){ showToast("账户密码不能为空"); }else{ simulateBackendCommunication(username,password) } }); // 添加退出登录按钮的点击事件监听 authControls.addEventListener('click', function(event) { if (event.target && event.target.id === 'logoutButton') { // 清除本地存储中的 token GM_setValue("YTToken", ""); // 移除退出登录按钮 authControls.innerHTML = ''; // 显示登录框 loginBox.style.display = 'block'; showToast("登出成功") } }); } // 模拟后端通信 function simulateBackendCommunication(username, password) { // 定义登录 API 地址 const loginApiUrl =yitongkanBase+ "/user/login"; // 定义登录参数 const loginData = { loginName: username, password: password }; // 发送登录请求 GM.xmlHttpRequest({ method: "POST", url: loginApiUrl, data: JSON.stringify(loginData), headers: { "Content-Type": "application/json" }, onload: function (response) { // 解析返回的 JSON 数据 const responseData = JSON.parse(response.responseText); console.log(responseData) if (responseData.success) { // 将token存储在localStorage中 // localStorage.setItem('YTToken', YTToken); GM_setValue("YTToken", responseData.content.token); GM_setValue('username', username); GM_setValue('password', password); // 登录成功,隐藏登录框 loginBox.style.display = 'none'; // 在 header 中显示退出登录按钮 authControls.innerHTML = logoutButtonHTML; showToast("登录成功") } else { // 登录失败,显示错误消息 document.getElementById('loginError').style.display = 'block'; showToast("登录失败") } } }); } // 获取输入框和按钮元素 var inputElement = document.querySelector('#sos'); var buttonElement = document.querySelector('#button'); if (inputElement && buttonElement) { // 监听输入框的输入事件 inputElement.addEventListener('input', function() { console.log('输入内容:', inputElement.value); }); // 监听按钮的点击事件 buttonElement.addEventListener('click', function(event) { event.preventDefault(); // 阻止默认提交行为 console.log('按钮被点击,输入内容:', inputElement.value); searchPage=1 if(inputElement.value==""||inputElement.value==null){ showToast("搜索框不能为空"); }else{ showToast("视频检索中"); GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/search-list?limit=20&page="+searchPage+"&type=gv&keyword="+inputElement.value, onload: function (responseSearchVideo) { const responseDataSearchVideo = JSON.parse(responseSearchVideo.responseText); const videos=responseDataSearchVideo.content.data.list const count=responseDataSearchVideo.content.data.count insertItemsIntoSearchList(videos,"https://pic.yitongboy.com") insertIntoSearchPaging(searchPage,count) } }) } }); } else { console.error('未找到输入框或按钮元素'); } // 添加样式 GM.addStyle(` #gm-loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.8); display: none; z-index: -1; display: flex; justify-content: center; align-items: center; } #gm-loading-overlay div { font-size: 20px; } #customLoginModal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); justify-content: center; align-items: center; z-index: 1000; } #loginBox { background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); text-align: center; } #loginBox h2 { color: #333; } .toast { visibility: hidden; min-width: 250px; margin-left: -125px; background-color: #333; color: #fff; text-align: center; border-radius: 5px; padding: 16px; position: fixed; z-index: 1; left: 50%; bottom: 30px; font-size: 17px; } .toast.show { visibility: visible; -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s; animation: fadein 0.5s, fadeout 0.5s 2.5s; } @-webkit-keyframes fadein { from {bottom: 0; opacity: 0;} to {bottom: 30px; opacity: 1;} } @keyframes fadein { from {bottom: 0; opacity: 0;} to {bottom: 30px; opacity: 1;} } @-webkit-keyframes fadeout { from {bottom: 30px; opacity: 1;} to {bottom: 0; opacity: 0;} } @keyframes fadeout { from {bottom: 30px; opacity: 1;} to {bottom: 0; opacity: 0;} } `); function showToast(message) { const toast = document.getElementById("toast"); toast.textContent = message; toast.className = "toast show"; setTimeout(function() { toast.className = toast.className.replace("show", ""); }, 3000); } function createPaging() { return `<span class="lspan" style="background:#ff6651;font-size:40px;"><font color="#fff">«</font></span> <input class="yema" type="text" placeholder="页码" style="width: 50px; text-align: center;"> <button class="confirmButton" type="button" style="margin-left: 5px;">确认</button> <span class="rspan" style="background:#ff6651;font-size:40px;"><font color="#fff">»</font></span> <div id="toast"> </div>` } function insertIntoPaging(index,count) { let pagingHtml=createPaging(); var pagingElement = document.querySelector('.paging'); if (pagingElement) { pagingElement.innerHTML = pagingHtml addClickEventToPaging(index,count); } else { console.error('无法找到列表元素') } } function insertIntoSearchPaging(index,count) { let pagingHtml=createPaging(); var pagingElement = document.querySelector('.paging'); if (pagingElement) { pagingElement.innerHTML = pagingHtml addClickEventToSearchPaging(index,count); } else { console.error('无法找到列表元素') } } function gotoSearchPage(index){ if(inputElement.value==""&&inputElement.value==null){ showToast("搜索框为空"); }else{ GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/search-list?limit=20&page="+index+"&type=gv&keyword="+inputElement.value, onload: function (responseSearchVideo) { scrollToTop() const responseDataSearchVideo = JSON.parse(responseSearchVideo.responseText); const videos=responseDataSearchVideo.content.data.list const count=responseDataSearchVideo.content.data.count insertItemsIntoSearchList(videos,"https://pic.yitongboy.com") insertIntoSearchPaging(index,count) } }) } } function gotoPage(page){ if(inputElement.value==""&&inputElement.value==null){ showToast("搜索框为空"); }else{ GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/get-gv-list?page="+page, onload: function (responseVideo) { scrollToTop() const responseDataVideo = JSON.parse(responseVideo.responseText); const videos=responseDataVideo.content.data.list const count=responseDataVideo.content.data.count insertItemsIntoList(videos,"https://pic.yitongboy.com") insertIntoPaging(page,count) } }) } } gotoPage(page); function isNonNegativeInteger(value) { const number = Number(value); return Number.isInteger(number) && number >= 0; } // Function to scroll to the top of the page function scrollToTop() { window.scrollTo(0, 0); } function addClickEventToPaging(index,count) { var lspan = document.querySelector('.lspan'); var rspan = document.querySelector('.rspan'); var yema = document.querySelector('.yema'); var confirmButton = document.querySelector('.confirmButton'); lspan.addEventListener('click', function() { if(index>1){ page=page-1; gotoPage(page); showToast("第"+page+"页加载中"); }else{ showToast("到头了!"); } }) rspan.addEventListener('click', function() { if(index<(count/20)){ page=page+1; gotoPage(page); showToast("第"+page+"页加载中"); }else{ showToast("真的没有了!"); } }) confirmButton.addEventListener('click', function() { var yemaValue=yema.value; if(isNonNegativeInteger(yemaValue)&&yemaValue !== ""){ if(1<index<(count/20)){ page=+yemaValue; gotoPage(page); showToast("第"+page+"页加载中"); }else{ showToast("非法页码!"); } }else{ showToast("非法页码!"); } }) } function addClickEventToSearchPaging(index,count) { var lspan = document.querySelector('.lspan'); var rspan = document.querySelector('.rspan'); var yema = document.querySelector('.yema'); var confirmButton = document.querySelector('.confirmButton'); lspan.addEventListener('click', function() { if(index>1){ searchPage=searchPage-1; gotoSearchPage(searchPage); showToast("第"+searchPage+"页加载中"); }else{ showToast("到头了!"); } }) rspan.addEventListener('click', function() { if(index<(count/20)){ searchPage=searchPage+1; gotoSearchPage(searchPage); showToast("第"+searchPage+"页加载中"); }else{ showToast("真的没有了!"); } }) confirmButton.addEventListener('click', function() { var yemaValue=yema.value; if(isNonNegativeInteger(yemaValue)&&yemaValue !== ""){ if(1<index<(count/20)){ searchPage=+yemaValue; gotoSearchPage(searchPage); showToast("第"+searchPage+"页加载中"); }else{ showToast("非法页码!"); } }else{ showToast("非法页码!"); } }) } function createListItem(item, domain) { return `<li style='margin-bottom:100px;' class='item' > <div class='cover g-playicon' data-video-id='${item.video_id}' data-video-type='${item.video_type}' data-v-id='${item.v_id}' data-episodes='${item.episodes}' data-mv-name='${item.mv_name}'> <img src='${domain}${item.mv_pic}'alt='${item.video_id}'/> <span class='pay'>推荐</span> <span class='hint'>${new Date(item.addtime).getFullYear()}</span> </div> <div class='detail'> <p class='title g-clear'> <span class='s1'>${base64Decode(item.mv_name)}</span> </p> <p class='star'></p> </div> <div class="download-buttons" > <button class="downloadLC" data-video-id='${item.video_id}' data-video-type='${item.video_type}' data-v-id='${item.v_id}' data-episodes='${item.episodes}'>流畅下载</button> <button class="downloadBQ" data-video-id='${item.video_id}' data-video-type='${item.video_type}' data-v-id='${item.v_id}' data-episodes='${item.episodes}'>标清下载</button> <button class="downloadGQ" data-video-id='${item.video_id}' data-video-type='${item.video_type}' data-v-id='${item.v_id}' data-episodes='${item.episodes}'>高清下载</button> </div> </li> ` } function createSearchListItem(item, domain) { return `<li style='margin-bottom:100px;' class='item' > <div class='cover g-playicon' data-id='${item.id}' > <img src='${domain}${item.thumb}'alt='${item.id}'/> <span class='pay'>推荐</span> <span class='hint'>${new Date(item.addtime).getFullYear()}</span> </div> <div class='detail'> <p class='title g-clear'> <span class='s1'>${base64Decode(item.mv_name)}</span> </p> <p class='star'></p> </div> <div class="download-buttons" > <button class="downloadLC" data-id='${item.id}'>流畅下载</button> <button class="downloadBQ" data-id='${item.id}'>标清下载</button> <button class="downloadGQ" data-id='${item.id}'>高清下载</button> </div> </li> ` } function generateListItems(dataArray, domain) { return dataArray.map(item => createListItem(item, domain)) .join('') } function generateSearchListItems(dataArray, domain) { return dataArray.map(item => createSearchListItem(item, domain)) .join('') } function insertItemsIntoList(dataArray, domain) { var listItemsHtml = generateListItems(dataArray, domain); var listElement = document.querySelector('.s-tab-main .list.g-clear'); if (listElement) { listElement.innerHTML = listItemsHtml addClickEventToItems() addClickEventToDownloadLC() addClickEventToDownloadBQ() addClickEventToDownloadGQ() } else { console.error('无法找到列表元素') } } function insertItemsIntoSearchList(dataArray, domain) { var listItemsHtml = generateSearchListItems(dataArray, domain); var listElement = document.querySelector('.s-tab-main .list.g-clear'); if (listElement) { listElement.innerHTML = listItemsHtml addClickEventToSearchItems() addClickEventToSearchDownloadLC() addClickEventToSearchDownloadBQ() addClickEventToSearchDownloadGQ() } else { console.error('无法找到列表元素') } } // 使用 JavaScript 进行 Base64 解码 function base64Decode(encodedString) { return decodeURIComponent(escape(atob(encodedString))); } function addClickEventToSearchDownloadLC() { var items = document.querySelectorAll('.downloadLC'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToSearchDownloadBQ() { var items = document.querySelectorAll('.downloadBQ'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToSearchDownloadGQ() { var items = document.querySelectorAll('.downloadGQ'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToDownloadLC() { var items = document.querySelectorAll('.downloadLC'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToDownloadBQ() { var items = document.querySelectorAll('.downloadBQ'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToDownloadGQ() { var items = document.querySelectorAll('.downloadGQ'); items.forEach(item => { item.addEventListener('click', function() { showToast("苹果设备不支持下载,请使用安卓设备或者电脑") }) }) } function addClickEventToItems() { var items = document.querySelectorAll('.cover.g-playicon'); items.forEach(item => { item.addEventListener('click', function() { var videoId = item.getAttribute('data-video-id'); var videoType = item.getAttribute('data-video-type'); var vId = item.getAttribute('data-v-id'); var episodes = item.getAttribute('data-episodes'); var mvName=item.getAttribute('data-mv-name'); const tempPage = window.open('loading page'); let qualityList="" tempPage.addEventListener('load', function() { GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/get-video-url?video_id="+videoId+"&video_type="+videoType+"&v_id="+vId+"&episodes="+episodes+"&prefix=&line=&token="+GM_getValue("YTToken"), onload: function (responseUrl) { const responseDataVideo = JSON.parse(responseUrl.responseText); if (responseDataVideo.success && responseDataVideo.content != null && responseDataVideo.content != "") { const urls=responseDataVideo.content.data.video_url const keys = Object.keys(urls); const numberOfKeys = keys.length; console.log(numberOfKeys) if(numberOfKeys==1){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', },` }else if(numberOfKeys==2){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', }, { name: '标清', url: '${base64Decode(urls['720'])}', type: 'hls', },` }else if(numberOfKeys==3){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', }, { name: '标清', url: '${base64Decode(urls['720'])}', type: 'hls', }, { name: '高清', url: '${base64Decode(urls['1080'])}', type: 'hls', },` } let playhtml=`<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta http-equiv="cache-control" content="no-siteapp"> <link rel="stylesheet" type="text/css" href="../static/css/style.css" /> <link rel="stylesheet" type="text/css" href="../static/css/play.css" /> <link href="/static/layui/css/layui.css" rel="stylesheet"> <script src="/static/layui/layui.js"></script> <script src="/dist/DPlayer.min.js"></script> <script src="/dist/hls.min.js"></script> <link rel="stylesheet" href="/dist/DPlayer.min.css"> <title>淘呀号</title> </head> <style> .w-newfigure{list-style:none; float:left;} .list{ margin-left:-40px;} </style> <body class="page-template page-template-pages page-template-posts-play page-template-pagesposts-play-php page page-id-16"> <style> .tips { box-sizing: border-box; padding: 10px 20px; position: fixed; left: 0; right: 0; bottom: 0; height: 64px; background-color: rgba(0,0,0,0.50); z-index: 100000; display: flex; flex-direction: row; align-items: center; justify-content: space-between; } .t-left { display: flex; flex-direction: row; align-items: center; justify-content: flex-start; } .t-logo { width: 48px; height: 48px; margin-right: 10px; } .c-t { color: #fff; display: flex; flex-direction: column; align-items: flex-start; } .c-title { font-family: PingFangSC-Semibold; font-size: 16px; color: #FFFFFF; line-height: 22px; font-weight: 600; } .c-desc { font-family: PingFangSC-Regular; font-size: 12px; color: #FFFFFF; font-weight: 400; } .t-btn { box-sizing: border-box; width: 78px; height: 30px; line-height: 30px; text-align: center; background: #D8D8D8; background-image: linear-gradient(135deg, #2F88FF 0%, #43CCF8 100%); border-radius: 20px; font-size: 14px; color: #FFFFFF; font-weight: 600; } .close-icons { width: 10px; height: 10px; position: absolute; top: 10px; right: 10px; } </style> <script type="text/javascript" src="../static/js/crypto-js.min.js"></script> <script type="text/javascript" src="../static/js/jquery.min.js"></script> <meta name="referrer" content="never"> <meta name="referrer" content="no-referrer"> <div class="single-post"> <section class="container"> <div class="content-wrap"> <div class="content"> <div class="sptitle"><h1> </h1></div> <div id="bof" class = "cf-157586882"> </div> <!-- 添加视频标题 --> <div class="video-title">${base64Decode(mvName)}</div> <div class="am-cf"></div> <div class="am-panel am-panel-default"> <div class="am-panel-bd" style="padding-top: 10px;"> <div class="bofangdiv" id="dplayer"></div> <script type="text/javascript"> const dp = new DPlayer({ container: document.getElementById('dplayer'), screenshot: true, video: { quality: [ ${qualityList} ], defaultQuality: 0, } }); function xldata(urls){ var videourls = document.getElementById('video'); var xlqieh = document.getElementById('videourlgo'); videourls.src = urls+xlqieh.href; } </script> <div class="article-tags"> <i class="fa fa-tags"></i> </div> </div> </div> </div> </div> </section> </div> </body> </html> ` // 替换当前页面的内容 tempPage.document.open(); tempPage.document.write(playhtml); tempPage.document.close(); } else if (responseDataVideo.message == "2") { GM_setValue("YTToken", ""); var result = confirm("该账户已过期,请您重新购买或者取号!点击“确定”按钮自动跳转至购买界面!"); if (result) { window.location.href = "http://gv1069.vip/#/shop-account"; } } else if (responseDataVideo.message == "3") { GM_setValue("YTToken", ""); var result = confirm("请您重新登录!点击“确定”按钮自动弹出登录输入框!"); if (result) { window.location.reload(); } } else if (responseDataVideo.message == "4" || responseDataVideo.message == "5") { GM_setValue("YTToken", ""); var result = confirm("请您重新登录!点击“确定”按钮自动弹出登录输入框!"); if (result) { window.location.reload(); } } else if (responseDataVideo.message == "6") { GM_setValue("YTToken", ""); var result = confirm("您的账号在另一台设备上登录,请重新登录"); if (result) { window.location.reload(); } } else { showToast('解析失败,请点击播放按钮重试!') } } }) }); }); }); } function addClickEventToSearchItems() { var items = document.querySelectorAll('.cover.g-playicon'); items.forEach(item => { item.addEventListener('click', function() { var id = item.getAttribute('data-id'); const tempPage = window.open('loading page'); let qualityList="" tempPage.addEventListener('load', function() { GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/get-video-view?id="+id, onload: function (responseView) { const responseDataView = JSON.parse(responseView.responseText); const view=responseDataView.content.data console.log(view) var videoId = view.video_id; var videoType = view.video_type; var vId = view.v_id; var episodes = view.episodes; var mvName=view.mv_name; GM.xmlHttpRequest({ method: 'GET', url: yitongkanBase + "/app/get-video-url?video_id="+videoId+"&video_type="+videoType+"&v_id="+vId+"&episodes="+episodes+"&prefix=&line=&token="+GM_getValue("YTToken"), onload: function (responseUrl) { const responseDataVideo = JSON.parse(responseUrl.responseText); if (responseDataVideo.success && responseDataVideo.content != null && responseDataVideo.content != "") { const urls=responseDataVideo.content.data.video_url console.log(urls) const keys = Object.keys(urls); const numberOfKeys = keys.length; console.log(numberOfKeys) if(numberOfKeys==1){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', },` }else if(numberOfKeys==2){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', }, { name: '标清', url: '${base64Decode(urls['720'])}', type: 'hls', },` }else if(numberOfKeys==3){ qualityList=`{ name: '流畅', url: '${base64Decode(urls['480'])}', type: 'hls', }, { name: '标清', url: '${base64Decode(urls['720'])}', type: 'hls', }, { name: '高清', url: '${base64Decode(urls['1080'])}', type: 'hls', },` } let playhtml=`<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta http-equiv="cache-control" content="no-siteapp"> <link rel="stylesheet" type="text/css" href="../static/css/style.css" /> <link rel="stylesheet" type="text/css" href="../static/css/play.css" /> <link href="/static/layui/css/layui.css" rel="stylesheet"> <script src="/static/layui/layui.js"></script> <script src="/dist/DPlayer.min.js"></script> <script src="/dist/hls.min.js"></script> <link rel="stylesheet" href="/dist/DPlayer.min.css"> <title>淘呀号</title> </head> <style> .w-newfigure{list-style:none; float:left;} .list{ margin-left:-40px;} </style> <body class="page-template page-template-pages page-template-posts-play page-template-pagesposts-play-php page page-id-16"> <style> .tips { box-sizing: border-box; padding: 10px 20px; position: fixed; left: 0; right: 0; bottom: 0; height: 64px; background-color: rgba(0,0,0,0.50); z-index: 100000; display: flex; flex-direction: row; align-items: center; justify-content: space-between; } .t-left { display: flex; flex-direction: row; align-items: center; justify-content: flex-start; } .t-logo { width: 48px; height: 48px; margin-right: 10px; } .c-t { color: #fff; display: flex; flex-direction: column; align-items: flex-start; } .c-title { font-family: PingFangSC-Semibold; font-size: 16px; color: #FFFFFF; line-height: 22px; font-weight: 600; } .c-desc { font-family: PingFangSC-Regular; font-size: 12px; color: #FFFFFF; font-weight: 400; } .t-btn { box-sizing: border-box; width: 78px; height: 30px; line-height: 30px; text-align: center; background: #D8D8D8; background-image: linear-gradient(135deg, #2F88FF 0%, #43CCF8 100%); border-radius: 20px; font-size: 14px; color: #FFFFFF; font-weight: 600; } .close-icons { width: 10px; height: 10px; position: absolute; top: 10px; right: 10px; } </style> <script type="text/javascript" src="../static/js/crypto-js.min.js"></script> <script type="text/javascript" src="../static/js/jquery.min.js"></script> <meta name="referrer" content="never"> <meta name="referrer" content="no-referrer"> <div class="single-post"> <section class="container"> <div class="content-wrap"> <div class="content"> <div class="sptitle"><h1> </h1></div> <div id="bof" class = "cf-157586882"> </div> <!-- 添加视频标题 --> <div class="video-title">${base64Decode(mvName)}</div> <div class="am-cf"></div> <div class="am-panel am-panel-default"> <div class="am-panel-bd" style="padding-top: 10px;"> <div class="bofangdiv" id="dplayer"></div> <script type="text/javascript"> const dp = new DPlayer({ container: document.getElementById('dplayer'), screenshot: true, video: { quality: [ ${qualityList} ], defaultQuality: 0, } }); function xldata(urls){ var videourls = document.getElementById('video'); var xlqieh = document.getElementById('videourlgo'); videourls.src = urls+xlqieh.href; } </script> <div class="article-tags"> <i class="fa fa-tags"></i> </div> </div> </div> </div> </div> </section> </div> </body> </html> ` // 替换当前页面的内容 tempPage.document.open(); tempPage.document.write(playhtml); tempPage.document.close(); } else if (responseDataVideo.message == "2") { GM_setValue("YTToken", ""); GM_setValue('username', ""); GM_setValue('password', ""); var result = confirm("该账户已过期,请您重新购买或者取号!点击“确定”按钮自动跳转至购买界面!"); if (result) { window.location.href = "http://gv1069.vip/#/shop-account"; } } else if (responseDataVideo.message == "3") { GM_setValue("YTToken", ""); GM_setValue('username', ""); GM_setValue('password', ""); var result = confirm("请您重新登录!点击“确定”按钮自动弹出登录输入框!"); if (result) { window.location.reload(); } } else if (responseDataVideo.message == "4" || responseDataVideo.message == "5") { GM_setValue("YTToken", ""); GM_setValue('username', ""); GM_setValue('password', ""); var result = confirm("请您重新登录!点击“确定”按钮自动弹出登录输入框!"); if (result) { window.location.reload(); } } else if (responseDataVideo.message == "6") { GM_setValue("YTToken", ""); GM_setValue('username', ""); GM_setValue('password', ""); var result = confirm("您的账号在另一台设备上登录,请重新登录"); if (result) { window.location.reload(); } } else { showToast('解析失败,请点击播放按钮重试!') } } }) } }) }); }); }); } $("body").on('click', '.close-gobutton', function () { $("#down-my-section").remove(); }) }); })();