安氏贵人鸟 发表于 2025-10-13 16:42:22

【油猴脚本】冷却后自动回复【站员30/小时贴版】

本帖最后由 安氏贵人鸟 于 2025-10-13 16:44 编辑

来源:https://www.gamemale.com/forum.php?mod=viewthread&tid=147656

福黎的冷却后自动回复
原版是25/小时 Lv10最大等级的回帖脚本
闲的没事改了下数值变成适合站员的30/小时自动回帖脚本
具体功能没改,虽然改不难,不过为了方便其他有需要的站员
这鱼我摸了

有时间的给脚本原作者点点追随@@福黎


// ==UserScript==
// @Name         CD后回复(固定30上限版)
// @namespace    http://tampermonkey.net/
// @version      1.1.13
// @description防止CD期间误发帖,每小时固定30次回帖上限。
// @author       福黎 + Single Tonight修正版
// @match      *://www.gamemale.com/thread*
// @match      *://www.gamemale.com/forum.php?mod=viewthread&tid=*
// @grant      GM_addStyle
// ==/UserScript==

(function () {
'use strict'

let replyMaxEnabled = true //是否启用上限判断
let checked = true //是否默认勾选“回帖后自动关闭页面”

GM_addStyle(`
    #fastpostsubmit.dequeue{
      background-color:#F49544;
      border-color:#D17F3A;
    }
    #fastpostsubmit.dequeue:hover{
      background-color:#AE6A30;
      border-color:#8B5526;
    }
    #replyCount{
      float:right;
      margin-right:10px;
    }
    #clearReplyList{
      display:block;
      text-align:center;
      float:right;
      margin:0 20px;
    }
`)

let replyList = JSON.parse(localStorage.getItem('replyList') || '[]')
let replyTime = JSON.parse(localStorage.getItem('replyTime') || '[]')
let tid = window.location.href.match(/thread-(\d+)|tid=(\d+)/)
tid = tid || tid
let type = true
let time = 0

// 固定每小时上限 30 次
const level = 0
const replyMax = replyMaxEnabled ? 30 : 10000000

const form = document.querySelector('#fastpostform')
const message = document.querySelector('#fastpostmessage')
const submit = document.querySelector('#fastpostsubmit')
const close = document.createElement('label')
const replyCountBox = document.createElement('div')
const clearReplyList = document.createElement('a')
clearReplyList.id = 'clearReplyList'
clearReplyList.href = 'javascript:;'
replyCountBox.id = 'replyCount'
form.onsubmit = ''

close.innerHTML = checked ? `<input id="close" type="checkbox" class="pc" checked>
回帖后自动关闭页面` : `<input id="close" type="checkbox" class="pc">
回帖后自动关闭页面`
clearReplyList.innerHTML = '清空队列'
document.querySelector('.ptm.pnpost').append(close, clearReplyList, replyCountBox)
updateReplyCount()

form.addEventListener('submit', e => e.preventDefault())
submit.addEventListener('click', () => { type ? enqueue() : dequeue() })
clearReplyList.addEventListener('click', delEnqueue)

function enqueue() {
    if (!replyList.includes(tid) && replyTime.length + replyList.length < replyMax) {
      if (new Blob().size < 30) {
      alert(`您的帖子长度不足30字节,当前长度:${new Blob().size}`)
      return
      }
      replyList.push(tid)
      localStorage.setItem('replyList', JSON.stringify(replyList))
      submit.classList.add('dequeue')
      submit.innerHTML = '<strong>排队中...</strong>'
      message.setAttribute('readonly', true)
      type = false
      if (replyList.length === 1) {
      observeChanges()
      send()
      }
      window.addEventListener('beforeunload', () => {
      replyList = replyList.filter(item => item != tid)
      localStorage.setItem('replyList', JSON.stringify(replyList))
      })
      updateReplyCount()
    } else if (replyList.includes(tid)) {
      alert('帖子已在队列中')
    } else {
      alert('您已达到1小时内30次回复上限!')
    }
}

let formCheck1, formCheck2, isSubmitting = false

function send() {
    form.onsubmit = sub()
    const now = Math.floor(Date.now() / 1000)
    replyTime = JSON.parse(localStorage.getItem('replyTime') || '[]')
    time = time ? time : 60 - (now - replyTime)
    formCheck1 = setTimeout(() => {
      let t = 0
      form.onsubmit = sub()
      formCheck2 = setInterval(() => {
      if (isSubmitting) return
      if (t >= 24) {
          dequeue()
          alert('网络波动,请刷新页面重新排队')
          clearTimeout(formCheck1)
          clearTimeout(formCheck2)
      }
      form.onsubmit = sub()
      t++
      }, 5000)
    }, time * 1000)
}

let isTriggered = false
function observeChanges() {
    const targetNode = document.getElementById('append_parent')
    const observer = new MutationObserver(() => {
      if (document.getElementById("creditpromptdiv") && !isTriggered) {
      isTriggered = true
      const now = Math.floor(Date.now() / 1000)
      replyTime.push(now)
      localStorage.setItem('replyTime', JSON.stringify(replyTime))
      clearInterval(formCheck1)
      clearInterval(formCheck2)
      observer.disconnect()
      dequeue()
      if (close.querySelector('input').checked) window.close()
      }
    })
    observer.observe(targetNode, { childList: true })
}

function dequeue() {
    submit.innerHTML = '<strong>发表回复</strong>'
    submit.classList.remove('dequeue')
    message.removeAttribute('readonly')
    type = true
    replyList = replyList.filter(item => item != tid)
    localStorage.setItem('replyList', JSON.stringify(replyList))
    clearTimeout(formCheck1)
    clearTimeout(formCheck2)
}

window.addEventListener('storage', e => {
    if (e.key === 'replyList' || e.key === 'replyTime') {
      replyList = JSON.parse(localStorage.getItem('replyList') || '[]')
      replyTime = JSON.parse(localStorage.getItem('replyTime') || '[]')
      updateReplyCount()
      if (e.key === 'replyList' && tid == replyList) {
      observeChanges()
      send()
      } else if (e.key === 'replyList' && replyList.length === 0) {
      dequeue()
      }
    }
})

async function sub() {
    if (isSubmitting) return
    isSubmitting = true
    const isValid = await fastpostvalidate(form)
    isSubmitting = false
    console.log('提交中...')
    return isValid
}

function updateReplyCount() {
    const now = Math.floor(Date.now() / 1000)
    replyTime = replyTime.filter(t => now - t <= 3600)
    replyCountBox.innerHTML = `<span>${replyTime.length}/30 | 排队数:${replyList.length}</span>`
    localStorage.setItem('replyTime', JSON.stringify(replyTime))
}

function delEnqueue() {
    if (confirm('确定清空队列吗?')) {
      replyList = []
      dequeue()
      updateReplyCount()
      localStorage.setItem('replyList', JSON.stringify(replyList))
    }
}
})()


