// ==UserScript==
// @name 天翼云盘助手
// @description 天翼云盘大文件免客户端下载、文件夹打包下载,支持2021年6月份改版后的天翼云盘。
// @version 2.1.13
// @namespace TyCloud_Tools
// @icon https://z3.ax1x.com/2021/05/31/2m1BTA.png
// @author 邓小明
// @include *//cloud.189.cn/*
// @require https://cdn.bootcdn.net/ajax/libs/jquery/2.1.4/jquery.min.js
// @run-at document-start
// @grant unsafeWindow
// @grant GM_setClipboard
// @grant GM_log
// @downloadURL https://update.greasyfork.icu/scripts/427633/%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98%E5%8A%A9%E6%89%8B.user.js
// @updateURL https://update.greasyfork.icu/scripts/427633/%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98%E5%8A%A9%E6%89%8B.meta.js
// ==/UserScript==
(function () {
'use strict';
$(document).ready(function () {
init();
});
})();
function init() {
var append_html = `
`;
$('body').append(append_html);
$('.M_show_file_list').hide();
$('.M_show_file_list_btn').on('click', function () {
$('.M_show_file_list_btn').fadeOut();
$('.M_show_file_list').fadeIn();
});
$('.M_show_file_list .M_dialog__close').on('click', function () {
$('.M_show_file_list_btn').fadeIn();
$('.M_show_file_list').fadeOut();
$('.M_file_direct_link').empty();
});
if (window.location.href.indexOf('web/share') > -1) {
request('/api/open/share/getShareInfoByCode.action', {
shareCode: getQueryVariable('code'),
noCache: Math.random()
}, 'get', res => {
console.log('getShareInfoByCode', res);
M_share_id = res.shareId;
});
}
}
var M_share_id = '';
var M_folder_id = 0;
var M_folder_name = '';
var M_is_login = 0;
(function(open) {
unsafeWindow.XMLHttpRequest.prototype.open = function() {
this.addEventListener('load', fun => {
var res = fun.currentTarget;
if (res.status == 200 && res.response) {
var url = res.responseURL;
let json = fun.currentTarget.response;
if(typeof(json) == 'string'){
json = JSON.parse($.trim(json));
}
if (url.indexOf('file/listFiles.action') > -1) {
//console.log('文件列表', json);
if (json.res_code == 0) {
M_folder_id = (/folderId=([-0-9]+)/.exec(url))[1];
show_file_list(json.fileListAO);
}
} else if (url.indexOf('getUserBriefInfo.action') > -1) {
if(json.sessionKey){
setCookie('sessionKey', json.sessionKey);
}
} else if (url.indexOf('portal/listFiles.action') > -1) {
//只有进入页面时会加载
M_folder_name = json.path[json.path.length - 1].fileName;
} else if (url.indexOf('user/getUserInfoForPortal.action') > -1) {
//console.log('是否登录', json);
if(json.loginName){
M_is_login = 1;
}
} else if (url.indexOf('share/listShareDir.action') > -1) {
//console.log('分享列表', json);
$('.tips-save-box').fadeOut();
if (json.res_code == 0) {
M_folder_id = (/shareId=([-0-9]+)/.exec(url))[1];
show_file_list(json.fileListAO);
}
} else if (url.indexOf('share/getShareInfoByCode.action') > -1) {
if(json.shareId){
M_share_id = json.shareId;
} else {
M_share_id = '';
}
if(json.isFolder == false && json.fileSize >= 1024*1024*1024){
var file_id = json.fileId;
var one_download_btn = $('.file-operate>.btn-download:eq(0)');
GM_log('getShareInfoByCode', json);
var new_one_download_btn = one_download_btn.clone().attr('title', '直链下载').off('click').on('click', function (e) {
get_file_download_url(file_id, M_share_id);
});
GM_log('new_one_download_btn', new_one_download_btn);
one_download_btn.replaceWith(new_one_download_btn);
}
} else if (url.indexOf('getFileDownloadUrl.action') > -1) {
//console.log('文件下载', json);
} else {
}
}
});
return open.apply(this, [].slice.call(arguments));
};
})(unsafeWindow.XMLHttpRequest.prototype.open);
function show_file_list(data) {
$('.M_folder_list').empty();
if (data.count > 0 || data.fileListSize > 0) {
$('.M_show_file_list_btn').fadeIn();
$.each(data.folderList, function (index, item) {
$('.M_folder_list').append('' + item.name + '' + (item.id > 0 ? '' : '') + '');
var file_list_item = $('.file-list-ul .c-file-item[data-fileid=' + item.id + ']');
var isFolder = $(this).parents('.c-file-item').data('isFolder');
/* 替换打开客户端下载按钮 */
var download_btn = file_list_item.find('.file-item-ope-item-download');
var new_download_btn = download_btn.clone().attr('title', '直链下载').off('click').on('click', function (e) {
var file_id = $(this).parents('.c-file-item').data('fileid');
var file_name = $.trim($(this).parents('.c-file-item').find('.file-item-name-fileName').text());
get_folder_download_url(file_id, M_share_id, file_name);
});
download_btn.replaceWith(new_download_btn);
});
$.each(data.fileList, function (index, item) {
$('.M_folder_list').append('' + item.name + ' ' + conver(item.size) + '');
var file_list_item = $('.file-list-ul .c-file-item[data-fileid=' + item.id + ']');
/* 点击文件名下载 */
file_list_item.find('.file-item-name-fileName-span').attr('title', '点击下载').off('click').on('click', function (e) {
var file_id = $(this).parents('.c-file-item').data('fileid');
get_file_download_url(file_id, M_share_id);
});
if(item.size >= 1024*1024*1024){
/* 替换打开客户端下载按钮 */
var download_btn = file_list_item.find('.file-item-ope-item-download');
var new_download_btn = download_btn.clone().attr('title', '直链下载').off('click').on('click', function (e) {
var file_id = $(this).parents('.c-file-item').data('fileid');
get_file_download_url(file_id, M_share_id);
});
download_btn.replaceWith(new_download_btn);
}
});
$('.M_show_folder span').off('click').on('click', function (e) {
$('.M_folder_list li').fadeOut();
$('.M_file_direct_link').empty();
$('.file-list-ul .c-file-item[data-fileid=' + $(this).parent().data('id') + '] .file-item-name').trigger('click');
$('.file-list-ul .c-file-item[data-fileid=' + $(this).parent().data('id') + '] .file-item-name-fileName-span').trigger('click');
});
$('.M_show_file').off('click').on('click', function (e) {
$('.M_file_direct_link').empty();
get_file_download_url($(this).data('id'), M_share_id, 1);
});
if(M_folder_id == -11){
$('.M_folder_download').hide();
} else {
$('.M_folder_download').show();
$('.M_folder_download').off('click').on('click', function () {
get_folder_download_url(M_folder_id, M_share_id);
});
}
$('.M_folder_down').off('click').on('click', function () {
get_folder_download_url($(this).parent().data('id'), M_share_id);
});
/* 选择文件或文件夹 */
$('.file-item-check').off('click').on('click', function () {
var check_count = $('.file-item-check[value="true"]').size();
var button_normal_btn = $('.button-group>.button-normal:eq(1)');
button_normal_btn.removeClass('disable');
var new_button_normal_btn = button_normal_btn.clone().off('click').on('click', function (e) {
if(check_count == 1){
$('.file-item-check[value="true"]').next().find('.file-item-ope-item-download').trigger('click');
$('.file-item-check[value="true"]').next().find('.file-item-name-fileName-span').trigger('click');
} else if(check_count > 1){
var file_id_array = [];
$.each($('.file-item-check[value="true"]'), function (index, item) {
file_id_array.push($(this).parents('.c-file-item').data('fileid'));
});
get_folder_download_url(file_id_array.join(','), M_share_id);
} else {}
});
button_normal_btn.replaceWith(new_button_normal_btn);
});
$('.c-file-list .ant-checkbox').off('click').on('click', function () {
if($(this).hasClass('ant-checkbox-checked')){
var button_normal_btn = $('.button-group>.button-normal:eq(1)');
button_normal_btn.removeClass('disable');
var new_button_normal_btn = button_normal_btn.clone().off('click').on('click', function (e) {
get_folder_download_url(M_folder_id, M_share_id);
});
button_normal_btn.replaceWith(new_button_normal_btn);
}
});
} else {
$('.M_show_file_list_btn').fadeOut();
$('.M_folder_list').append('当前文件夹为空');
}
setTimeout(() => {
$('.c-file-list>div:first>div:first>div:first>span').size() > 1 ? $('.M_back_parent').show() : $('.M_back_parent').hide();
$('.M_folder_download').attr('title', '打包下载文件夹 : ' + $('.c-file-list>div:first>div:first>div:first>span:last').text());
}, 10);
$('.M_back_parent').off('click').on('click', function (e) {
$('.M_folder_list li').fadeOut();
$('.M_file_direct_link').empty();
$('.c-file-list span:eq(0)').trigger('click');
});
if(M_is_login == 0){
request('/api/open/user/getUserInfoForPortal.action', {}, 'get', res => {
if(res.loginName){
M_is_login = 1;
}
});
}
}
function get_file_download_url(fileid, shareid = '', show_link = 0) {
if(M_is_login == 0){
toast('请登陆后操作');
return false;
}
toast('天翼云盘助手 优化下载');
request('/api/open/file/getFileDownloadUrl.action', {
fileId: fileid,
dt: 1,
shareId: shareid
}, 'get', res => {
var fileName = $.trim($('.file-list-ul .c-file-item[data-fileid=' + fileid + '] .file-item-name-fileName-span').text());
var fileDownloadUrl = res.fileDownloadUrl + '&fileName=' + encodeURIComponent(fileName);
if(show_link == 1){
$('.M_file_direct_link').html('直链网址:' + fileDownloadUrl + '');
}
download_url(fileDownloadUrl);
});
}
function get_folder_download_url(folderid, shareid = '', filename) {
if(M_is_login == 0){
toast('请登陆后操作');
return false;
}
toast('天翼云盘助手 优化下载');
var sessionKey = getCookie('sessionKey');
var file_download_url = '/downloadMultiFiles.action?sessionKey=' + sessionKey + '&fileIdS=' + folderid + '&downloadType=' + (shareid ? 3 : 1) + '&shareId=' + shareid + (filename ? '&filename=' + encodeURIComponent(filename) + '.zip' : '');
download_url(file_download_url);
}
function download_url(url) {
var element = document.createElement('iframe');
var iframe_id = 'M_iframe_' + (Math.random().toString().replace('0.', ''));
element.setAttribute('src', url);
element.setAttribute('id', iframe_id);
element.style.display = 'none';
document.body.appendChild(element);
setTimeout('document.body.removeChild(document.getElementById("' + iframe_id + '"))', 10000);
}
function download_text(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function request(url, data, type = 'get', success, error = () => {}) {
$.ajax({
url: url,
data: data,
type: type,
success: success,
error: error,
headers: {
Accept: 'application/json;charset=UTF-8'
},
dataType: 'json',
});
}
function toast(text, time = 1) {
$('.M_toast span').text(text);
$('.M_toast').show().stop().delay(time * 1000).fadeOut();
}
function conver(limit) {
var size = '';
if (limit < 0.1 * 1024) {
size = limit.toFixed(2) + 'B';
} else if (limit < 0.1 * 1024 * 1024) {
size = (limit / 1024).toFixed(2) + 'KB';
} else if (limit < 0.1 * 1024 * 1024 * 1024) {
size = (limit / (1024 * 1024)).toFixed(2) + 'MB';
} else {
size = (limit / (1024 * 1024 * 1024)).toFixed(2) + 'GB';
}
var sizestr = size + '';
var len = sizestr.indexOf('\.');
var dec = sizestr.substr(len + 1, 2);
if (dec == '00') {
return sizestr.substring(0, len) + sizestr.substr(len + 3, 2);
}
return sizestr;
}
function setCookie(name, value) {
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString();
}
function getCookie(name) {
var strcookie = document.cookie;
var arrcookie = strcookie.split('; ');
for (var i = 0; i < arrcookie.length; i++) {
var arr = arrcookie[i].split('=');
if (arr[0] == name) {
return arr[1];
}
}
return '';
}
function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if(cval != null) {
document.cookie= name + '=' + cval + ';expires=' + exp.toGMTString();
}
}
function getQueryVariable(variable){
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i