巴哈姆特之刪除動畫瘋中獎信件

一鍵刪除惱人的中獎信件

目前为 2020-04-03 提交的版本。查看 最新版本

// ==UserScript==
// @name         巴哈姆特之刪除動畫瘋中獎信件
// @description  一鍵刪除惱人的中獎信件
// @namespace    nathan60107
// @version      1.0
// @author       nathan60107(貝果)
// @homepage     https://home.gamer.com.tw/homeindex.php?owner=nathan60107
// @match        https://mailbox.gamer.com.tw/?l=1
// @grant        none
// ==/UserScript==

var myMailBox = Array(), myDate = Array();//暫存信件編號與日期的變數

function isAniBabi(mail){//檢查是否是巴幣中獎信
    return null!=mail.match(/恭喜您於[\d\/]+答對了動畫瘋的問答遊戲!\n本次獎勵:[\d]+ 巴幣\n目前已完成巴幣的發送!\n\n--\n本信件為系統通知信件,請勿回覆!/);
}

function strip(html){//去除html成份 只留下純文字
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent||tmp.innerText;
}

function myReload(){
    location.reload();
}

function changeButtonText(text, isActive, func){//改變按鈕文字與屬性
    jQuery(".delAniBabi").html("\n\t<a class=\"not-active\">"+text+"</a>\n\t");
    jQuery(".delAniBabi")[0].childNodes[1].attributes[0].nodeValue = isActive ? "is-active" : "not-active";
    if(isActive){
        jQuery(".delAniBabi").click(func)
    }
}

function delMail(mailSn, date, mailContent, mailNumber){//刪除指定信件並通知
    var t = jQuery, i = window.mailbox, e = mailSn;

    t.post("/ajax/" + i.boxType + "Del.php", "csrfToken=" + t("input[name=csrfToken]").val() + "&del[]=" + e, function(a) {
        if(a.code!=0){
            toastr.warning("刪除第"+mailNumber+"封信ERROR:"+a.message);
            console.log(a);
        }else{
            console.log(page, mailSn, "已刪除"+date+"的中獎通知:"+mailContent.replaceAll("\n",""))
            toastr.success("已刪除"+date+"的中獎通知");
        }
    }, "json");
}

