清水河畔自动领奖

自动领奖

// ==UserScript==
// @name         清水河畔自动领奖
// @namespace    http://tampermonkey.net/
// @version      1.1.3
// @description  自动领奖
// @author       DARK-FLAME-MASTER FROM RIVERSIDE
// @match        *://*.uestc.edu.cn/forum.php?mod=viewthread*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=uestc.edu.cn
// @require      https://cdn.bootcdn.net/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        unsafeWindow
// @license      MIT
// ==/UserScript==

(function () {

    'use strict';
    const rewardPost = "https://bbs.uestc.edu.cn/forum.php?mod=post&action=reply&fid=42&tid=463952&extra=&replysubmit=yes"



    function getReward(postLink, type, post_params) {

        let ele = document.querySelector("table.plhin > tbody > tr > td > div")
        let temp = ele.innerHTML
        return fetch(postLink)
            .then(data => data.text())
            .then(data => {
                let doc = new DOMParser().parseFromString(data, 'text/html')
                let info = doc.querySelector("table.plhin > tbody > tr > td > div")
                ele.innerHTML = info.innerHTML
                return domtoimage.toBlob(ele)
            })
            .then(blob => {
                ele.innerHTML = temp
                let img = new File([blob], "reward.png", { type: "image/png" })
                let fd = new FormData();
                fd.append('uid', post_params.uid)
                fd.append('hash', post_params.hash)
                fd.append("type", "image");
                fd.append("filetype", "png");
                fd.append("Filename", "reward.png")
                fd.append("Filedata", img)
                fetch("https://bbs.uestc.edu.cn/misc.php?mod=swfupload&action=swfupload&operation=upload&fid=42&html5=image", {
                    "headers": {
                    },
                    "body": fd,
                    "method": "POST",
                }).then(data => data.text())
                    .then(aid => {
                        let formhash = document.querySelector("#scbar_form > input[name=formhash]").value
                        let message = `吾名乃${document.querySelector("#toptb > div.y > strong > a").text},特来此帖取${type.data + (type.name == 'time' ? '小时' : '帖')}奖励`
                        //let message = "测试"
                        return fetch(rewardPost, {
                            "headers": {
                                "content-type": "application/x-www-form-urlencoded",
                            },
                            "body": `formhash=${formhash}&message=${message}&attachnew[${aid}][description]=`,
                            "method": "POST",
                        });
                    })
            })
    }

    function notice(message) {
        Notification.requestPermission().then((result) => { if (result === 'granted') { let n = new Notification(message) } })
    }

    async function init() {
        let version = GM_getValue('version', 0)
        if (version == 0) {
            GM_setValue('version', 1)
            let postLink = GM_getValue('postLink', null)
            let lastRewardReply = GM_getValue("lastRewardReply", 0)
            let lastRewardTime = GM_getValue("lastRewardTime", 0)
            fetch(postLink)
                .then(data => data.text())
                .then(data => {
                    let doc = new DOMParser().parseFromString(data, 'text/html')
                    let uid = doc.querySelector(".authi > .xw1").href.match(/uid=(.*)/)[1]
                    let userData = {}
                    userData[uid] = {
                        lastRewardReply: lastRewardReply,
                        lastRewardTime: lastRewardTime,
                        postLink: postLink
                    }
                    GM_setValue('userData', userData)
                })

        } else {
            let userData = GM_getValue('userData', {})
            let uid = document.querySelector(".vwmy > a").href.match(/uid=(.*)/)[1]
            if (!userData[uid]) {
                let postLink = await fetch('https://bbs.uestc.edu.cn/home.php?mod=space&do=thread&view=me')
                    .then(data => data.text())
                    .then(data => {
                        let doc = new DOMParser().parseFromString(data, 'text/html')
                        return doc.querySelector("#delform > table > tbody > tr:nth-child(2) > th > a").href
                    })
                userData[uid] = {
                    lastRewardReply: 0,
                    lastRewardTime: 0,
                    postLink: postLink
                }
                GM_setValue('userData', userData)
            }
        }

    }

    function checkAndGetReward() {
        let link = document.querySelector('#toptb > div.y > strong > a')
        let post_params = unsafeWindow.upload.settings.post_params;
        let uid = link.href.match(/uid=(\d+)/)[1]
        let postNoticedTime = GM_getValue('postNoticedTime', false)
        let timeNoticedTime = GM_getValue('timeNoticedTime', false)
        if (link) {
            fetch(link.href + '&do=profile')
                .then(data => data.text())
                .then(text => {
                    let reply = parseInt(text.match(/回帖数 (\d+)/)[1]) + parseInt(text.match(/主题数 (\d+)/)[1])
                    let online = parseInt(text.match(/在线时间<\/em>(\d+)/)[1])

                    let rewardReply = Math.max(Math.round(reply / 5000) * 5000, 5000)
                    let rewardTime = Math.max(Math.round(online / 500) * 500, 500)

                    let requiredReply = rewardReply - reply
                    let requiredTime = rewardTime - online

                    let userData = GM_getValue('userData', {})

                    let lastRewardTime = userData[uid].lastRewardTime
                    let lastRewardReply = userData[uid].lastRewardReply
                    let postLink = userData[uid].postLink

                    //a function that check if the minus of a given timestamp and now is less than 1 hour
                    let isNoticed = (time) => new Date().getTime() - time < 1000 * 60 * 60





                    if (requiredReply >= -200 && requiredReply <= 10 && rewardReply != lastRewardReply && !isNoticed(postNoticedTime)) {
                        notice(`距离领水仅差${requiredReply}帖`)
                        GM_setValue('postNoticedTime', new Date().getTime())
                    }
                    if (requiredTime >= -20 && requiredTime <= 1 && rewardTime != lastRewardTime && !isNoticed(timeNoticedTime)) {
                        notice(`距离领水仅差${requiredTime}小时`)
                        GM_setValue('timeNoticedTime', new Date().getTime())
                    }

                    if (requiredReply >= -200 && requiredReply <= 0 && rewardReply != lastRewardReply) {
                        getReward(postLink, { name: 'reply', data: rewardReply }, post_params)
                            .then((a) => {
                                notice(`已自动领取${rewardReply}帖奖励`)
                                userData[uid].lastRewardReply = rewardReply
                                GM_setValue("userData", userData)
                            })

                    }
                    if (requiredTime >= -20 && requiredTime <= 0 && rewardTime != lastRewardTime) {
                        getReward(postLink, { name: 'time', data: rewardTime }, post_params)
                            .then((a) => {
                                notice(`已自动领取${rewardTime}小时奖励`)
                                userData[uid].lastRewardTime = rewardTime
                                GM_setValue("userData", userData)
                            })
                    }

                })
        }
    }

    init()
    checkAndGetReward()
    setInterval(checkAndGetReward, 1000 * 60 * 10)

    // Your code here...
})();