Greasy Fork

Greasy Fork is available in English.

冲浪助手

让web页面更加容易浏览、操作

目前为 2023-02-15 提交的版本,查看 最新版本

// ==UserScript==
// @name         冲浪助手
// @namespace    https://github.com/Shadow-blank/net-tools
// @version      0.1.4
// @description  让web页面更加容易浏览、操作
// @author       Shadow-blank
// @match        *://m.weibo.cn/status/*
// @match        *://www.comicat.org/*
// @match        *://*.comicat.net/*
// @match        *://dick.xfani.com/*
// @match        *://live.bilibili.com/*
// @match        *://www.bilibili.com/*
// @icon         https://raw.githubusercontent.com/Shadow-blank/net-tools/main/favicon.ico
// @require      https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js
// @grant        GM_registerMenuCommand
// @license      MIT
// ==/UserScript==

(function () {
  'use strict'
  // 创建style标签
  const createStyle = str => $('body').append(`<style>${str}</style>`)

  let data = null

  const module = {
    weibo: {
      name: '微博',
      checked: true,
      children: [
        {
          key: 'm.weibo.cn',
          name: '移动端页面自动跳转到PC页面 屏幕宽度小于980不跳转',
          checked: true,
          run() {
            if (window.screen.width > 980) {
              setTimeout(() => {
                const userId = document.querySelector('.m-img-box').href.split('/')[4]
                const id = location.pathname.split('/')[2]
                location.href = `https://weibo.com/${userId}/${id}`
              }, 500)
            }
          }
        }
      ]
    },
    comicat: {
      name: '漫猫',
      checked: true,
      children: [
        {
          key: 'comicat.net',
          name: '下载按钮位置上升',
          checked: true,
          run() {
            const downEle = document.querySelector('#box_download')
            downEle.parentElement.insertBefore(downEle, downEle.parentElement.firstElementChild)
          }
        }
      ]
    },
    xfani: {
      name: '稀饭',
      checked: true,
      children: [
        {
          key: 'dick.xfani.com',
          name: '取消右键限制',
          checked: true,
          run() {
            ['contextmenu', 'click', 'mousedown', 'mouseup', 'selectstart'].forEach(item => clearEvent(item))

            function clearEvent(type) {
              const onType = 'on' + type
              document[onType] = null
              document.body && (document.body[onType] = null)
            }
          }
        }
      ]
    },
    bilibili: {
      name: 'B站',
      checked: true,
      children: [
        {
          key: 'www.bilibili.com',
          name: '去除首页轮播图 只保留番剧和推荐',
          checked: true,
          run() {
            createStyle(`
          .bili-grid, .recommended-swipe, .eva-banner{display: none!important;}
          .bili-video-card.is-rcmd, .bili-grid:nth-child(9), .bili-grid:nth-child(1) {display: block!important;} `)
          }
        },
        {
          key: 'live.bilibili.com',
          name: '直播页面去掉广告 只显示直播',
          checked: true,
          run() {
            let timer = ''
            // 推广直播页面进入原始页面
            timer = setInterval(() => {
              const iframe = document.querySelector('#app iframe')
              if (iframe?.src.includes('/blanc/')) {
                clearInterval(timer)
                location.href = iframe.src.split('?')[0]
              }
            }, 100)
            // 将直播画面居中显示
            createStyle(`         
                      .live-room-app.p-relative{overflow: hidden}
                      .main {padding: 0px}
                      .player-ctnr.left-container.p-relative.z-player-ctnr{ width: 100%;  margin: 10px auto}
                      #iframe-popup-area{ display: none}
                      section{margin: 0}`)
          }
        }
      ]
    }
  }

  // 初始化控制面板
  const controlPanel = {
    status: 0, //0 不存在 1存在
    show() {
      $('#control-panel').css('display', 'block')
    },
    hidden() {
      $('#control-panel').css('display', 'none')
    },
    save() {

    }
  }

  // GM_registerMenuCommand('控制面板', initControlPanel)

  const initData = () => {
    let value = JSON.parse(localStorage.getItem('netToolsData'))
    if (!value) {
      value = {
        checked: getDefaultCheckValue()
      }
    }
    data = value

    function getDefaultCheckValue() {
      const result = []
      for (const key in module) {
        result.push({
          name: module[key].name,
          key,
          checked: module[key].checked,
          children: module[key].children.map(item => ({name: item.name, key: item.key, checked: item.checked}))
        })
      }
      return result
    }
  }

  function initModule() {
    const host = location.host

    for (const key in module) {
      const {checked, children} = module[key]
      if (host.includes(key)) {
        if (!checked) {
          return
        } else {
          const childrenModule = children.find(item => host.includes(item.key) && item.checked)
          return childrenModule && childrenModule.run()
        }
      }
    }
  }

  function initControlPanel() {
    const control = createControlPanel()


    const style = `
      <style>
        #control-panel{ 
          display: none;
          padding: 10px; 
          position: fixed; 
          top: 50%;
          left: 50%;
          background: white;
          transform: translate(-50%, -50%);
          z-index: 99999;
          box-shadow: 0px 0px 12px rgba(0, 0, 0, .12);
          border-radius: 4px;
          color: #606266
        }
        .control-panel-save{
          cursor: pointer;
          margin-top: 20px;
          float: right;
        }
        .control-panel-close{
          cursor: pointer;
          float: right;
        }
      </style>`
    $('body').append(control).append(style)

    $('.control-panel-close').click(controlPanel.hidden)
    $('.control-panel-save').click(controlPanel.save)
    controlPanel.status = 1
    controlPanel.show()

    function createControlPanel() {
      const menu = []
      for (const key in module) {
        menu.push({
          name: module[key].name,
          key: key,
          children: module[key].children.map(item => ({name: item.name, key: item.key}))
        })
      }

      return (`
        <div id="control-panel">
           <div class="control-panel-close"> X </div>
        ${createSelect()}
           <div class="control-panel-save">保存</div>
        </div>
      `)
    }

    function createSelect() {
      return data.checked.map(item =>
        `<div>
          ${getCheck(item.name, 0)}
          </br>
          ${item.children.map(item => getCheck(item.name, 1)).join('')}
       </div>`
      ).join('')
    }

    function getCheck(str, level) {
      return `
        <label class="el-checkbox is-checked" style="padding-left: ${18 * level}px;">
          <span class="el-checkbox__input is-checked">
            <input class="el-checkbox__original" type="checkbox">
            <span class="el-checkbox__inner"></span>
          </span>
          <span class="el-checkbox__label">${str}</span>
        </label>
      `
    }
  }

  ;(function () {
    initData()
    initModule()
  })()
})()