DeepL翻译记录同步至notion

脚本将三秒内未变化的原始文本和翻译文本提交至服务器,由服务器上传至notion

目前为 2023-02-07 提交的版本。查看 最新版本

// ==UserScript==
// @name         DeepL翻译记录同步至notion
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  脚本将三秒内未变化的原始文本和翻译文本提交至服务器,由服务器上传至notion
// @author       You
// @match        https://www.deepl.com/*
// @icon         https://static.deepl.com/img/logo/DeepL_Logo_darkBlue_v2.svg
// @grant GM_xmlhttpRequest
// @license MIT
// ==/UserScript==

(function() {
    'use strict';
    let host = 'enter your ip:port'

    // Your code here...
    //提示信息 封装
    function Toast(msg,duration){
        // console.log('66666')
        duration=isNaN(duration)?3000:duration;
        var m = document.createElement('div');
        m.innerHTML = msg;
        m.style.cssText="font-size: .45rem;color: rgb(255, 255, 255);background-color: rgba(48,111,112, 0.8);padding: 10px 15px;margin: 0 0 0 -60px;border-radius: 4px;position: fixed;    top: 45%;left: 50%;width: 180px;text-align: center;";
        //document.body.appendChild(m);
        m.setAttribute("class","text-sm font-semibold text-white")
        let card = document.getElementsByClassName('lmt__sides_container')[0]
        card.appendChild(m);
        setTimeout(function() {
            var d = 0.5;
            m.style.opacity = '0';
            setTimeout(function() { card.removeChild(m) }, d*1000);
        }, duration);
    }
    function SaveToRomote(text, translation, tags){
        console.log('上传成功!');
        console.log('save tags', tags);
        tags = JSON.stringify(tags)
        GM_xmlhttpRequest({
            method: 'POST',
            url: `http://${host}`,
            data: `text=${text}&translation=${translation}&tags=${tags}`,
            onload: response => { console.log(response); Toast('翻译记录自动保存成功~'); console.log('保存成功')}
        });
    }
    let tags = []
    function GetAllTags(){
        GM_xmlhttpRequest({
            method: 'GET',
            url: `http://${host}/tags`,
            responseType: 'json',
            timeout: 6000,
            onload: response => { tags = response.response.data; Toast('获取notion标签成功~'); AddTagSelectToPage();}
        });
    }
    let flag = true
    function AddTagSelectToPage(){
        if(JSON.stringify($('#headlessui-tabs-tab-3')) != '{}'){
            return
        }

        console.log('tags', tags);
        let tagCheckStr = '<form id="tagcheckbox">';
        for(let i = 0; i < tags.length; i++) {
            let tag = tags[i]
            let margin = i == 0 ? '' : "'margin-left: 5px !important'"
            tagCheckStr += `<input type="checkbox" id="${tag.id}" name="${tag.name}" style=${margin}><label style="margin-left: 3px !important" for="${tag.id}">${tag.name}</label>`
        }
        tagCheckStr += `<input type="checkbox" id="add_tag_checkbox" name="exart" style='margin-left: 5px !important'><input id='add_tag_input' disabled='true' style="margin-left: 5px; border: 2px solid gray; text-indent: 3px; border-radius: 10px; width: 80px" placeholder="新增标签">`
        tagCheckStr += '</form>'

        var $btn = `
        <button dl-test="doctrans-tabs-switch-docs" id="headlessui-tabs-tab-3" role="tab" type="button" aria-selected="false" tabindex="-1" data-headlessui-state="" aria-controls="panelTranslateFiles">
        <div class="cardButton--VaX9A " aria-label="标签"><div class="innerUpper--JA8Bf" tabindex="-1"><div class="logo--erUTh" tabindex="-1">
        <svg t="1675618863572" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2682" width="200" height="200"><path d="M512 910.208L910.208 512 480.832 82.624l-378.816 24.448-19.776 373.376L512 910.208zM0 512L25.472 31.36 512 0l512 512-512 512-512-512z m293.376-128.96a85.952 85.952 0 1 0 0-171.904 85.952 85.952 0 0 0 0 171.904z" fill="#296290" p-id="2683"></path></svg>
        </div>
        <div class="text--HXdGT" tabindex="-1">
        <div class="textUpper--PrWcj" tabindex="-1">选择你需要为翻译加上的标签</div>
        <div class="textLower--BYwsB" tabindex="-1">
        ${tagCheckStr}
        </div></div></div>
        <div class="innerLower--yE4_4" tabindex="-1"></div></div>
        </button>`
        let tabbar = $('.flex.flex-row')
        //console.log('tabbar', tabbar)
        if(typeof(tabbar) == undefined) {
            return
        }
        flag = false
        tabbar.append($btn);
        $("#add_tag_checkbox").change(function(){
            let checkbox = document.getElementById('add_tag_checkbox');
            console.log('check', checkbox)
            if(checkbox.checked) {
                //console.log('123')
                $('#add_tag_input').css('border', '2px solid lightblue')
                $('#add_tag_input').removeAttr("disabled");
            } else {
                //console.log('456')
                $('#add_tag_input').css('border', '2px solid gray')
                $('#add_tag_input').attr("disabled","disabled");
            }
        })
        // console.log(tabbar);
        //$('.gap-[10px]').append(btn)
        //$('.gap-[10px]').append('123456')
        //console.log($('.gap-[10px]'))
    }
    function GetSelectTags(){
        if(JSON.stringify($('#headlessui-tabs-tab-3')) == '{}'){
            Toast('获取notion标签失败,正在重试')
            GetAllTags();
            return
        }
        let checkboxes = $('#tagcheckbox')[0]
        console.log(checkboxes)
        let selected = []
        for(let i = 0; i < checkboxes.length - 2; i++) {
            let item = checkboxes[i]
            if(item.checked){
                selected.push(item.name)
            }
        }
        let n = checkboxes.length;
        console.log(checkboxes)
        if(checkboxes[n - 2].checked) {
            selected.push(checkboxes[n - 1].value);
        }
        return selected
    }
    let my_text = '';
    let cnt = 3;
    let saved_set = new Set();
    let show_start = true
    let last = '';
    let init = '';
    console.log('DeepL translator logs auto save script start');
    Toast('翻译记录保存脚本启动~')
    GetAllTags();
    //let interval_tags = setInterval(AddTagSelectToPage, 2000);
    //AddTagSelectToPage();
    setInterval(function () {
        // 根据xpath获取文本框的值
        //let text = document.evaluate("/html/body/div[4]/main/div[6]/div[1]/div[2]/section[1]/div[3]/div[2]/d-textarea/div/p", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML;
        let text = $('#source-dummydiv').text().trim();
        let translation = $('#target-dummydiv').text().trim();

        //console.log('text', typeof(text), text.length, text);
        //console.log('translation', typeof(translation), translation.length, translation);
        let r = {'text': text, 'translation':translation};
        let rs = JSON.stringify(r)

        if(text.length == 0 || translation.length == 0) {
            return
        }
        if(init == ''){
            init = rs;
            last = rs;
        }
        if(rs == init) {
            return
        }
        init = '-1';

        if (last != rs) {
            cnt = 3;
            last = rs;
        } else {
            cnt -= 1;
            if(cnt == 0) {
                cnt = 3;
                if(!saved_set.has(rs)) {
                    saved_set.add(rs)
                    //console.log('new string', text);
                    //let translation = document.evaluate("/html/body/div[4]/main/div[6]/div[1]/div[2]/section[2]/div[3]/div[1]/d-textarea/div/p", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML;
                    Toast('翻译记录已自动上传~')
                    let select_tags = GetSelectTags();
                    //console.log('selected', select_tags)
                    SaveToRomote(text, translation, select_tags);
                    //Toast('翻译记录已保存~')
                } else {
                    console.log('chongfu', text, translation);
                }
            }
        }
    }, 1000);
})();

QingJ © 2025

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