// ==UserScript== // @name DeepL翻译记录自动保存 // @namespace http://tampermonkey.net/ // @version 2.0 // @description 将三秒内未变化的原始文本和翻译文本上传至notion对应页面(附带tag) // @author ziuch // @match https://www.deepl.com/* // @icon https://static.deepl.com/img/logo/DeepL_Logo_darkBlue_v2.svg // @grant GM_xmlhttpRequest // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/459564/DeepL%E7%BF%BB%E8%AF%91%E8%AE%B0%E5%BD%95%E8%87%AA%E5%8A%A8%E4%BF%9D%E5%AD%98.user.js // @updateURL https://update.greasyfork.icu/scripts/459564/DeepL%E7%BF%BB%E8%AF%91%E8%AE%B0%E5%BD%95%E8%87%AA%E5%8A%A8%E4%BF%9D%E5%AD%98.meta.js // ==/UserScript== (function() { 'use strict'; let token = window.localStorage.NOTION_TOKEN || '' let database_id = window.localStorage.NOTION_DATABASE_ID || '' console.log('localstorge', window.localStorage) console.log('token', token) // Your code here... //提示信息 封装 function Toast(msg, is_wrong = false, duration = 3000){ var m = document.createElement('div'); m.innerHTML = msg; let backgroundColor = is_wrong ? 'rgba(229,194,102, 0.8)' : 'rgba(48,111,112, 0.8)' m.style.cssText=`font-size: .45rem;color: rgb(255, 255, 255);background-color: ${backgroundColor};padding: 10px 15px; margin: 5 auto; top:85px; left:50%;transform: translate(-50%, -50%); border-radius: 4px; max-width: 80%; position: absolute; z-index:9999;text-align: center;`; m.setAttribute("class","text-sm font-semibold text-white") let card = $('#dl_translator') card.prepend(m); setTimeout(function() { var d = 0.5; m.style.opacity = '0'; setTimeout(function() { card.remove(m) }, d*1000); }, duration); } function SaveToRomote(text, translation, tags){ console.log('上传成功!'); console.log('save tags', tags); let data = { 'parent': { "database_id": database_id }, 'properties':{ "Text": { 'title': [ { 'text': { 'content': text, 'link': null }, 'plain_text': text, }, ], }, "Translation": { "rich_text": [ { "text": { "content": translation } } ] }, "Tags": { "multi_select": tags } }, } GM_xmlhttpRequest({ method: 'POST', url: `https://api.notion.com/v1/pages`, data: JSON.stringify(data), headers: { 'Authorization': 'Bearer ' + token, "accept": "application/json", "content-type": "application/json", "Notion-Version": "2022-06-28" }, onload: response => { if(response.status != 200) { console.log(response.response) Toast(response.status + ': ' + response.responseText, true); return } Toast('翻译记录自动保存成功~'); console.log('保存成功')} }); } let tags = [] function GetAllTags(){ GM_xmlhttpRequest({ method: 'GET', url: `https://api.notion.com/v1/databases/${database_id}`, responseType: 'json', timeout: 6000, headers: { 'Authorization': 'Bearer ' + token, "accept": "application/json", "Notion-Version": "2022-06-28" }, onload: response => { if(response.status != 200) { console.log(response.response) Toast(response.status + ': ' + response.responseText, true); return } tags = response.response.properties.Tags.multi_select.options Toast('获取notion标签成功~'); AddTagSelectToPage(); } }); } let flag = true function AddTagSelectToPage(){ if(JSON.stringify($('#headlessui-tabs-tab-3')) != '{}'){ return } console.log('tags', tags); let tagCheckStr = '
'; for(let i = 0; i < tags.length; i++) { let tag = tags[i] let margin = i == 0 ? '' : "'margin-left: 5px !important'" tagCheckStr += `` } tagCheckStr += `` tagCheckStr += '
' var $btn = ` ` let tabbar = $('#headlessui-tabs-tab-2') if(typeof(tabbar) == undefined) { return } flag = false tabbar.after($btn); $("#add_tag_checkbox").change(function(){ let checkbox = document.getElementById('add_tag_checkbox'); console.log('check', checkbox) if(checkbox.checked) { $('#add_tag_input').css('border', '2px solid lightblue') $('#add_tag_input').removeAttr("disabled"); } else { $('#add_tag_input').css('border', '2px solid gray') $('#add_tag_input').attr("disabled","disabled"); } }) } let click_github = false; function AddSettiongToPage(){ var $btn = ` ` let tabbar = $('.flex.flex-row') console.log('tabbar', tabbar) if(typeof(tabbar) == undefined) { return } flag = false tabbar.append($btn); $("#inner").click(function(){ click_github = true //location.href = 'https://github.com/zhiqing0205/deepl-translation-log-to-notion' window.open('https://github.com/zhiqing0205/deepl-translation-log-to-notion', "_blank") }) $("#headlessui-tabs-tab-4").click(function(){ setTimeout(() => { if(click_github) { click_github = false return } let input_token = prompt("请填入token值", token); let input_database_id = prompt("请填入database_id值", database_id); window.localStorage.NOTION_TOKEN = input_token || token window.localStorage.NOTION_DATABASE_ID = input_database_id || database_id Toast('配置成功~') setTimeout(location.reload(), 1000) }, 50) }) } 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({'name': item.name}) } } let n = checkboxes.length; console.log(checkboxes) if(checkboxes[n - 2].checked) { selected.push({'name': 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(); setTimeout(AddSettiongToPage, 2500); setInterval(function () { let text = $('#source-dummydiv').text().trim(); let translation = $('#target-dummydiv').text().trim(); 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) Toast('翻译记录已自动上传~') let select_tags = GetSelectTags(); SaveToRomote(text, translation, select_tags); } else { console.log('chongfu', text, translation); } } } }, 1000); })();