115-优化

115网盘左侧栏优化,移除不常用功能,添加快捷导航

// ==UserScript==
// @name         115-优化
// @version      1.0.3
// @namespace    https://sleazyfork.org/zh-CN/users/1461640-%E6%98%9F%E5%AE%BF%E8%80%81%E9%AD%94
// @author       星宿老魔
// @description  115网盘左侧栏优化,移除不常用功能,添加快捷导航
// @match        *://115.com/*
// @match        *://life.115.com/*
// @exclude      *://115.com/web/lixian/master/video/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=115.com
// @license      MIT
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function(){"use strict";const e=[{id:"social",title:"社交",icon:"👥",href:"//115.com/home/",category:"original",
defaultEnabled:false},{id:"life",title:"生活",icon:"🏠",href:"//vip.115.com/?p=index_info_vip",category:"original",
defaultEnabled:false},{id:"create",title:"新建",icon:"➕",href:"javascript:;",category:"original",defaultEnabled:false},{
id:"clouddownload",title:"云下载",icon:"☁️",href:"//115.com/?tab=offline&mode=wangpan",dataNav:"offline",relTab:"offline",
tabBtn:"wangpan",modeTab:"offline",category:"quickIcon",defaultEnabled:true},{id:"upload",title:"最近上传",icon:"⬆️",
href:"//115.com/?tab=upload&mode=wangpan",dataNav:"upload",relTab:"upload",tabBtn:"wangpan",modeTab:"upload",
category:"quickIcon",defaultEnabled:true},{id:"receive",title:"最近接收",icon:"📥",
href:"//115.com/?tab=share_save_receive&mode=wangpan",dataNav:"share_save_receive",relTab:"share_save_receive",
tabBtn:"wangpan",modeTab:"share_save_receive",category:"quickIcon",defaultEnabled:true},{id:"star",title:"星标文件",
icon:"⭐",href:"//115.com/?tab=label&label_id=-1&show_label=1&mode=wangpan",dataNav:"star",relTab:"star",
tabBtn:"wangpan",modeData:"{tab:'label',label_id:-1,show_label:1}",category:"quickIcon",defaultEnabled:true},{id:"tags",
title:"文件标签",icon:"🏷️",href:"javascript:;",dataNav:"label",relTab:"label",tabBtn:"wangpan",category:"quickIcon",
defaultEnabled:true},{id:"recyclebin",title:"回收站",icon:"🗑️",href:"//115.com/?tab=rb&mode=wangpan",dataNav:"rb",
relTab:"rb",modeTab:"rb",tabBtn:"wangpan",category:"quickIcon",defaultEnabled:true},{id:"operations",title:"最近操作",
icon:"📊",href:"//life.115.com/lifetime?mode=lifeindex",dataNav:"lifeindex",relTab:"lifeindex",category:"quickIcon",
defaultEnabled:false},{id:"audio",title:"我听",icon:"🎵",href:"//115.com/?cid=0&offset=0&mode=wangpan",
category:"quickIcon",defaultEnabled:false},{id:"video",title:"我看",icon:"📺",
href:"//115.com/?cid=0&offset=0&mode=wangpan",category:"quickIcon",defaultEnabled:false},{id:"download",title:"已下本地",
icon:"💾",href:"javascript:;",dataNav:"download",relTab:"download",tabBtn:"wangpan",modeTab:"download",
category:"quickIcon",defaultEnabled:false},{id:"share",title:"链接分享",icon:"🔗",href:"//115.com/?mode=share_save",
dataNav:"share_save",relTab:"share_save",tabBtn:"share_save",category:"quickIcon",defaultEnabled:false},{
id:"familyshare",title:"家庭共享",icon:"👪",href:"//115.com/?mode=share_save",dataNav:"together_share",
relTab:"together_share",tabBtn:"share_save",modeTab:"together_share",category:"quickIcon",defaultEnabled:false},{
id:"chat",title:"我聊",icon:"💬",href:"javascript:;",category:"original",defaultEnabled:false},{id:"help",title:"帮助",
icon:"❓",href:"javascript:;",category:"original",defaultEnabled:false},{id:"client",title:"客户端",icon:"📱",
href:"javascript:;",category:"original",defaultEnabled:false}];const t={variables:{"--primary-color":"#2b85e4",
"--text-color":"#666","--hover-color":"#2b85e4","--icon-size":"24px","--spacing-sm":"5px","--spacing-md":"10px",
"--spacing-lg":"20px","--border-radius":"4px","--shadow":"0 2px 8px rgba(0,0,0,0.1)","--bg-overlay":"rgba(0,0,0,0.5)",
"--bg-panel":"#ffffff","--border-color":"#e0e0e0"},timeout:5e3};const n={leftSidebar:".container-leftside",
quickIconsContainer:"#js_sub_nav_scroller",navCeiling:".top-side .navigation-ceiling ul",quickIcons:".grid-item",
bottomSide:".bottom-side .navigation-ceiling ul",chatButton:"#js_left_notice"};const i={
enabledFunctions:"115_enabled_functions",settingsVersion:"115_settings_version"};class Config{static getFunctionItems(){
return[...e]}static getFunctionItem(t){return e.find(e=>e.id===t)}static getStyleConfig(){return t}
static getSelectors(){return n}static getStorageKeys(){return i}static getDefaultEnabledIds(){
return e.filter(e=>e.defaultEnabled).map(e=>e.id)}}class SettingsManager{constructor(){this.settingsVersion="1.0.0"
;this.enabledFunctionIds=new Set;this.loadSettings()}static getInstance(){
if(!SettingsManager.instance)SettingsManager.instance=new SettingsManager;return SettingsManager.instance}
loadSettings(){try{const e=localStorage.getItem(i.enabledFunctions);if(e){const t=JSON.parse(e);if(Array.isArray(t)){
this.enabledFunctionIds=new Set(t);console.log("已加载用户设置:",t);return}}}catch(e){console.warn("加载设置失败,使用默认设置:",e)}
this.enabledFunctionIds=new Set(Config.getDefaultEnabledIds());this.saveSettings()}saveSettings(){try{
const e=Array.from(this.enabledFunctionIds);localStorage.setItem(i.enabledFunctions,JSON.stringify(e))
;localStorage.setItem(i.settingsVersion,this.settingsVersion);console.log("设置已保存:",e)}catch(e){
console.error("保存设置失败:",e)}}isFunctionEnabled(e){return this.enabledFunctionIds.has(e)}enableFunction(e){
this.enabledFunctionIds.add(e);this.saveSettings()}disableFunction(e){this.enabledFunctionIds.delete(e)
;this.saveSettings()}toggleFunction(e){if(this.isFunctionEnabled(e)){this.disableFunction(e);return false}else{
this.enableFunction(e);return true}}getEnabledFunctionIds(){return Array.from(this.enabledFunctionIds)}
getEnabledFunctions(){const e=Config.getFunctionItems();return e.filter(e=>this.isFunctionEnabled(e.id))}
setFunctions(e){this.enabledFunctionIds=new Set(e);this.saveSettings()}resetToDefault(){
this.enabledFunctionIds=new Set(Config.getDefaultEnabledIds());this.saveSettings()}getSettingsInfo(){
const e=Config.getFunctionItems();const t=this.getEnabledFunctionIds();return{version:this.settingsVersion,
totalFunctions:e.length,enabledCount:t.length,disabledCount:e.length-t.length,quickIconEnabled:t.filter(e=>{
const t=Config.getFunctionItem(e);return"quickIcon"===t?.category}).length,originalEnabled:t.filter(e=>{
const t=Config.getFunctionItem(e);return"original"===t?.category}).length}}exportSettings(){const settings={
version:this.settingsVersion,timestamp:Date.now(),enabledFunctions:this.getEnabledFunctionIds()}
;return JSON.stringify(settings,null,2)}importSettings(e){try{const settings=JSON.parse(e)
;if(settings.enabledFunctions&&Array.isArray(settings.enabledFunctions)){this.setFunctions(settings.enabledFunctions)
;console.log("设置导入成功");return true}}catch(t){console.error("导入设置失败:",t)}return false}}function waitForElement(e,t=5e3){
return new Promise((n,i)=>{const a=document.querySelector(e);if(a){n(a);return}const observer=new MutationObserver(()=>{
const t=document.querySelector(e);if(t){observer.disconnect();n(t)}});observer.observe(document.body,{childList:true,
subtree:true});setTimeout(()=>{observer.disconnect();i(new Error(`Element ${e} not found within ${t}ms`))},t)})}
function createElement(e,t={},n){const i=document.createElement(e);Object.assign(i,t);if(n)i.textContent=n;return i}
class SettingsPanel{constructor(){this.panel=null;this.overlay=null;this.isOpen=false
;this.settingsManager=SettingsManager.getInstance()}createPanel(){this.overlay=createElement("div",{
className:"settings-overlay",onclick:e=>{if(e.target===this.overlay)this.close()}});const e=createElement("div",{
className:"settings-panel",onclick:e=>{e.stopPropagation()}});const t=this.createHeader();e.appendChild(t)
;const n=this.createContent();e.appendChild(n);const i=this.createFooter();e.appendChild(i);this.overlay.appendChild(e)
;return this.overlay}createHeader(){const e=createElement("div",{className:"panel-header"})
;const t=createElement("h3",{},"115优化设置");const n=createElement("button",{className:"close-btn",innerHTML:"×",
onclick:()=>this.close()});e.appendChild(t);e.appendChild(n);return e}createContent(){const e=createElement("div",{
className:"panel-content"});const t=this.createFunctionGroup("原始功能","original")
;const n=this.createFunctionGroup("快捷功能","quickIcon");e.appendChild(t);e.appendChild(n);return e}
createFunctionGroup(e,t){const n=createElement("div",{className:"function-group"});const i=createElement("h4",{
className:"group-title"},e);n.appendChild(i);const a=createElement("div",{className:"function-list"})
;const o=Config.getFunctionItems().filter(e=>e.category===t);o.forEach(e=>{const t=this.createFunctionItem(e)
;a.appendChild(t)});n.appendChild(a);return n}createFunctionItem(e){const t=createElement("div",{
className:"function-item"});const n=createElement("input",{type:"checkbox",id:`func-${e.id}`,
checked:this.settingsManager.isFunctionEnabled(e.id),onchange:t=>{const n=t.target
;this.settingsManager.toggleFunction(e.id);console.log(`${e.title} ${n.checked?"启用":"禁用"}`)
;window.dispatchEvent(new CustomEvent("115-settings-changed"))}});const i=createElement("label",{htmlFor:`func-${e.id}`,
className:"function-label"});const a=createElement("i",{className:"custom-icon"});a.textContent=e.icon
;const o=createElement("span",{},e.title);i.appendChild(a);i.appendChild(o);t.appendChild(n);t.appendChild(i);return t}
createFooter(){const e=createElement("div",{className:"panel-footer"});const t=createElement("button",{
className:"btn btn-secondary",innerHTML:"重置默认",onclick:()=>this.resetToDefault()});const n=createElement("button",{
className:"btn btn-primary",innerHTML:"应用设置",onclick:()=>this.applyAndClose()});e.appendChild(t);e.appendChild(n)
;return e}resetToDefault(){this.settingsManager.resetToDefault();this.refreshPanel()}applyAndClose(){
window.dispatchEvent(new CustomEvent("115-settings-changed"));this.close()}refreshPanel(){if(this.panel){
const e=this.panel.querySelectorAll('input[type="checkbox"]');e.forEach(e=>{const t=e;const n=t.id.replace("func-","")
;t.checked=this.settingsManager.isFunctionEnabled(n)})}}open(){if(this.isOpen)return;if(!this.panel){
this.panel=this.createPanel();document.body.appendChild(this.panel)}this.panel.style.display="block";this.isOpen=true
;this.injectStyles()}close(){if(!this.isOpen||!this.panel)return;this.panel.style.display="none";this.isOpen=false}
injectStyles(){const e="115-settings-panel-styles";if(document.getElementById(e))return;const n=createElement("style",{
id:e})
;n.textContent=`:root { ${Object.entries(t.variables).map(([e,t])=>`${e}: ${t}`).join("; ")}; } .settings-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: var(--bg-overlay); z-index: 10000; } .settings-panel { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: var(--bg-panel); border-radius: var(--border-radius); box-shadow: var(--shadow); width: 500px; max-height: 80vh; overflow: hidden; display: flex; flex-direction: column; } .panel-header { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-lg); border-bottom: 1px solid var(--border-color); } .panel-header h3 { margin: 0; color: var(--text-color); } .close-btn { background: none; border: none; font-size: 24px; cursor: pointer; color: var(--text-color); padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; } .close-btn:hover { color: var(--hover-color); } .panel-content { flex: 1; overflow-y: auto; padding: var(--spacing-lg); } .function-group { margin-bottom: var(--spacing-lg); } .group-title { margin: 0 0 var(--spacing-md) 0; color: var(--text-color); font-size: 16px; border-bottom: 1px solid var(--border-color); padding-bottom: var(--spacing-sm); } .function-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--spacing-md); } .function-item { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-sm); border: 1px solid var(--border-color); border-radius: var(--border-radius); } .function-item:hover { background: #f9f9f9; } .function-label { display: flex; align-items: center; gap: var(--spacing-sm); cursor: pointer; flex: 1; } .function-label i { font-size: var(--icon-size); color: var(--primary-color); } .panel-footer { display: flex; justify-content: flex-end; gap: var(--spacing-md); padding: var(--spacing-lg); border-top: 1px solid var(--border-color); } .btn { padding: var(--spacing-sm) var(--spacing-md); border: none; border-radius: var(--border-radius); cursor: pointer; font-size: 14px; } .btn-primary { background: var(--primary-color); color: white; } .btn-secondary { background: var(--border-color); color: var(--text-color); } .btn:hover { opacity: 0.8; }`.trim()
;document.head.appendChild(n)}}class SidebarManager{constructor(){this.isInitialized=false;this.settingsButton=null
;this.settingsManager=SettingsManager.getInstance();this.settingsPanel=new SettingsPanel}async init(){
if(this.isInitialized)return;try{await this.waitForElements();this.hideOriginalNavItems();this.createSettingsButton()
;this.renderEnabledFunctions();this.setupEventListeners();this.applyStyles();this.isInitialized=true
;console.log("115 左侧栏管理器初始化完成")}catch(e){console.error("左侧栏管理器初始化失败:",e)}}async waitForElements(){
await Promise.all([waitForElement(n.leftSidebar,t.timeout),waitForElement(n.bottomSide,t.timeout)])}
hideOriginalNavItems(){const e=document.querySelector(n.leftSidebar);if(e){
const t=e.querySelector('li[mode_btn="home"]');const n=e.querySelector('li[mode_btn="vip"]')
;const i=e.querySelector('li[mode_btn="add"]');if(t)t.style.display="none";if(n)n.style.display="none"
;if(i)i.style.display="none"}const t=document.querySelector(n.bottomSide);if(t){
const e=t.querySelector("#js_left_notice");const n=t.querySelector("#js_feedback_main")
;const i=t.querySelector('a[onclick*="CommonHeader.showClientDownLoad"]');if(e)e.parentElement.style.display="none"
;if(n)n.parentElement.style.display="none";if(i)i.parentElement.style.display="none"}
console.log("已隐藏原始左侧栏导航项和底部功能项,保持常用图标区域不变")}createSettingsButton(){const e=document.querySelector(n.bottomSide)
;if(!e)return;const t=createElement("li");const i=createElement("a",{href:"javascript:;",
className:"btn-ceiling settings-btn",innerHTML:'<i class="custom-settings-icon">⚙️</i><span>设置</span>',
onclick:()=>this.openSettings()});t.appendChild(i);e.appendChild(t);this.settingsButton=i;console.log("设置按钮已创建,位于底部最后")}
renderEnabledFunctions(){const e=document.querySelector(n.navCeiling);if(!e)return
;const t=e.querySelectorAll(".custom-nav-item");t.forEach(e=>e.remove())
;const i=this.settingsManager.getEnabledFunctions();i.sort((e,t)=>{
if(e.category!==t.category)return"original"===e.category?-1:1;return 0});i.forEach(t=>{const n=this.createNavItem(t)
;if(n)e.appendChild(n)});console.log(`已渲染 ${i.length} 个功能项`)}openSettings(){this.settingsPanel.open()}
handleOriginalNavClick(e){if(["social","life","create"].includes(e.id)){const t=document.querySelector(n.leftSidebar)
;if(!t)return;let i=null;switch(e.id){case"social":i=t.querySelector('li[mode_btn="home"] a');break;case"life":
i=t.querySelector('li[mode_btn="vip"] a');break;case"create":i=t.querySelector('li[mode_btn="add"] a');break}
if(i)i.click()}if(["chat","help","client"].includes(e.id)){const t=document.querySelector(n.bottomSide);if(!t)return
;let i=null;switch(e.id){case"chat":i=t.querySelector("#js_left_notice");break;case"help":
i=t.querySelector("#js_feedback_main");break;case"client":
i=t.querySelector('a[onclick*="CommonHeader.showClientDownLoad"]');break}if(i)i.click()}}setupEventListeners(){
window.addEventListener("115-settings-changed",()=>{this.renderEnabledFunctions();console.log("设置已变更,重新渲染左侧栏")})}
createNavItem(e){const t=createElement("li",{className:"custom-nav-item"});const n=createElement("a",{href:e.href,
target:e.target||""});if(e.dataNav)n.setAttribute("data-nav",e.dataNav);if(e.relTab)n.setAttribute("rel_tab",e.relTab)
;if(e.tabBtn)n.setAttribute("tab_btn",e.tabBtn);if(e.modeTab)n.setAttribute("mode-tab",e.modeTab)
;if(e.modeData)n.setAttribute("mode-data",e.modeData)
;n.innerHTML=`<i class="custom-icon">${e.icon}</i><span>${e.title}</span>`;this.addClickHandler(n,e);t.appendChild(n)
;return t}addClickHandler(e,t){e.addEventListener("click",e=>{if(t.dataNav){e.preventDefault()
;const i=document.querySelector(n.quickIconsContainer);if(i){const e=i.querySelector(`[data-nav="${t.dataNav}"]`);if(e){
e.click();return}}if(t.href&&"javascript:;"!==t.href)window.location.href=t.href;return}if("original"===t.category){
e.preventDefault();this.handleOriginalNavClick(t)}})}applyStyles(){const e="115-sidebar-styles"
;if(document.getElementById(e))return;const n=createElement("style",{id:e})
;n.textContent=`:root { ${Object.entries(t.variables).map(([e,t])=>`${e}: ${t}`).join("; ")}; } .top-side .navigation-ceiling ul { display: flex; flex-direction: column; align-items: center; } .top-side .navigation-ceiling ul li { width: 100%; text-align: center; margin-bottom: var(--spacing-md); } .top-side .navigation-ceiling ul li a { display: flex; flex-direction: column; align-items: center; text-decoration: none; color: var(--text-color); } .top-side .navigation-ceiling ul li a i { font-size: var(--icon-size) !important; margin-bottom: var(--spacing-sm); } .top-side .navigation-ceiling ul li:hover a, .top-side .navigation-ceiling ul li.current a { color: var(--hover-color); } .settings-btn { background: none !important; } .settings-btn:hover { background: rgba(43, 133, 228, 0.1) !important; } .custom-settings-icon, .custom-icon { font-size: 16px !important; font-style: normal !important; }`.trim()
;document.head.appendChild(n)}refresh(){this.renderEnabledFunctions()}destroy(){
if(this.settingsButton)this.settingsButton.remove();const e=document.getElementById("115-sidebar-styles")
;if(e)e.remove();this.isInitialized=false}}const a=class _ToolbarOptimizer{constructor(){this.observer=null
;this.modifiedUpload=false;this.modifiedNew=false;this.initObserver()}initObserver(){
this.observer=new MutationObserver(()=>{if(!this.modifiedUpload){
const e=document.querySelector('a.button[data-dropdown-tab="upload_btn_add_dir"]');if(e){this.replaceUploadButton(e)
;this.modifiedUpload=true}}if(!this.modifiedNew){
const e=document.querySelector('a.button[data-dropdown-tab="create_new_add_dir"]');if(e){this.replaceNewButton(e)
;this.modifiedNew=true}}if(this.modifiedUpload&&this.modifiedNew){this.observer?.disconnect()
;console.log("[115优化] 工具栏按钮全部替换完成,停止监听。")}});this.observer.observe(document.documentElement,{childList:true,subtree:true
});setTimeout(()=>{if(this.observer)this.observer.disconnect()},2e4)}replaceUploadButton(e){
const t=this.createCloudDownloadButton();e.parentElement?.replaceChild(t,e)
;this.removeDropdownMenu("upload_btn_add_dir");console.log("[115优化] “上传”按钮已替换为“添加云下载”。")}replaceNewButton(e){
const t=this.createNewFolderButton();e.parentElement?.replaceChild(t,e);this.removeDropdownMenu("create_new_add_dir")
;console.log("[115优化] “新建”按钮已替换为“新建文件夹”。")}createCloudDownloadButton(){const e=createElement("a",{href:"javascript:;",
className:"button btn-line"});e.setAttribute("menu","offline_task")
;e.innerHTML='<i class="custom-toolbar-icon">☁️</i><span>添加云下载</span>';Object.assign(e.style,{display:"inline-flex",
alignItems:"center",gap:"5px"});return e}createNewFolderButton(){const e=createElement("a",{href:"javascript:;",
className:"button btn-line"});e.setAttribute("menu","add_dir")
;e.innerHTML='<i class="custom-toolbar-icon">📁</i><span>新建文件夹</span>';Object.assign(e.style,{display:"inline-flex",
alignItems:"center",gap:"5px"});return e}removeDropdownMenu(e){
const t=document.querySelector(`div[data-dropdown-content="${e}"]`);if(t)t.remove()}static injectStyles(){
if(this.styleInjected)return;const e="115-toolbar-optimizer-styles";if(document.getElementById(e))return
;const t=`\n      .custom-toolbar-icon {\n        font-style: normal !important;\n        font-size: 16px !important;\n      }\n    `
;const n=createElement("style",{id:e});n.textContent=t;document.head.appendChild(n);this.styleInjected=true}}
;a.styleInjected=false;let o=a;class App{constructor(){this.sidebarManager=new SidebarManager
;this.settingsManager=SettingsManager.getInstance();o.injectStyles();new o}async init(){try{
console.log("115优化脚本开始初始化...");console.log("设置管理器已初始化");await this.sidebarManager.init();this.showStartupInfo()
;console.log("115优化脚本初始化完成 ✅")}catch(e){console.error("115优化脚本初始化失败:",e);this.showErrorInfo(e)}}showStartupInfo(){
const e=this.settingsManager.getSettingsInfo();console.log("📊 功能统计:",{"总功能数":e.totalFunctions,"已启用":e.enabledCount,
"快捷功能":e.quickIconEnabled,"原始功能":e.originalEnabled,"版本":e.version})}showErrorInfo(e){console.error("❌ 初始化失败:",e)}
refresh(){this.sidebarManager.refresh();console.log("应用已刷新")}getSettingsManager(){return this.settingsManager}
getSidebarManager(){return this.sidebarManager}exportSettings(){return this.settingsManager.exportSettings()}
importSettings(e){const t=this.settingsManager.importSettings(e);if(t)this.refresh();return t}destroy(){
this.sidebarManager.destroy();console.log("115优化脚本已销毁")}}const s=new App
;if("loading"===document.readyState)document.addEventListener("DOMContentLoaded",()=>s.init());else s.init()
;window.__115_optimizer__=s;window.__115_settings__={show:()=>s.getSidebarManager().openSettings?.(),
export:()=>s.exportSettings(),import:e=>s.importSettings(e),refresh:()=>s.refresh(),
info:()=>s.getSettingsManager().getSettingsInfo()};console.log("🎮 控制台命令可用:")
;console.log("  __115_settings__.show() - 打开设置面板");console.log("  __115_settings__.export() - 导出设置")
;console.log("  __115_settings__.import(json) - 导入设置");console.log("  __115_settings__.refresh() - 刷新界面")
;console.log("  __115_settings__.info() - 查看统计信息")})();