// ==UserScript==
// @name 115优化大师
// @author zxf10608
// @version 4.2
// @icon https://115.com/favicon.ico
// @namespace https://greasyfork.org/zh-CN/scripts/408466
// @description 优化115网盘浏览体验:一键离线下载、调用Dplayer或Potplayer播放视频、文件快捷下载等。
// @require https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js
// @require https://greasyfork.org/scripts/398240-gm-config-zh-cn/code/GM_config_zh-CN.js
// @require https://greasyfork.org/scripts/412267-base64-v1-0/code/base64_v10.js
// @require https://cdn.jsdelivr.net/npm/toastr@2.1.4/toastr.min.js
// @resource toastrCss https://cdn.jsdelivr.net/npm/toastr@2.1.4/build/toastr.min.css
// @require https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js
// @resource dplayerCss https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css
// @require https://cdn.jsdelivr.net/npm/hls.js@0.14.16/dist/hls.min.js
// @include *
// @exclude https://*.115.com/bridge*
// @exclude http*://*.baidu.com/*
// @exclude http*://*.iqiyi.com/*
// @exclude http*://*.qq.com/*
// @exclude http*://v.youku.com/*
// @exclude http*://*.bilibili.com/
// @exclude http*://*.pptv.com/*
// @exclude http*://*.fun.tv/*
// @exclude http*://*.sohu.com/*
// @exclude http*://*.le.com/*
// @exclude http*://*.tudou.com/*
// @exclude http*://*.bilibili.com/*
// @exclude http*://music.163.com/*
// @exclude http*://github.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @grant GM_openInTab
// @grant GM_setClipboard
// @grant GM_getResourceText
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @connect 115.com
// @grant unsafeWindow
// @grant window.open
// @grant window.close
// @run-at document-start
// @compatible chrome
// @license GPL License
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
var newVersion = 'v4.2';
if ( typeof GM_config == 'undefined') {
alert('115优化大师:\n网络异常,相关库文件加载失败,脚本无法使用,请刷新网页重新加载!');
return;
} else {
console.log('115优化大师:相关库文件加载成功!');
};
function config(){
var windowCss = '#Cfg .config_var {margin-left: 10%;margin-right: 10%;} #Cfg input[type="checkbox"] {margin: 3px 3px 3px 0px;} #Cfg input[type="text"] {width: 53px;} #Cfg {background-color: lightblue;} #Cfg .reset_holder {float: left; position: relative; bottom: -1em;} #Cfg .saveclose_buttons {margin: .7em;} #Cfg .section_desc {font-size: 10pt;}';
GM_registerMenuCommand('设置', opencfg);
function opencfg(){
GM_config.open();
};
GM_config.init(
{
id: 'Cfg',
title: GM_config.create('a', {
href: 'https://greasyfork.org/zh-CN/scripts/408466',
target: '_blank',
textContent: '115优化大师',
title: '作者:zxf10608 版本:'+newVersion+' 点击访问主页'
}),
isTabs: true,
skin: 'tab',
css: windowCss,
frameStyle:
{
height: '500px',
width: '425px',
zIndex:'2147483648',
},
fields:
{
hide_qrcodeLogin:
{
section: ['登录管理', '自定义登录方式,显示登录时间'],
label: '隐藏二维码登录',
labelPos: 'right',
type: 'checkbox',
default: false,
},
hide_officeLogin:
{
label: '隐藏115组织登录',
labelPos: 'right',
type: 'checkbox',
default: false,
},
show_Alidity:
{
label: '显示上次登录时间',
labelPos: 'right',
type: 'checkbox',
default: false,
},
offline_Down:
{
section: ['离线升级', '升级离线下载功能'],
label: '启用一键离线下载',
labelPos: 'right',
type: 'checkbox',
default: true,
},
offline_result:
{
label: '任务添加后显示离线结果',
labelPos: 'right',
type: 'checkbox',
default: true,
},
open_List:
{
label: '离线后自动打开任务列表',
labelPos: 'right',
type: 'checkbox',
default: false,
},
open_search:
{
label: '离线成功后开启视频搜索',
labelPos: 'right',
type: 'checkbox',
default: true,
line: 'start',
},
search_result:
{
label: '显示视频搜索结果',
labelPos: 'right',
type: 'checkbox',
default: true,
},
open_Popup:
{
label: '搜到视频自动播放',
labelPos: 'right',
type: 'checkbox',
default: false,
line: 'end',
},
fuzzy_find:
{
label: '启用下载地址模糊匹配',
labelPos: 'right',
type: 'checkbox',
default: false,
},
diy_folder:
{
label: '自定义离线下载文件夹',
labelPos: 'right',
type: 'checkbox',
default: false,
line: 'start',
},
save_folder:
{
label: '设置文件夹',
labelPos: 'right',
type: 'button',
line: 'end',
click: function(){
setFolder();
}
},
reminder2:
{
label: '温馨提示',
labelPos: 'right',
type: 'button',
click: function(){
alert('1、显示离线下载结果有10s延时,用于服务器响应时间。\n2、为避免通知弹窗过多,最多只显示3个视频搜索结果,更多请自行到115查看。\n3、“启用下载地址模糊匹配”后,能根据哈希值或纯文本模糊匹配磁力链接和迅雷专用链,如在磁力搜索引擎、资源网等有奇效,但在某些网页有一定几率误识别,请谨慎开启。');
}
},
player:
{
section: ['播放优化', '调用第三方播放器,优化播放体验'],
label: '默认播放器',
labelPos: 'left',
type: 'select',
options: ['Dplayer', 'Potplayer', '官方HTML5'],
default: 'Dplayer',
},
play_Quality:
{
label: '默认播放清晰度',
labelPos: 'left',
type: 'select',
'options': ['最高', '次高', '最低'],
default: '次高',
},
skip_titles:
{
label: '跳过片头秒数',
type: 'unsigned int',
default: '0',
},
skip_credits:
{
label: '跳过片尾秒数',
type: 'unsigned int',
default: '0',
},
online_List:
{
label: '开启云端记忆播放',
labelPos: 'right',
type: 'checkbox',
default: true,
},
Tab_ing:
{
label: '播放器跟随页面变化',
labelPos: 'right',
type: 'checkbox',
default: false,
},
reminder3:
{
label: '温馨提示',
labelPos: 'right',
type: 'button',
click: function(){
alert('1、除第一、第二项外,其他仅在启用Dplayer时有效。\n2、开启云端记忆播放,播放记录将自动上传至云端(115服务器),下次播放自动恢复上一次进度。\n3、播放界面右键可显示更多菜单,谨慎使用“删除”操作。\n4、播放器跟随页面变化,即页面后台则暂停,页面前台则播放,支持Dplayer和官方HTML5。\n5、关于播放器调用说明:\n 单击文件名:默认播放器;\n 双击除文件名外:官方HTML5;\n 单击“Dp播放”:Dplayer;\n 单击“Pot播放”:Potplayer;\n 非115页面:默认播放器。');
}
},
hide_sidebar:
{
section: ['更多设置', '优化浏览体验'],
label: '隐藏网盘侧边栏',
labelPos: 'right',
type: 'checkbox',
default: false,
},
show_Star:
{
label: '网盘顶部增加星标按钮',
labelPos: 'right',
type: 'checkbox',
default: false,
},
show_Task:
{
label: '网盘顶部增加链接任务按钮',
labelPos: 'right',
type: 'checkbox',
default: true,
},
show_Update:
{
label: '更新后弹出更新日志',
labelPos: 'right',
type: 'checkbox',
default: false,
},
file_Down:
{
label: '启用文件快捷下载',
labelPos: 'right',
type: 'checkbox',
default: true,
line: 'start',
},
show_sha:
{
label: '下载后显示文件校验码',
labelPos: 'right',
type: 'checkbox',
default: false,
line: 'end',
},
toastr:
{
label: '通知弹出位置',
labelPos: 'left',
type: 'select',
'options': ['左上', '右上', '中上','全铺'],
default: '右上',
},
},
events:
{
save: function(){
GM_config.close();
}
},
});
};
config();
var G = GM_config;
var localHref = window.location.href;
var down_reg = /^(magnet|thunder|ftp|ed2k):/i;
var sign_url = 'http://115.com/?ct=offline&ac=space';
var add_url = 'http://115.com/web/lixian/?ct=lixian&ac=add_task_url';
var lists_url = 'http://115.com/web/lixian/?ct=lixian&ac=task_lists';
function notice(){
GM_addStyle(GM_getResourceText('toastrCss'));
if(G.get('toastr')=='全铺'|| localHref.indexOf('https://captchaapi.115.com') != -1) {
GM_addStyle('.toast{font-size:15px!important;} .toast-title{font-size:16px!important;text-align:center}');
}else{
GM_addStyle('.toast{font-size:15px!important;width:350px!important;} .toast-title{font-size:16px!important;text-align:center}');
};
var place = {'左上':'toast-top-left','右上':'toast-top-right','中上':'toast-top-center'}[G.get('toastr')] || 'toast-top-full-width';
toastr.options = {
"closeButton": true,
"debug": false,
"progressBar": true,
"timeOut": 8000,
"extendedTimeOut": 8000,
"positionClass": place,
"allowHtml": true,
"newestOnTop" : false,
};
};
notice();
function AjaxCall(href,callback) {
GM_xmlhttpRequest({
method: "GET",
url: href,
onload: function(data,status) {
if(data.readyState==4 && data.status==200){
var htmlTxt = data.responseText;
callback(null,htmlTxt);
};
},
onerror: function (error) {
callback(error);
},
ontimeout: function (error) {
callback(error);
},
});
};
function setFolder(){
var old_cid = GM_getValue('offlineFolder') || '';
var new_cid = prompt('请输入离线下载保存文件夹的cid值:\n ※ 获取cid值方法:打开需要保存到的网盘文件夹,复制地址栏中"cid="后面的一串数字,以"&"截止,如https://115.com/?cid=012345678912345678&...,cid值则为 012345678912345678。该项不填或填无效值则保存至默认文件夹(云下载)。※'
,old_cid);
if (/^(\d{17,19}|0)$/.test(new_cid)){
GM_setValue('offlineFolder',new_cid);
alert('设置成功,现cid值为:\n'+new_cid);
}else if(new_cid==''){
GM_setValue('offlineFolder','');
alert('未输入cid值,保存至默认文件夹(云下载)。');
}else if(new_cid==null){
console.log('已点击取消');
}else{
alert('设置失败,cid值无效,请重新输入!\n(该值除根目录为 0 外,其他文件夹均为17至19位纯数字)');
setFolder();
};
};
function download(pid,sha){
var href = 'https://webapi.115.com/files/download?pickcode='+pid;
AjaxCall(href,function(error,htmlTxt) {
var json = JSON.parse(htmlTxt);
if(json.state) {
var link = json.file_url.replace(/\\/g,'');
GM_openInTab(link);
if (G.get('show_sha')){
setTimeout(function(){
prompt('文件下载中,校验码(SHA1)为:',sha);
}, 1000);
};
console.log('下载地址:\n'+link);
console.log('校验码:\n'+sha);
} else {
toastr.warning(json.msg,'下载失败!');
};
});
};
function getHistory(pid){
return new Promise(function(resolve,reject){
var href = 'https://webapi.115.com/files/history?pick_code='+pid+'&fetch=one&category=1';
AjaxCall(href,function(error,htmlTxt){
var time = 0;
if(error){
resolve(time);
};
var json = JSON.parse(htmlTxt);
if(json.state){
if(!json.data.watch_end){
time = json.data.time;
};
};
resolve(time);
});
});
};
function palyData(video,type){
if ((G.get('player') =='官方HTML5' && type == '115play') || type == 'dblclick'){
var link = 'https://115.com/?ct=play&pickcode='+video.pid+'&hls=1';
GM_openInTab(link,false);
return;
};
var herfLink = 'https://115.com/api/video/m3u8/'+video.pid+'.m3u8';
AjaxCall(herfLink,function(error,htmlTxt) {
if (typeof htmlTxt == 'undefined') {
transcoding(video.pid,video.sha);
return;
};
var dataList = htmlTxt.split('\n');
var m3u8 = [];
var temp = '"YH"|原画|"BD"|4K|"UD"|蓝光|"HD"|超清|"SD"|高清|"3G"|标清';
var txt = temp.split('|');
for (var i=0; i<6; i++){
dataList.forEach(function (e,j,arr) {
if (e.indexOf(txt[i*2])!= -1) {
m3u8.push({name: txt[i*2+1], url: arr[j+1].replace(/\r/g,''), type:'hls'});
};
});
};
if (m3u8.length ==1 || G.get('play_Quality') =='最高'){
var num = 0;
}else if(m3u8.length >1 && G.get('play_Quality') =='次高'){
var num = 1;
}else{
var num = m3u8.length - 1;
};
video['quality'] = num;
if ((G.get('player') == 'Potplayer' && type == '115play') || type == 'Pot'){
window.location.href = 'potplayer://'+m3u8[num].url;
return;
};
GM_setValue('videoInfo',video);
GM_setValue('m3u8List',m3u8);
GM_openInTab('http://115.com/web/lixian/',false);
});
};
function transcoding(pid,sha,fast){
var href = 'http://transcode.115.com/api/1.0/web/1.0/trans_code/check_transcode_job?sha1='+sha+'&priority=100';
console.log('转码进度地址:'+href);
AjaxCall(href,function(error,htmlTxt){
var json = JSON.parse(htmlTxt);
if(json.status == 1 || json.status == 3){
var num = json.count;
var time = tranTime(json.time).replace(/分.*/,'分');
var txt = `等待转码排名:第${num}名,耗时:约${time},请稍后再试。`;
}else if(json.status == 127){
var txt = '未获取到转码进度,请稍后再试。';
console.log('查询转码进度失败');
};
var h1 = `
转码进度详情`;
var h2 = '';
if(fast==1){
var title ='加速转码成功!';
}else if(fast){
var title ='加速转码失败!';
var txt = fast;
}else{
var title ='播放失败,视频未转码!';
h2 = ` 加速转码`;
};
toastr.warning(txt+h1+h2,title,{timeOut:10000});
});
};
function transcod_fast(pid,sha){
var push_url = 'https://115.com/?ct=play&ac=push';
var key = `op=vip_push&pickcode=${pid}&sha1=${sha}`;
offline.getData(push_url,key).then(function(json){
if(json.state){
var fast= 1;
transcoding(pid,sha,fast);
console.log('加速转码成功!');
return;
}else{
var fast= json.msg;
transcoding(pid,sha,fast);
console.log('加速转码失败!');
};
});
};
function change(number){
var size = "";
if(number < 1024 * 1024 * 1024){
size = (number/(1024 * 1024)).toFixed(2) + "MB";
}else{
size = (number/(1024 * 1024 * 1024)).toFixed(2) + "GB";
};
var sizeStr = size + "";
var index = sizeStr.indexOf(".");
var dou = sizeStr.substr(index + 1 ,2)
if(dou == "00"){
return sizeStr.substring(0, index) + sizeStr.substr(index + 3, 2)
};
return size;
};
function tranTime(num){
var showTime = '';
if (num > 3600) {showTime += ' '+parseInt(num/3600)+' 小时'; num = num%3600;}
if (num > 60) {showTime += ' '+parseInt(num/60)+' 分'; num = num%60;}
return showTime += ' '+parseInt(num)+' 秒';
};
function enterPiP(videoEl){
if(document.pictureInPictureEnabled && !videoEl.disablePictureInPicture) {
if (!document.pictureInPictureElement) {
videoEl.requestPictureInPicture();
}else{
document.exitPictureInPicture();
};
}else{
alert('浏览器不支持或已关闭画中画功能!');
};
};
function clickOne(el){
if (el.attr('clicked') == 1){
console.log('5s内不可点击该按钮');
return false;
}else{
el.attr('clicked',1);
el.css('opacity','0.2');
setTimeout(function(){
el.attr('clicked',0);
el.css('opacity','0.7');
}, 5000);
return true;
};
};
function verify(){
var time = new Date().getTime();
var w=335;
var h=500;
var t = (window.screen.availHeight-h)/2;
var l = (window.screen.availWidth-w)/2;
var link = 'https://captchaapi.115.com/?ac=security_code&type=web&cb=Close911_'+time;
var a = confirm('立即打开验证账号弹窗?\n(浏览器需允许弹出式窗口)');
if (a){
window.open(link,'请验证账号','height='+h+',width='+w+',top='+t+',left='+l+',toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no');
};
};
function getRightUrl(url){
var newUrl = url;
if(/^magnet/i.test(url)){
var hash=url.split('&')[0].substring(20) || url.substring(20);
if(hash.length==32){
hash=base32To16(hash);
};
newUrl='magnet:?xt=urn:btih:' + hash;
}else if(/^thunder/i.test(url)){
var key = url.replace(/thunder:\/\//i,'');
var temp = decode64(key);
newUrl = temp.slice(2,-2);
}else if(/^\/\//.test(url)){
newUrl=location.protocol + url;
}else if(/^\/(?!\/)/.test(url)){
newUrl=location.protocol+'//'+location.host + url;
};
return newUrl;
};
function base32To16(str){
if(str.length % 8 !== 0 || /[0189]/.test(str)){
return str;
};
str = str.toUpperCase();
var bin = "", newStr = "", i;
for(i = 0;i < str.length;i++){
var charCode=str.charCodeAt(i);
if(charCode<65)charCode-=24;
else charCode-=65;
charCode='0000'+charCode.toString(2);
charCode=charCode.substr(charCode.length-5);
bin+=charCode;
};
for(i = 0;i < bin.length;i+=4){
newStr += parseInt(bin.substring(i,i+4),2).toString(16);
};
return newStr;
};
function getAttribute(e){
var data = [] ;
$.each(e.attributes, function() {
if(this.specified && this.value.length>30) {
data.push(this.value);
};
});
if($(e).text().length>25) data.push($(e).text());
return data;
};
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"H+": this.getHours(),
"m+": this.getMinutes(),
"s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3),
"S": this.getMilliseconds()
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
$(document).ready(function(){
if(localHref.indexOf('https://115.com/') != -1) {
if (typeof (unsafeWindow.USER_ID) != 'undefined') {
GM_setValue('115ID', unsafeWindow.USER_ID);
console.log('115账号已登录,账号ID获取成功!');
} else {
if (G.get('hide_officeLogin')){
$('.ltab-office').hide();
};
if (G.get('hide_qrcodeLogin')){
$('.login-scene,.login-footer span:eq(0),.login-footer i:eq(0)').hide();
$('[lg_rel="login"]').show();
} else if ($('[lgb-nav="download"]').length > 0) {
$('[lgb-nav="download"]').attr('lgb-nav','login');
};
console.log('115账号未登录,账号ID获取失败!');
};
var $topEl = $('#js_top_panel_box [menu="upload"]').addClass('btn-line');
if (G.get('show_Star')){
$topEl.after('星标');
};
if (G.get('show_Task')){
$topEl.after('链接任务');
};
$('body').append(`
`);
if (G.get('hide_sidebar')){
$('.sub-core').hide();
setTimeout(function(){
$('.main-core').css({'left':'16px','top':'16px'});
},50);
};
if (G.get('file_Down')){
var herfd = 'li[rel="item"][file_type="1"]:not([down_button="1"])';
$('body').on('mouseenter',herfd,function(){
var $El = $(this).attr('down_button',1);
$El.find('.file-opr a[menu="download_one"]').hide();
$El.find('.file-opr').prepend('快捷下载');
return false;
});
};
var herfv = 'li[rel="item"][file_type="1"][file_mode="9"]:not([paly_button="1"])';
$('body').on('mouseenter',herfv,function(){
var $El = $(this).attr('paly_button',1);
var cl = {'Dplayer':'Dp','Potplayer':'Pot','官方HTML5':'115play'}[G.get('player')];
$El.find('.name').addClass(cl).removeAttr('menu');
var txt0 = ['Pot','Dp'];
var txt1 = ['使用Potplayer播放视频','使用Dplayer播放视频'];
var txt2 = ['Pot播放','Dp播放'];
for (var i=0; i<2; i++){
$El.find('.file-opr').prepend(''+txt2[i]+'');
};
$El.not('.name').dblclick(function(){
var type = 'dblclick';
var pid1 = $El.attr('pick_code');
var video = {'pid':pid1};
palyData(video,type);
return false;
});
});
};
if(localHref.indexOf('https://captchaapi.115.com') != -1) {
window.focus();
toastr.info('验证成功本页面将自动关闭.');
$('#js_ver_code_box').find('[rel="verify"]').click(function () {
setTimeout(function(){
if($('[rel="error_box"]').attr('style').indexOf('none') != -1){
window.opener=null;
window.open('','_self');
window.close();
};
}, 500);
return false;
});
};
if(localHref.indexOf(/115\.com\/\?ct=play|v\.anxia\.com/) != null) {
$('.bar-side ul').prepend(`