Greasy Fork

QQ邮箱邮件恢复

恢复已删除的QQ邮箱邮件

目前为 2022-11-24 提交的版本。查看 最新版本

// ==UserScript==
// @name         QQ邮箱邮件恢复
// @namespace    http://tampermonkey.net/
// @version      0.9
// @description  恢复已删除的QQ邮箱邮件
// @match        https://mail.qq.com/cgi-bin/frame_html?*
// @icon         https://mail.qq.com/zh_CN/htmledition/images/favicon/qqmail_favicon_96h.png
// @require      https://libs.baidu.com/jquery/2.0.0/jquery.min.js
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    $(document).ready(function() {
            var toolbar = $(".topdata").find(".switch").find(".left").children(".addrtitle");
            toolbar.append(" | ");
            var toolbar_item = $("<a>恢复已删除的邮件</a>");
            toolbar_item.click(function(){
                alert("邮件恢复为第三方通过插件提供的功能。继续使用即视为您知晓并同意:\n一、此功能的提供者无法保证此功能的稳定性。此功能可能因为邮件系统已经彻底删除了邮件、邮件接口或数据格式发生变化而无法正常使用。\n二、使用此功能造成的一切后果由用户自行承担。虽然看起来没有什么风险,但还是请在使用前备份重要的数据。\n");

                var mydivblocker = $("<div style='width:100%;height:100%;top:0;left:0;z-index:999;position:fixed;margin:0;padding:0;background-color:#7f7f7f7f;display:block'></div>");
                var myinnerdiv = $("<div style='position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:50%;height:50%;background-color:white;display:flex;flex-direction:column'></div>");

                var close_botton_wrapper = $("<div style='width:fill-parent;height:fit-content'></div>");
                var close_botton = $("<a style='float:right;margin-top:5px;margin-right:15px'>关闭</a>");
                close_botton.click(function(){mydivblocker.remove();})

                var my_table_wrapper = $("<div style='flex:1;width:fill-parent;overflow-y:scroll'></div>");
                var my_table = $("<table style='width:fill-parent;margin:10px'><thead><tr><th>删除时间</th><th>发件人</th><th>主题</th><th>操作</th></tr></thead></table>");

                close_botton_wrapper.append(close_botton);
                myinnerdiv.append(close_botton_wrapper);
                my_table_wrapper.append(my_table);
                myinnerdiv.append(my_table_wrapper);
                mydivblocker.append(myinnerdiv);

                var refresh_me = function(){
                    my_table.remove();
                    my_table = $("<table style='width:fill-parent;margin:10px'><thead><tr><th>删除时间</th><th>发件人</th><th>主题</th><th>操作</th></tr></thead></table>");
                    my_table_wrapper.append(my_table);

                    var date_string = "";
                    var deleted_mails = [];

                    $.get("https://mail.qq.com/cgi-bin/help_static_delete",{sid:g_sid, type:0, r:Math.random()},function(data){
                        var dom = $.parseHTML(data);
                        $(dom).find(".sITable").find("#table_data").children("tr").each(function(){
                            if($(this).find(".sIDate").length !== 0){
                                date_string = $(this).find(".sIDate").text();
                            }

                            if($(this).is(".resultTr")){
                                var dele_date = date_string;
                                var dele_time = $(this).find(".mailTime").text();
                                var mail_person = $(this).find(".mailPerson").text();
                                var mail_subject = $(this).find(".mailSubject").text();

                                var new_row = $("<tr></tr>");
                                new_row.append("<td>"+(dele_date+" "+dele_time)+"</td>");
                                new_row.append("<td>"+(mail_person)+"</td>");
                                new_row.append("<td>"+(mail_subject)+"</td>");
                                var restore_op = $("<a>恢复</a>");
                                restore_op.click(async function(){
                                    var guess_date = new Date();
                                    var today = new Date(Date.now());
                                    const ymd_reg = new RegExp("[0-9]+年[0-9]+月[0-9]+日");
                                    const md_reg = new RegExp("[0-9]+月[0-9]+日");
                                    const get_number = /[0-9]+/g;
                                    if(dele_date == "今天"){
                                        guess_date = new Date(today.getFullYear(),today.getMonth(),today.getDate());
                                    }else if(dele_date=="昨天"){
                                        guess_date = new Date(today.getFullYear(),today.getMonth(),today.getDate()-1);
                                    }else if(dele_date=="前天"){
                                        guess_date = new Date(today.getFullYear(),today.getMonth(),today.getDate()-1);
                                    }else if(ymd_reg.test(dele_date)){
                                        var y_m_d_str = [...dele_date.matchAll(get_number)];
                                        guess_date = new Date(Number(y_m_d_str[0]),Number(y_m_d_str[1])-1,Number(y_m_d_str[2]));
                                    }else if(md_reg.test(dele_date)){
                                        var m_d_str = [...dele_date.matchAll(get_number)];
                                        guess_date = new Date(today.getFullYear(),Number(m_d_str[0])-1,Number(m_d_str[1]));
                                        if(guess_date>today)guess_date.setFullYear(guess_date.getFullYear()-1);
                                    }

                                    const get_time = /[0-9]{2}:[0-9]{2}/g;
                                    var time_str = [...dele_time.matchAll(get_number)];
                                    guess_date.setHours(Number(time_str[0]));
                                    guess_date.setMinutes(Number(time_str[1]));
                                    var test_am_and_pm = false;

                                    if(dele_time.indexOf("下午")==0 || dele_time.indexOf("晚上")==0){
                                        guess_date.setHours((guess_date.getHours())%12 + 12);
                                    }else if(dele_time.indexOf("凌晨")==0 || dele_time.indexOf("早上")==0|| dele_time.indexOf("上午")==0){
                                        guess_date.setHours((guess_date.getHours())%12);
                                    }else if(dele_time.indexOf("中午")==0){
                                        guess_date.setHours((guess_date.getHours()+6)%12 + 6);
                                    }else if(get_time.test(time_str)){
                                        //skip
                                    }else{
                                        guess_date.setHours((guess_date.getHours())%12 + 12);
                                        test_am_and_pm = true;
                                    }
                                    console.log(guess_date);
                                    const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
                                    var progress_blocker = $("<div style='width:100%;height:100%;top:0;left:0;z-index:999;position:fixed;margin:0;padding:0;background-color:#7f7f7f7f;display:block'></div>");
                                    mydivblocker.append(progress_blocker);
                                    var progress_div = $("<div style='position:absolute;top:0;bottom:0;left:0;right:0;padding:15px;margin:auto;width:30%;height:30%;background-color:white;display:flex;flex-direction:column'></div>");
                                    progress_blocker.append(progress_div);
                                    progress_div.append("<font>为了规避网站的防DDoS设置,并留出一定余量来保证服务尽可能可靠,我们在每次请求之间加入了较长的间隔。</font><br/>");
                                    progress_div.append("<font>因此,本次操作可能需要5-10分钟,请耐心等待。</font><br/>");
                                    progress_div.append("<font>在此期间,您可以打开其它标签页进行工作,但请尽量不要同时执行其它恢复操作。</font><br/>");
                                    var meter = $("<progress style='width:100%;height:30px;color:green'>......</progress>");
                                    meter.attr('max',(test_am_and_pm?120:60) * 12);
                                    meter.attr('value',0);
                                    progress_div.append(meter);

                                    for(var i = 0;i < 60;i++){
                                        await $.post("/cgi-bin/mail_mgr",{sid:g_sid,mailaction:'mail_revert',t:'mail_mgr2',logtype:2,timekey:Math.floor(Number(guess_date)/1000) + i},function(){});
                                        meter.attr("value",i * 12 + 2);
                                        for(var j = 0;j < 10;j++){
                                            await sleep(500);
                                            meter.attr("value",i * 12 + 2 + j);
                                        }
                                    }
                                    if(test_am_and_pm){
                                        //Can not determine AM/PM. Test both
                                        for(var i = 0;i < 60;i++){
                                            await $.post("/cgi-bin/mail_mgr",{sid:g_sid,mailaction:'mail_revert',t:'mail_mgr2',logtype:2,timekey:Math.floor(Number(guess_date)/1000) + 60 + i},function(){});
                                            meter.attr("value",(i + 60) * 12 + 2);
                                            for(var j = 0;j < 10;j++){
                                                await sleep(500);
                                                meter.attr("value",(i + 60) * 12 + 2 + j);
                                            }
                                        }
                                    }
                                    progress_blocker.remove();

                                    refresh_me();
                                });
                                new_row.append(restore_op);
                                my_table.append(new_row);

                                deleted_mails.push({date:dele_date,time:dele_time,sender:mail_person,subject:mail_subject});
                            }
                        });

                    //deleted_mails.forEach(function(data){alert(data.subject);});
                });

                    $(document.body).append(mydivblocker);
                };
                refresh_me();
            });
            toolbar.append(toolbar_item);

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