thz-helper

thz论坛 98堂论坛

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         thz-helper
// @description  thz论坛 98堂论坛
// @namespace    http://tampermonkey.net/
// @version      1.0.5
// @author       paso
// @match        http://96thz.cc/*
// @match        http://97thz.cc/*
// @match        http://98thz.cc/*
// @match        http://thzb.cc/*
// @match        http://thzv.cc/*
// @match        https://wpzo.app/*
// @match        *://www.example.net/*
// @require      https://greasyfork.org/scripts/473442-cross-origin-storage/code/cross-origin-storage.js?version=1237609
// @require      https://greasyfork.org/scripts/473443-popup-inject/code/popup-inject.js?version=1237616
// @grant        none
// @license      MIT
// ==/UserScript==

;(function () {
  'use strict'
  // Your code here...
  // http://96thz.cc/forum.php?mod=forumdisplay&fid=181&filter=typeid&typeid=36&orderby=heats&page=2

  const namespace = 'paso-thz-helper'
  const middlewareHost = 'www.example.net'
  if (window.location.hostname === middlewareHost) {
    window.paso.crossOriginStorage.startStorageServer()
  } else {
    handleTarget(window.location.protocol + '//' + middlewareHost)
  }

  function handleTarget(server) {
    const CONTEXT = { env: 'prod' }
    const storage = window.paso.crossOriginStorage.createStorageClient(server)
    const querySearch = resolveQuerySearch()
    const instance = getInstance({ querySearch })
    if (!instance) {
      console.error('No instance matched!')
      return
    }
    const storageKey = `${namespace}-${instance.name}`

    const POPUP_INJECT_CONFIG = {
      namespace,
      actionName: 'Settings',
      collapse: '70%',
      location: '35%',
      content: `<div id="${namespace}-app"></div>`,
      style: `
  <style>
  .${namespace} * {
      font-size: 14px;
      color: black;
  }
  .${namespace} .table {
      display: table;
      border-collapse: separate;
      border-spacing: 4px 4px;
  }
  .${namespace} .table-row {
      display: table-row;
  }
  .${namespace} .table-cell {
      display: table-cell;
  }
  .${namespace} .text-right {
      text-align: right;
  }
  .${namespace} .flex.gap-8 {
      gap: 8px;
  }
  </style>`
    }

    const VUE_COMPONENT_PARAM_SELECT = {
      template: `
  <label class="table-row">
      <div class="table-cell text-right">{{title}}</div>
      <div class="table-cell">
          <div class="flex">
            <input class="input monospace" v-if="!hideInput" v-model.trim="inputValue" />
            <select class="input" v-if="!!options" v-model="inputValue">
                <option v-for="o in options" :value="o.value">{{o.label}}</option>
            </select>
          </div>
      </div>
  </label>`,
      props: ['title', 'value', 'options', 'hideInput'],
      emits: ['update:value'],
      computed: {
        inputValue: {
          get() {
            return this.$props.value
          },
          set(v) {
            this.$emit('update:value', v)
          }
        }
      }
    }

    const VUE_APP_CONFIG = {
      template: `
  <div class="flex col gap-8">
      <div class="table">
          <SelectFormItem title="执行时机" v-model:value="executeSelector" />
          <SelectFormItem title="path" v-model:value="path" />
          <SelectFormItem title="板块" v-model:value="params.fid" :options="forms.fidOptions" />
          <SelectFormItem title="筛选" v-model:value="params.filter" :options="forms.filterOptions" :hideInput="true" />
          <SelectFormItem title="系列" v-if="params.filter === 'typeid'" v-model:value="params.typeid" :options="forms.typeidOptions[params.fid]" />
          <SelectFormItem title="排序" v-model:value="params.orderby" :options="forms.orderbyOptions" :hideInput="true" />
          <SelectFormItem title="搜索" v-model:value="search" />
      </div>
      <button class="button" @click="apply">应用</button>
  </div>`,
      components: {
        SelectFormItem: VUE_COMPONENT_PARAM_SELECT
      },
      data() {
        return {
          ...instance.getDefaultData(),
          forms: Object.freeze(instance.getFormsData())
        }
      },
      computed: {},
      methods: {
        apply() {
          storage
            .setItem(storageKey, {
              executeSelector: this.executeSelector,
              path: this.path,
              params: {
                ...this.params
              },
              search: this.search
            })
            .then(() => (window.location = getPageLocation(this.path, this.params, querySearch.page || '1')))
        }
      },
      mounted() {
        storage
          .getItem(storageKey)
          .then((resp) => JSON.parse(resp.data || ''))
          .catch(() => instance.getDefaultData())
          .then((data) => {
            this.executeSelector = data.executeSelector
            this.path = data.path
            this.params.fid = data.params.fid
            this.params.filter = data.params.filter
            this.params.typeid = data.params.typeid
            this.params.orderby = data.params.orderby
            this.search = data.search
          })
      }
    }

    loadJS('https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/3.2.31/vue.global.prod.min.js')
      .then(() => window.paso.injectPopup(POPUP_INJECT_CONFIG))
      .then(() => window.Vue.createApp(VUE_APP_CONFIG).mount(`#${namespace}-app`))

    storage
      .getItem(storageKey)
      .then((resp) => JSON.parse(resp.data || ''))
      .catch(() => instance.getDefaultData())
      .then((data) =>
        ready(data.executeSelector)
          .then(() => handlePageContent(data))
          .catch((e) => {
            console.warn(e)
          })
      )

    function handlePageContent(data) {
      const pageMode = instance.getPageMode()
      // 隐藏广告
      instance.getNeedToHideElements(pageMode)?.forEach((el) => {
        el.setAttribute('style', 'display: none !important;')
      })

      switch (pageMode) {
        case 'forumdisplay':
          instance.handlePostList(data)
          break
        case 'viewthread':
          instance.handlePostContent()
          break
      }
    }

    if (CONTEXT.env === 'dev') {
      window._$_getCategory = function () {
        const arr = []
        document.querySelectorAll('.bm_c .fl_g dt a')?.forEach((a) => {
          const item = {}
          if (a.firstChild && a.firstChild instanceof Text) {
            item.label = a.firstChild.wholeText
          }
          if (a.href) {
            item.value = getStartInt(a.href)
          }
          arr.push(item)
        })
        console.log(arr)
        console.log(JSON.stringify(arr))
      }
      window._$_getTypes = function () {
        const arr = []
        document.querySelectorAll('ul#thread_types > li > a')?.forEach((a) => {
          const item = { value: '' }
          if (a.firstChild && a.firstChild instanceof Text) {
            item.label = a.firstChild.wholeText
          }
          if (a.href) {
            const i = a.href.indexOf('?')
            if (i >= 0) {
              const qs = resolveQuerySearch(a.href.substring(i))
              item.value = qs.typeid || ''
            }
          }
          arr.push(item)
        })
        if (!arr.length) arr.push({ value: '', label: '全部' })
        console.log(arr)
        console.log(JSON.stringify(arr))
      }
    }
  }

  function resolveQuerySearch(search) {
    const result = {}
    search = search || window.location.search
    if (search) {
      if (search.startsWith('?')) {
        search = search.substring(1)
      }
      search
        .split('&')
        .map((entry) => {
          return entry.split('=')
        })
        .forEach((entry) => {
          result[entry[0]] = entry[1]
        })
    }
    return result
  }

  function loadJS(src) {
    return new Promise((resolve) => {
      const script = document.createElement('script')
      script.src = src
      script.onload = resolve
      document.head.append(script)
    })
  }

  function ready(selector, interval = 300, timeout = 3000) {
    return new Promise((resolve, reject) => {
      const loopId = setInterval(
        (startTime) => {
          if (document.querySelector(selector)) {
            clearInterval(loopId)
            resolve()
          } else {
            if (Date.now() - startTime > timeout) {
              clearInterval(loopId)
              reject(`look up for target '${selector}' timeout: ${timeout}ms`)
            }
          }
        },
        interval,
        Date.now()
      )
    })
  }

  function getStartInt(str) {
    let result = ''
    if (str) {
      for (let i = 0; i < str.length; i++) {
        if (isNaN(parseInt(str[i]))) {
          if (result) break
        } else {
          result += str[i]
        }
      }
    }
    return parseInt(result)
  }

  function getEndInt(str) {
    let result = ''
    if (str) {
      for (let i = str.length - 1; i >= 0; i--) {
        if (isNaN(parseInt(str[i]))) {
          if (result) break
        } else {
          result = str[i] + result
        }
      }
    }
    return parseInt(result)
  }

  function getPageLocation(path, p, num) {
    const params = {
      mod: 'forumdisplay',
      fid: p.fid || '',
      filter: p.filter || '',
      typeid: p.typeid || '',
      orderby: p.orderby || '',
      page: num
    }
    const paramStr =
      '?' +
      Object.entries(params)
        .map((entry) => {
          return `${entry[0]}=${entry[1]}`
        })
        .join('&')
    return path + paramStr
  }

  function getInstance(arg) {
    const { querySearch } = arg

    const getPageMode = () => {
      const path = window.location.pathname
      if (path === '/forum.php') return querySearch.mod || 'index'
      if (path.includes('forum')) return 'forumdisplay'
      if (path.includes('thread')) return 'viewthread'
      return 'index'
    }
    const handlePostList = (data) => {
      const { path, params, search } = data
      // 替换分页
      document.querySelectorAll('#fd_page_bottom > .pg, #fd_page_top > .pg')?.forEach((pw) => {
        const strong = pw.querySelector('strong')
        let currentPage = 1
        if (strong) {
          currentPage = getStartInt(strong.innerText)
        }
        pw.querySelectorAll('a[href]')?.forEach((page) => {
          const pageNum = getEndInt(page.innerText)
          if (isNaN(pageNum)) {
            if (page.classList.contains('prev')) {
              page.href = getPageLocation(path, params, currentPage - 1)
            } else if (page.classList.contains('nxt')) {
              page.href = getPageLocation(path, params, currentPage + 1)
            }
          } else {
            page.href = getPageLocation(path, params, pageNum)
          }
        })
        const pageInput = pw.querySelector('input[name=custompage]')
        if (pageInput) {
          pageInput.onkeydown = function (event) {
            if (event.keyCode === 13) {
              window.location = getPageLocation(path, params, this.value)
              window.doane?.(event)
            }
          }
        }
      })
      // 过滤结果
      const notMatch = []
      const match = (t) => {
        return t && t.indexOf && t.indexOf(search) >= 0
      }
      document.querySelectorAll('#threadlisttableid > tbody')?.forEach((item) => {
        if (!match(item.querySelector('a.s.xst')?.innerText)) {
          notMatch.push(item)
        }
      })
      const setFilter = (filter) => {
        notMatch.forEach((item) => {
          if (filter) {
            item.setAttribute('style', 'display: none !important;')
          } else {
            item.removeAttribute('style')
          }
        })
      }
      // 增加过滤按钮
      const tf = document.querySelector('#threadlist .tf')
      if (tf) {
        let filterCB = tf.querySelector(`label input.${namespace}`)
        if (!filterCB) {
          filterCB = document.createElement('input')
          filterCB.classList.add(namespace)
          filterCB.type = 'checkbox'
          const label = document.createElement('label')
          label.append(filterCB, document.createTextNode('只看搜索结果'))
          tf.append(document.createTextNode('\xA0'), label)
        }
        filterCB.checked = !!search
        if (search) setFilter(true)
        filterCB.onchange = (e) => setFilter(e.target.checked)
      }
    }
    const addHideFloorCheckbox = () => {
      // 添加隐藏楼层按钮
      const pt = document.querySelector('#pt')
      if (pt) {
        let hideCB = pt.querySelector(`label input.${namespace}`)
        if (!hideCB) {
          hideCB = document.createElement('input')
          hideCB.classList.add(namespace)
          hideCB.type = 'checkbox'
          const label = document.createElement('label')
          label.append(hideCB, document.createTextNode('隐藏其他楼层'))
          pt.append(document.createTextNode('\xA0'), label)
        }
        const otherReply = []
        document.querySelectorAll('#postlist > div[id]')?.forEach((div) => {
          otherReply.push(div)
        })
        if (otherReply.length) otherReply.shift()
        const hideOther = (h) => {
          otherReply.forEach((div) => {
            if (h) {
              div.setAttribute('style', 'display: none !important;')
            } else {
              div.removeAttribute('style')
            }
          })
        }
        hideCB.checked = true
        hideOther(true)
        hideCB.onchange = (e) => hideOther(e.target.checked)
      }
    }

    if (window.location.hostname.includes('thz')) {
      return {
        name: 'thz',
        getDefaultData() {
          return {
            executeSelector: '#discuz_tips',
            path: '/forum.php',
            params: {
              fid: '181',
              filter: 'typeid',
              typeid: '',
              orderby: 'heats'
            },
            search: ''
          }
        },
        getFormsData() {
          return {
            fidOptions: [
              { value: '181', label: '亚洲無碼原創' },
              { value: '220', label: '亚洲有碼原創' },
              { value: '182', label: '欧美無碼' },
              { value: '69', label: '国内原创(BT)' },
              { value: '203', label: '各类合集资源' },
              { value: '177', label: '蓝光高清原盘' },
              { value: '39', label: '日韩情色(BT)' },
              { value: '40', label: '西方美人(BT)' },
              { value: '60', label: '国产专栏(BT)' },
              { value: '58', label: '三级伦理(BT)' },
              { value: '41', label: '动漫精品(BT)' },
              { value: '63', label: '精美套图(BT)' },
              { value: '79', label: '桃花原創發片預告' },
              { value: '172', label: '桃花原創合集(BT)' },
              { value: '73', label: '三级*未分级(BT)' },
              { value: '137', label: '美圖寫真(BT)' },
              { value: '196', label: '热门电影(BT)' }
            ],
            filterOptions: [{ value: 'typeid', label: '系列' }],
            typeidOptions: {
              181: [
                { value: '', label: '全部' },
                { value: '664', label: 'FC2PPV' },
                { value: '33', label: '美女步兵' },
                { value: '35', label: '一本道系' },
                { value: '36', label: '加勒比系' },
                { value: '64', label: '1919go' },
                { value: '39', label: '10musu' },
                { value: '47', label: '性孽變態' },
                { value: '53', label: '素人系列' },
                { value: '37', label: '东京热系' },
                { value: '38', label: 'HEYZO' },
                { value: '116', label: 'MuraTV' },
                { value: '67', label: 'HeYPPV' },
                { value: '50', label: '仟人斬系' },
                { value: '51', label: '金髪天國' },
                { value: '52', label: '盜撮系列' },
                { value: '49', label: 'ガチん娘' },
                { value: '40', label: '人妻熟女' },
                { value: '319', label: 'pacoma' },
                { value: '195', label: '無毛宣言' },
                { value: '194', label: 'メス豚系' },
                { value: '226', label: 'RealDiva' },
                { value: '114', label: 'XXX-AV' },
                { value: '196', label: '誘惑天国' },
                { value: '198', label: '经典稀缺' },
                { value: '200', label: '問答無用' },
                { value: '44', label: 'JavHD' },
                { value: '321', label: 'h4610系' },
                { value: '322', label: '素人妻系' },
                { value: '320', label: '人妻斬系' },
                { value: '501', label: 'AV志向系' },
                { value: '616', label: '店長推薦' },
                { value: '731', label: '本生素人' },
                { value: '48', label: '3D影畫' },
                { value: '523', label: 'H:G:M:O' },
                { value: '222', label: '写真专辑' },
                { value: '768', label: '无码流出' },
                { value: '770', label: '麻豆传媒' }
              ],
              220: [
                { value: '', label: '全部' },
                { value: '91', label: '高清騎兵' },
                { value: '92', label: '美女騎兵' },
                { value: '109', label: '美素人系' },
                { value: '110', label: '剧情系列' },
                { value: '221', label: '无损原盘' }
              ],
              182: [
                { value: '', label: '全部' },
                { value: '41', label: 'x-Art' },
                { value: '42', label: 'Wow' },
                { value: '43', label: 'bangbros' },
                { value: '45', label: 'brazzers' },
                { value: '120', label: 'naughtyamerica' },
                { value: '122', label: 'babes' },
                { value: '46', label: 'realitykings' },
                { value: '115', label: 'DDF' },
                { value: '111', label: '按摩师系' },
                { value: '214', label: 'twistys' },
                { value: '121', label: 'nubilefilms' },
                { value: '197', label: 'hegre-art' },
                { value: '227', label: 'wicked' },
                { value: '150', label: 'BDSM' },
                { value: '216', label: '邪惡天使' },
                { value: '219', label: 'vixen' },
                { value: '220', label: 'passion-hd' },
                { value: '223', label: '18yoga' },
                { value: '224', label: 'private' },
                { value: '193', label: 'joymii' },
                { value: '201', label: '21members' },
                { value: '202', label: 'colette' },
                { value: '213', label: 'mofos' },
                { value: '215', label: 'nubiles' },
                { value: '217', label: 'blacked' },
                { value: '225', label: 'sexart' },
                { value: '199', label: 'Femjoy' },
                { value: '228', label: 'digitalplayground' },
                { value: '496', label: '18xgirls' },
                { value: '497', label: 'teamskeet' },
                { value: '498', label: 'sexyhub' },
                { value: '499', label: 'fakehub' },
                { value: '500', label: 'realitygang' },
                { value: '218', label: 'julesjordan' },
                { value: '513', label: 'TUSHY' },
                { value: '605', label: 'ANALIZED' },
                { value: '615', label: 'HARDX' },
                { value: '730', label: 'nubiles-porn' },
                { value: '732', label: 'lubed' },
                { value: '769', label: 'deeper' },
                { value: '87', label: 'SM变态' },
                { value: '88', label: '其它分类' },
                { value: '86', label: '肛交天堂' }
              ],
              69: [
                { value: '', label: '全部' },
                { value: '9', label: '国内无码' },
                { value: '10', label: '国内偷拍' },
                { value: '11', label: '主播探花' },
                { value: '65', label: '美女资源' },
                { value: '192', label: '国模私拍' }
              ],
              203: [
                { value: '', label: '全部' },
                { value: '55', label: '亚洲无码' },
                { value: '56', label: '亚洲有码' },
                { value: '57', label: '欧美情色' },
                { value: '63', label: '其他资源' }
              ],
              177: [
                { value: '', label: '全部' },
                { value: '27', label: '亚洲无码' },
                { value: '28', label: '亚洲有码' },
                { value: '29', label: '欧美情色' },
                { value: '30', label: '其他原盘' }
              ],
              39: [
                { value: '', label: '全部' },
                { value: '1', label: '无码' },
                { value: '2', label: '有码' }
              ],
              40: [{ value: '', label: '全部' }],
              60: [{ value: '', label: '全部' }],
              58: [{ value: '', label: '全部' }],
              41: [{ value: '', label: '全部' }],
              63: [{ value: '', label: '全部' }],
              79: [{ value: '', label: '全部' }],
              172: [
                { value: '', label: '全部' },
                { value: '18', label: '亚洲无码' },
                { value: '19', label: '亚洲有码' },
                { value: '20', label: '中文字幕' },
                { value: '21', label: '欧美情色' },
                { value: '22', label: '伦理电影' },
                { value: '23', label: '美女写真' },
                { value: '24', label: '成人动漫' }
              ],
              73: [{ value: '', label: '全部' }],
              137: [{ value: '', label: '全部' }],
              196: [{ value: '', label: '全部' }]
            },
            orderbyOptions: [
              { value: 'heats', label: '最热' },
              { value: 'lastpost', label: '最新' },
              { value: 'dateline', label: '时间' }
            ]
          }
        },
        getPageMode,
        getNeedToHideElements(pageMode) {
          const elements = []
          let selector =
            '.a_fl, .a_fr, .a_cn, #toptb + div[align=center], #diynavtop, #toptb, #hd, #ft, #f_pst, #newspecial'
          switch (pageMode) {
            case 'forumdisplay':
              selector += ', #autopbn, #newspecialtmp'
              break
            case 'viewthread':
              selector += ', #pgt, .pgt, .pgbtn, #hiddenpoststip, .pgs'
              break
            case 'index':
              selector += ', #autopbn, #ct > .mn > style + div, #ct > .mn > div + table'
              break
          }
          if (selector) {
            elements.push(...document.querySelectorAll(selector))
          }
          return elements
        },
        handlePostList,
        handlePostContent() {
          addHideFloorCheckbox()
        }
      }
    }
    if (window.location.hostname.includes('wpzo')) {
      return {
        name: '98t',
        getDefaultData() {
          return {
            executeSelector: '#scrolltop',
            path: '/forum.php',
            params: {
              fid: '36',
              filter: 'typeid',
              typeid: '',
              orderby: 'heats'
            },
            search: ''
          }
        },
        getFormsData() {
          return {
            fidOptions: [
              { label: '国产原创', value: 2 },
              { label: '亚洲无码原创', value: 36 },
              { label: '亚洲有码原创', value: 37 },
              { label: '高清中文字幕', value: 103 },
              { label: '三级写真', value: 107 },
              { label: 'VR视频区', value: 160 },
              { label: '素人有码系列', value: 104 },
              { label: '欧美无码', value: 38 },
              { label: '4K原版', value: 151 },
              { label: '韩国主播', value: 152 },
              { label: '动漫原创', value: 39 },
              { label: '国产自拍', value: 41 },
              { label: '中文字幕', value: 109 },
              { label: '日韩无码', value: 42 },
              { label: '日韩有码', value: 43 },
              { label: '欧美风情', value: 44 },
              { label: '卡通动漫', value: 45 },
              { label: '剧情三级', value: 46 },
              { label: '自提字幕区', value: 145 },
              { label: '自译字幕区', value: 146 },
              { label: '字幕分享区', value: 121 },
              { label: '新作区', value: 159 },
              { label: '原创自拍区', value: 155 },
              { label: '转贴自拍', value: 125 },
              { label: '华人街拍区', value: 50 },
              { label: '亚洲性爱', value: 48 },
              { label: '欧美性爱', value: 49 },
              { label: '卡通动漫', value: 117 },
              { label: '套图下载', value: 165 },
              { label: '综合讨论区', value: 95 },
              { label: 'AI专区', value: 166 },
              { label: '网友原创区', value: 141 },
              { label: '转帖交流区', value: 141 }
            ],
            filterOptions: [{ value: 'typeid', label: '系列' }],
            typeidOptions: {
              2: [
                { value: '', label: '全部' },
                { value: '684', label: '国产无码' },
                { value: '', label: '主播录制' },
                { value: '686', label: '360水滴' },
                { value: '687', label: '厕所偷拍' }
              ],
              36: [
                { value: '', label: '全部' },
                { value: '586', label: 'sm-miracle' },
                { value: '822', label: 'cospuri' },
                { value: '724', label: '盗窃系列' },
                { value: '723', label: 'japornxxx' },
                { value: '683', label: 'レズのしんぴ' },
                { value: '672', label: '无码破解' },
                { value: '671', label: '加勒比PPV' },
                { value: '660', label: '金髪天國' },
                { value: '654', label: '无码流出' },
                { value: '631', label: 'urabukkake' },
                { value: '619', label: 'handjobjapan' },
                { value: '618', label: 'spermmania' },
                { value: '591', label: 'fellatiojapan' },
                { value: '590', label: 'uralesbian' },
                { value: '589', label: 'legsjapan' },
                { value: '587', label: 'roselip-fetish' },
                { value: '368', label: 'FC2PPV' },
                { value: '583', label: '本生素人TV' },
                { value: '553', label: 'エッチな4610' },
                { value: '552', label: 'エッチな0930' },
                { value: '551', label: '人妻斬り' },
                { value: '537', label: 'xxx-av' },
                { value: '523', label: '熟女俱樂部' },
                { value: '449', label: '东京热' },
                { value: '379', label: '店長推薦' },
                { value: '375', label: 'heyppv' },
                { value: '374', label: 'pacoma' },
                { value: '373', label: '女体のしんぴ' },
                { value: '372', label: '10musu' },
                { value: '371', label: '一本道系' },
                { value: '370', label: '加勒比系' },
                { value: '369', label: 'HEYZO' }
              ],
              37: [{ value: '', label: '全部' }],
              103: [
                { value: '', label: '全部' },
                { value: '480', label: '有码高清' },
                { value: '481', label: '无码高清' }
              ],
              107: [
                { value: '', label: '全部' },
                { value: '629', label: '巴西三级' },
                { value: '628', label: '克罗地亚三级' },
                { value: '624', label: '德国三级' },
                { value: '623', label: '美国写真' },
                { value: '622', label: '俄罗斯三级' },
                { value: '621', label: '墨西哥三级' },
                { value: '620', label: '西班牙三级' },
                { value: '617', label: '国产写真' },
                { value: '616', label: '波兰三级' },
                { value: '615', label: '泰国四级' },
                { value: '614', label: '阿根廷三级' },
                { value: '613', label: '香港四级' },
                { value: '612', label: '瑞士四级' },
                { value: '611', label: '瑞士三级' },
                { value: '610', label: '挪威三级' },
                { value: '609', label: '台湾三级' },
                { value: '608', label: '荷兰三级' },
                { value: '607', label: '意大利三级' },
                { value: '606', label: '加拿大三级' },
                { value: '605', label: '法国四级' },
                { value: '604', label: '泰国三级' },
                { value: '603', label: '台湾四级' },
                { value: '602', label: '英国三级' },
                { value: '601', label: '英国四级' },
                { value: '600', label: '国产四级' },
                { value: '599', label: '美国四级' },
                { value: '598', label: '法国三级' },
                { value: '597', label: '国产三级' },
                { value: '596', label: '香港三级' },
                { value: '595', label: '美国三级' },
                { value: '594', label: '日本三级' },
                { value: '593', label: '韩国三级' },
                { value: '592', label: '日本写真' },
                { value: '625', label: '丹麦三级' },
                { value: '630', label: '意大利四级' },
                { value: '633', label: '德国四级' },
                { value: '634', label: '瑞典四级' },
                { value: '645', label: '丹麦四级' },
                { value: '646', label: '荷兰写真' },
                { value: '650', label: '比利时四级' },
                { value: '655', label: '澳大利亚三级' },
                { value: '656', label: '印度三级' },
                { value: '657', label: '菲律宾三级' },
                { value: '658', label: '新加坡写真' },
                { value: '659', label: '韩国写真' },
                { value: '667', label: '法国写真' },
                { value: '668', label: '英国写真' },
                { value: '669', label: '俄罗斯写真' },
                { value: '670', label: '智利三级' }
              ],
              160: [{ value: '', label: '全部' }],
              104: [
                { value: '', label: '全部' },
                { value: '533', label: 'G-area' },
                { value: '728', label: '300MIUM' },
                { value: '729', label: '332NAMA' },
                { value: '730', label: '326EVA' },
                { value: '731', label: '328HMDN' },
                { value: '807', label: '336KNB' },
                { value: '808', label: '200GANA' },
                { value: '809', label: '300MAAN' },
                { value: '810', label: '300NTK' },
                { value: '811', label: '390JAC' },
                { value: '812', label: '326SCP' },
                { value: '727', label: '259LUXU' },
                { value: '726', label: 'SIRO' },
                { value: '534', label: 'Mywife' },
                { value: '535', label: 'S-cute' },
                { value: '536', label: 'FC2' },
                { value: '557', label: 'himemix' },
                { value: '563', label: 'getchu' },
                { value: '588', label: 'siro-hame' },
                { value: '626', label: 'r-file' },
                { value: '627', label: 'giga-web' },
                { value: '632', label: 'knights-visual' },
                { value: '725', label: '230OREX' },
                { value: '813', label: '其他系列' }
              ],
              38: [{ value: '', label: '全部' }],
              151: [
                { value: '', label: '全部' },
                { value: '823', label: '无码' },
                { value: '824', label: '有码' }
              ],
              152: [{ value: '', label: '全部' }],
              39: [
                { value: '', label: '全部' },
                { value: '404', label: '无码' },
                { value: '405', label: '有码' }
              ],
              41: [{ value: '', label: '全部' }],
              109: [{ value: '', label: '全部' }],
              42: [{ value: '', label: '全部' }],
              43: [{ value: '', label: '全部' }],
              44: [{ value: '', label: '全部' }],
              45: [{ value: '', label: '全部' }],
              46: [{ value: '', label: '全部' }],
              145: [
                { value: '', label: '全部' },
                { value: '814', label: '有码字幕' },
                { value: '815', label: '无码字幕' }
              ],
              146: [
                { value: '', label: '全部' },
                { value: '845', label: '欧美' },
                { value: '846', label: '日本' }
              ],
              121: [
                { value: '', label: '全部' },
                { value: '664', label: '有码字幕' },
                { value: '665', label: '无码字幕' },
                { value: '848', label: '缺字需修正' }
              ],
              159: [
                { value: '', label: '全部' },
                { value: '849', label: '新作' }
              ],
              155: [
                { value: '', label: '全部' },
                { value: '820', label: '原创自拍' },
                { value: '821', label: '投稿送码' }
              ],
              125: [
                { value: '', label: '全部' },
                { value: '831', label: '性爱自拍' },
                { value: '832', label: '生活自拍' }
              ],
              50: [
                { value: '', label: '全部' },
                { value: '833', label: '原创街拍' },
                { value: '838', label: '转帖街拍' },
                { value: '834', label: '模拍' }
              ],
              48: [{ value: '', label: '全部' }],
              49: [{ value: '', label: '全部' }],
              117: [
                { value: '', label: '全部' },
                { value: '647', label: '日文' },
                { value: '648', label: '中文' },
                { value: '649', label: '韩文' },
                { value: '835', label: '3D' },
                { value: '836', label: '黑白' },
                { value: '837', label: '彩漫' }
              ],
              165: [{ value: '', label: '全部' }],
              95: [
                { value: '', label: '全部' },
                { value: '709', label: '困惑求助' },
                { value: '710', label: '技术交流' },
                { value: '711', label: '心情感悟' },
                { value: '712', label: 'AV新闻' },
                { value: '713', label: '图文故事' },
                { value: '714', label: '今日话题' },
                { value: '715', label: '不吐不快' },
                { value: '716', label: '情色分享' },
                { value: '843', label: '游客投稿' }
              ],
              166: [
                { value: '', label: '全部' },
                { value: '851', label: 'AI换脸' },
                { value: '852', label: 'AI破解' },
                { value: '853', label: 'AI增强' },
                { value: '854', label: 'AI作图' },
                { value: '855', label: '教程工具' }
              ],
              141: [
                { value: '', label: '全部' },
                { value: '688', label: '个人导航' },
                { value: '689', label: '国产合集' },
                { value: '690', label: '欧美合集' },
                { value: '691', label: '日本合集' },
                { value: '692', label: 'AI破解/换脸' },
                { value: '693', label: '动漫/二次元' },
                { value: '694', label: '蓝光原盘' },
                { value: '695', label: '套图系列' },
                { value: '696', label: '其他資源' },
                { value: '705', label: '自压/增强' },
                { value: '708', label: '版务管理' },
                { value: '844', label: '合集推荐' }
              ],
              142: [
                { value: '', label: '全部' },
                { value: '697', label: '国产自拍' },
                { value: '698', label: '直播视频' },
                { value: '699', label: '亚洲无码' },
                { value: '700', label: '亚洲有码' },
                { value: '701', label: '偷拍視頻' },
                { value: '702', label: '动漫/二次元' },
                { value: '703', label: '欧美风情' },
                { value: '704', label: '其他資源' },
                { value: '706', label: '合集资源' }
              ]
            },
            orderbyOptions: [
              { value: 'heats', label: '最热' },
              { value: 'lastpost', label: '最新' },
              { value: 'dateline', label: '时间' }
            ]
          }
        },
        getPageMode,
        getNeedToHideElements(pageMode) {
          const elements = []
          let selector = '.show-text, .show-text2, .show-text3, .show-text4, #toptb, #hd, #ft, #f_pst, #newspecial'
          switch (pageMode) {
            case 'forumdisplay':
              selector += ', #autopbn, #newspecialtmp'
              break
            case 'viewthread':
              selector += ', #pgt, .pgt, .pgbtn, #hiddenpoststip, .pgs'
              break
            case 'index':
              selector += ''
              break
          }
          if (selector) {
            elements.push(...document.querySelectorAll(selector))
          }
          return elements
        },
        handlePostList,
        handlePostContent() {
          addHideFloorCheckbox()
          // 收起评分
          const hideRate = document.querySelector('.rate a.op')
          if (hideRate && hideRate.innerText === '收起') {
            hideRate.dispatchEvent(new MouseEvent('click'))
          }
        }
      }
    }
  }
})()