function getMail(mailNumber){//取得信件並決定是否刪除
    var t = jQuery, i = window.mailbox, e = String(myMailBox[mailNumber].substr(9, 19)), date = myDate[mailNumber];
    changeButtonText("正在檢查第"+String(mailNumber)+"封信...", false)

    t.post({
        url: "/ajax/" + window.mailbox.boxType + "Read.php",
        data: {sn:e},//用jsonText會出現信件編號錯誤 jsonText=JSON.stringify(json)
        dataType: "json",
        success: function(a) {
            if(a.code!=0){
                toastr.warning("檢查第"+e+"封信ERROR:"+a.message);
                console.log(a);
            }else{
                var mailContent = strip(window.mailbox.changetxt(a.data));

                if(isAniBabi(mailContent)){
                    delMail(e, date, mailContent, mailNumber);
                }
            }

            if(mailNumber+1<myMailBox.length){//遞迴讀取下一封信,不一封封依序讀取的話會有SyntaxError: "JSON.parse: unexpected character at line 1 column 1 of the JSON data"。
                setTimeout(function(){getMail(mailNumber+1);}, 150);//兩封信之間的間隔太短會有JSON error
            }else{//所有信件檢查完畢,要求使用者重整。
                changeButtonText("刪除完畢 請點此重整頁面", true, myReload);
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            changeButtonText("未知的錯誤 程序已停止", true, myReload);
            console.log("fail")
            console.log(e)
            console.log(mailNumber, e, date, XMLHttpRequest.statusText, textStatus, errorThrown);
            console.log({sn:e}, JSON.stringify({sn:e}))
        }
    });
}

function getMailList(page, lastPage){//讀取第page頁的信件列表
    var e = page;
    changeButtonText("正在讀第"+String(page)+"頁列表...", false)

    jQuery.post("/ajax/inboxList.php", {
        p: e,
        s: window.mailbox.searchUser
    }, function(t) {
        if(t.code!=0){
            toastr.warning("檢查第"+e+"封信ERROR:"+t.message);
            console.log(t);
        }else{
            var result = t.data.match(/data-sn=\"[0-9]{10}\_[0-9]{8}/g)
            var date = t.data.match(/[\d]{4}-[\d]{2}-[\d]{2}/g)
            var maxMailNumber = parseInt(strip(t.data).match(/[0-9]*\n封/g)[0].substr(0,strip(t.data).match(/[0-9]*\n封/g)[0].length-2));
            var curMailNumber = parseInt(strip(t.data).match(/[0-9]*\n封/g)[1].substr(0,strip(t.data).match(/[0-9]*\n封/g)[1].length-2));

            myMailBox = myMailBox.concat(result)
            myDate = myDate.concat(date)

            if(curMailNumber>=maxMailNumber){//列表全數讀取完畢,開始讀取信件內容。
                changeButtonText("正在刪除信件...", false)
                getMail(0);
            }else{//遞迴讀取下一頁的列表,不一頁頁依序讀取的話會有錯誤。
                setTimeout(function(){getMailList(page+1, lastPage);}, 100);
            }
        }
    })
}

function startDelAniBabi(){//查看所有信件
    toastr.options = {
        positionClass: 'toast-top-center',
        showDuration: 60,
        hideDuration: 120,
        tapToDismiss: false
    };

    var text = jQuery("#list_div").text();
    var startPos = text.match(/[0-9]*\n封/).index, endPos = text.match(/封/).index;
    var totalMail = parseInt(text.substr(startPos,endPos-startPos));

    jQuery(".delAniBabi").off("click")
    getMailList(1, Math.ceil(totalMail/20));
};

//初始化toastr通知
jQuery('head').append('<script src="https://i2.bahamut.com.tw/js/plugins/toastr-2.1.3.min.js?v=1498617831"></script>');
jQuery('head').append('<link href="https://i2.bahamut.com.tw/css/plugins/toastr.min.css?v=1498617831" rel="stylesheet" type="text/css">');
jQuery('head').append('<style> .toast-top-center { top: 80px; right: 0; width: 100%; } </style>');
//jQuery('head').append(`<script type="text/javascript"> 	toastr.options = { 		positionClass: 'toast-top-center', 		showDuration: 60, 		hideDuration: 120, 		tapToDismiss: false 	};</script>`);
/*toastr.options = {
    positionClass: 'toast-top-center',
    showDuration: 60,
    hideDuration: 120,
    tapToDismiss: false
};*/
//為什麼options過一段時間會自己消失?
//為什麼用jquery ready包住之後toast options的效果就會失效?

(function() {
    /*var myShowList = window.mailbox.inbox.toString();
    myShowList = myShowList.replace("e=e", "console.log\(\"456\", this.searchUser\), e = e");
    myShowList = myShowList.replace("\)\)}\)}", "\),  console.log\(\"123\", this.searchUser\)\)}\)}");
    myShowList = myShowList.replace("t.post", "jQuery.post");
    myShowList = myShowList.replace("i.page", "mailbox.page");
    window.mailbox.inbox = new Function("return "+myShowList)();*/
    /*把startDelAniBabi function宣告在window中
    並把他放進mailbox.inbox的最後面
    且將run-at設置為document-body
    就可以讓系統自動執行到startDelAniBabi function
    */

    //設置刪除中獎信按鈕
    var writeMail = jQuery(".BH-menu-forumA-back");
    writeMail.after(`<li class="BH-menu-forumA-back delAniBabi">
	<a class="is-active">刪除巴幣中獎信</a>
	</li>`);
    jQuery(".delAniBabi")[0].style.marginRight = "5px";
    jQuery(".delAniBabi").click(startDelAniBabi)

})();

/*reference
等元素載入完畢: https://www.itread01.com/content/1545263124.html
jQuery: https://ithelp.ithome.com.tw/articles/10095237
getType: http://iambigd.blogspot.com/2012/10/javascript.html
html2text: https://stackoverflow.com/questions/822452/strip-html-from-text-javascript
promise: https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Promise
         https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Using_promises
正則: http://ccckmit.wikidot.com/regularexpression
run-at: https://codertw.com/程式語言/709052/#outline__1_9
插入在某元素之後: https://www.w3school.com.cn/jquery/jquery_dom_add.asp
在按鈕之間插入空格: https://stackoverflow.com/questions/19769033/jquery-beginner-how-to-insert-spaces-between-append
幫元素添加css: http://www.aaronlife.com/v1/notes/html_set_css_styles_using_javascript.html
正則的global用法與match: https://blog.csdn.net/vajoy/article/details/17020423
jQuery post:https://api.jquery.com/jquery.post/
            https://stackoverflow.com/questions/2833951/how-do-i-catch-an-ajax-query-post-error
串接array: https://www.w3schools.com/jsref/jsref_concat_array.asp
取消按鈕效果: https://api.jquery.com/click/
頁面重新整理: https://ithelp.ithome.com.tw/articles/10190061
*/

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址