Misskey Translation Script

A Translation Script for Misskey Note | 一个用于misskey贴文的翻译脚本

  1. // ==UserScript==
  2. // @name Misskey Translation Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.5
  5. // @description A Translation Script for Misskey Note | 一个用于misskey贴文的翻译脚本
  6. // @author dogcraft
  7. // @match https://m.dogcraft.cn/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. var ApiUrl = 'https://test1-api.dogcraft.top/ts/';
  12.  
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17.  
  18. console.log('Misskey Translate Script v2.4');
  19.  
  20. var cat = localStorage.getItem('lang');
  21. var vdog = localStorage.getItem('v');
  22. if (cat == null) {
  23. var lang_dog = navigator.language || navigator.userLanguage;
  24. } else {
  25. lang_dog = cat;
  26. }
  27. //获取浏览器的语言
  28. lang_dog = lang_dog.substr(0, 2);
  29.  
  30. function dog_add_fy(eldog) {
  31. //添加翻译按钮、区域以及绑定点击事件
  32. if (eldog.className == 'article') {
  33. dog_add_fy_old(eldog);
  34. return;
  35. }
  36. if (eldog.fanyi == 1) {
  37. // console.log('已经添加过了,重复添加。')
  38. } else {
  39. const dogbt = document.createElement('button');
  40. const btclass = Array.from(eldog.getElementsByTagName('footer')).slice(- 1)[0].childNodes[1].getAttribute('class')
  41. dogbt.setAttribute('class', btclass);
  42. const nicon = document.createElement('i');
  43. nicon.setAttribute('class', 'ti ti-language');
  44. dogbt.appendChild(nicon);
  45. Array.from(eldog.getElementsByTagName('footer')).slice(- 1)[0].appendChild(dogbt);
  46. dogbt.addEventListener('click', dog_fy); //绑定翻译函数
  47. const qhi = eldog.querySelector('div[style="container-type: inline-size;"]');
  48. var ctp;
  49. var ctix;
  50. if (qhi != null) {
  51. ctp = qhi;
  52. ctix = qhi.getElementsByTagName('div')[0];
  53. } else {
  54. const hui = eldog.childNodes[1].querySelector('span[style="white-space: pre-wrap;"]');
  55. ctp = hui.parentElement.parentElement;
  56. ctix = hui.parentElement;
  57. }
  58. ctix.setAttribute('neko', 'fanyi-cont');
  59. const fyc = document.createElement('div');
  60. fyc.setAttribute('class', 'fanyi');
  61. fyc.ct = 0;
  62. ctp.appendChild(fyc);
  63. eldog.fanyi = 1;
  64. }
  65. }
  66.  
  67. function dog_add_fy_old(eldog) {
  68. if (eldog.fanyi == 1) {
  69. // console.log('已经添加过了,重复添加。')
  70. return;
  71. }
  72. const dogbt = document.createElement("button");
  73. const btclass = Array.from(eldog.getElementsByTagName("footer")).slice(-1)[0].getElementsByClassName("button")[0].getAttribute("class")
  74. dogbt.setAttribute("class", btclass);
  75. const nicon = document.createElement("i");
  76. nicon.setAttribute("class", "ti ti-language");
  77. dogbt.appendChild(nicon);
  78. Array.from(eldog.getElementsByTagName("footer")).slice(-1)[0].appendChild(dogbt);
  79. dogbt.addEventListener('click', dog_fy);//绑定翻译函数
  80. const ctdog = eldog.getElementsByClassName('content')[0];
  81. const ydog = ctdog.getElementsByClassName('text')[0];
  82. ydog.setAttribute("neko", "fanyi-cont");
  83. const fyc = document.createElement("div");
  84. fyc.setAttribute("class", "fanyi");
  85. fyc.ct = 0;
  86. ctdog.appendChild(fyc);
  87. eldog.fanyi = 1;
  88. }
  89.  
  90.  
  91.  
  92. async function dog_fy() {
  93. //从后端获得翻译文本并写入到html中
  94. // console.log('翻译中');
  95. const pdog = this.parentElement.parentElement;
  96.  
  97. const ldog = pdog.getElementsByClassName('fanyi');
  98.  
  99. if (ldog) {
  100. const dog_fy_el = ldog[0];
  101. if (dog_fy_el.ct == 0) {
  102. console.log('还没有翻译');
  103. const hdog = pdog.querySelector('div[neko="fanyi-cont"]').innerText;
  104. post_dog = { 'c': hdog, 't': lang_dog };
  105. dog_fy_el.innerText = '正在翻译中……';
  106. uiy = await fetch(ApiUrl, {
  107. method: 'POST',
  108. body: JSON.stringify(post_dog),
  109. headers: new Headers({
  110. 'Content-Type': 'application/json'
  111. })
  112. });
  113. if (uiy.status == 200) {
  114. rt = await uiy.json();
  115. res_dog = rt.r;
  116. } else {
  117. res_dog = '接口不对劲';
  118. }
  119. dog_fy_el.innerText = `${res_dog}`;
  120. dog_fy_el.style.cssText = " margin-top: 1em; border: dashed 2px;border-radius: 10px;padding: 16px;";
  121. dog_fy_el.ct = 1
  122. this.childNodes[0].setAttribute("class", "ti ti-language-off");
  123. this.style = "color: red;";
  124.  
  125. } else {
  126. // console.log('已经翻译过了');
  127. if (dog_fy_el.ct == 2) {
  128. dog_fy_el.style.display = "";
  129. dog_fy_el.ct = 1;
  130. this.childNodes[0].setAttribute("class", "ti ti-language-off");
  131. this.style = "color: red;";
  132. } else if (dog_fy_el.ct == 1) {
  133. dog_fy_el.style.display = "none";
  134. dog_fy_el.ct = 2;
  135. this.childNodes[0].setAttribute("class", "ti ti-language");
  136. this.style = "color: blue;";
  137. }
  138. }
  139. } else {
  140. console.log('有地方不对劲');
  141. }
  142. }
  143.  
  144.  
  145.  
  146. var config = { attributes: false, childList: true, subtree: true };
  147. sj = []
  148. // 当观察到突变时执行的回调函数
  149. var callback = function (mutationsList) {
  150. mutationsList.forEach(function (item, index) {
  151. if (item.type == 'childList') {
  152. for (let iy_dog = 0; iy_dog < item.addedNodes.length; iy_dog++) {
  153. const iadog = item.addedNodes[iy_dog];
  154. if (iadog.getElementsByTagName == undefined) {
  155. // console.log('不是元素');
  156. } else {
  157. // console.log('是元素');
  158. sld = iadog.getElementsByTagName('article');
  159. if (sld.length > 0) {
  160. for (let ct_dog = 0; ct_dog < sld.length; ct_dog++) {
  161. const sdldog = sld[ct_dog];
  162. if (sdldog.parentElement.tagName != "A") {
  163. dog_add_fy(sdldog);
  164. } else {
  165. // console.log('不是要找的元素');
  166. }
  167. }
  168. }
  169. }
  170. }
  171. }
  172. });
  173. };
  174.  
  175.  
  176. function getar() {
  177. ar = document.getElementById('misskey_app');
  178. if (ar == null) {
  179. console.log("没找到,等一秒");
  180. setTimeout(getar, 1000);
  181. return null;
  182. }
  183. else {
  184. for (let si = 0; si < sl.length; si++) {
  185. const sl_dog = sl[si];
  186. if (sl_dog.parentElement.tagName != "A") {
  187. dog_add_fy(sl_dog);
  188. }
  189. }
  190. console.log("找到了");
  191. var observer = new MutationObserver(callback);
  192. observer.observe(ar, config);
  193. return "dog"
  194. }
  195. }
  196.  
  197.  
  198. window.onload = function () {
  199. console.log('页面加载完毕');
  200. sl = document.getElementsByTagName('article');
  201. getar();
  202. }
  203.  
  204. })();