克莱因蓝 发表于 2025-10-13 16:49:41

https://img.gamemale.com/album/202508/27/154618wt52fzit25qb9aaf.jpg我用的25贴的 不过也够用了 站街还是很方便的{:6_167:}

Burry 发表于 2025-10-13 17:01:43

30,感觉用起来更方便样子,试试看。

万俟 发表于 2025-10-13 17:01:54

奇怪,我现在用的就自动匹配上限,但是看脚本好像还是等级+15,不知道是怎么判定的

娱乐法师火布偶 发表于 2025-10-13 17:05:32

我觉得坛花还是不希望作为管理员的用户在疯狂回帖灌水了

柏芸 发表于 2025-10-13 17:07:20

看来是适配站员权限的坛友做的脚本:o,能分开的话确实挺不错的

crabee 发表于 2025-10-13 17:19:13

原来站员能提升上限至每小时30帖,一波吃完+2还是挺爽的惹,脚本对于站员很实用了

Hadley0T 发表于 2025-10-13 17:24:41

原版自动匹配的,会根据用户做修改。

Riverlethe 发表于 2025-10-13 17:51:57

站街好累。。回帖绞尽乳汁完全赶得上回帖CD。。

红叶黄花 发表于 2025-10-13 17:59:08

现在回帖频率其实没有那么高了,不过对热衷站街的几位大佬应该很有用

星之子 发表于 2025-10-13 18:06:11

const level = Number(document.querySelector('.u-info-group font').innerText.match(/\d+/g)) || 15
replyMax = replyMax ? level + 15 : 10000000原脚本的代码已经自带识别站员用户组的功能了,其逻辑是:
如果在用户组的文本中检测到数字,则 level = 该数字,回帖上限 replyMax = level+15。以 Lv.10 为例,level = 10,replyMax = 25。
如果没检测到,则默认 level = 15(即第一行代码末尾的15)。以 站员 为例,由于没检测到数字,replyMax = 30。

是阿行嘞 发表于 2025-10-13 18:30:11

https://i.111666.best/image/eJDzvxTCylqiOtdjhdkDgn.jpg
蛮有用的~soon用上~
其实现在还以为站员和十级一样25()

x14443 发表于 2025-10-13 18:36:45

只有我是看不懂这是在干什么的吗 我每天努力手动站街等级还是那么低:'(

毛茸茸兽兽 发表于 2025-10-13 18:51:18

吃瓜ing还以为十级是每小时20帖的,记错了欸

AlexToi 发表于 2025-10-13 19:09:19

突然觉得我这种手动回复好没有效率~

Styphon 发表于 2025-10-13 19:44:06

原来只有我是手动站街的嘛:dizzy:

安德烈 发表于 2025-10-13 19:52:41

感谢分享~竟然有这么方便的利器 学到了!!

2302594 发表于 2025-10-13 20:02:01

看来是一个很适合水怪的插件

远方传来风笛 发表于 2025-10-13 21:15:05

很实用的站员小工具 费劲想半天才回帖 站街好累啊

mintea 发表于 2025-10-13 21:42:57

https://img.gamemale.com/album/202408/03/102115fz2ncq4r7cz47o7f.gif站街利器啊,不用频繁点看冷却了
页: [1] 2 3
查看完整版本: 【油猴脚本】冷却后自动回复【站员30/小时贴版】