Kirito Tools

mykirito.com 的界面調整,不包含任何自動操作。

  1. // ==UserScript==
  2. // @name Kirito Tools
  3. // @namespace yayaKiritoTools
  4. // @version 0.3.17
  5. // @description mykirito.com 的界面調整,不包含任何自動操作。
  6. // @author yaya
  7. // @include https://mykirito.com/*
  8. // @include https://kirito-1585904519813.appspot.com/*
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. // (詳細資料)顯示其他玩家的轉生點加成
  15. function addPointsToDetail(tableRows, playerData) {
  16. tableRows[4].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.hp > 0? "(+"+playerData.rattrs.hp*10+")" : ""}</span>`;
  17. tableRows[5].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.atk > 0? "(+"+playerData.rattrs.atk+")" : ""}</span>`;
  18. tableRows[6].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.def > 0? "(+"+playerData.rattrs.def+")" : ""}</span>`;
  19. tableRows[7].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.stm > 0? "(+"+playerData.rattrs.stm+")" : ""}</span>`;
  20. tableRows[8].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.agi > 0? "(+"+playerData.rattrs.agi+")" : ""}</span>`;
  21. tableRows[9].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.spd > 0? "(+"+playerData.rattrs.spd+")" : ""}</span>`;
  22. tableRows[10].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.tec > 0? "(+"+playerData.rattrs.tec+")" : ""}</span>`;
  23. tableRows[11].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.int > 0? "(+"+playerData.rattrs.int+")" : ""}</span>`;
  24. tableRows[12].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.lck > 0? "(+"+playerData.rattrs.lck+")" : ""}</span>`;
  25. }
  26.  
  27. // (能力比對)顯示其他玩家的轉生點加成
  28. function addPointsToCompare(myTr, myData, playerTr, playerData) {
  29. myTr[6].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.hp > 0? "(+"+myData.rattrs.hp*10+")" : ""}</span>`;
  30. myTr[7].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.atk > 0? "(+"+myData.rattrs.atk+")" : ""}</span>`;
  31. myTr[8].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.def > 0? "(+"+myData.rattrs.def+")" : ""}</span>`;
  32. myTr[9].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.stm > 0? "(+"+myData.rattrs.stm+")" : ""}</span>`;
  33. myTr[10].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.agi > 0? "(+"+myData.rattrs.agi+")" : ""}</span>`;
  34. myTr[11].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.spd > 0? "(+"+myData.rattrs.spd+")" : ""}</span>`;
  35. myTr[12].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.tec > 0? "(+"+myData.rattrs.tec+")" : ""}</span>`;
  36. myTr[13].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.int > 0? "(+"+myData.rattrs.int+")" : ""}</span>`;
  37. myTr[14].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${myData.rattrs.lck > 0? "(+"+myData.rattrs.lck+")" : ""}</span>`;
  38.  
  39. playerTr[6].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.hp > 0? "(+"+playerData.rattrs.hp*10+")" : ""}</span>`;
  40. playerTr[7].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.atk > 0? "(+"+playerData.rattrs.atk+")" : ""}</span>`;
  41. playerTr[8].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.def > 0? "(+"+playerData.rattrs.def+")" : ""}</span>`;
  42. playerTr[9].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.stm > 0? "(+"+playerData.rattrs.stm+")" : ""}</span>`;
  43. playerTr[10].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.agi > 0? "(+"+playerData.rattrs.agi+")" : ""}</span>`;
  44. playerTr[11].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.spd > 0? "(+"+playerData.rattrs.spd+")" : ""}</span>`;
  45. playerTr[12].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.tec > 0? "(+"+playerData.rattrs.tec+")" : ""}</span>`;
  46. playerTr[13].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.int > 0? "(+"+playerData.rattrs.int+")" : ""}</span>`;
  47. playerTr[14].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${playerData.rattrs.lck > 0? "(+"+playerData.rattrs.lck+")" : ""}</span>`;
  48. }
  49.  
  50. // (戰報)顯示雙方的轉生點加成
  51. function addPointsAndLinkToReport(atkTr, atkData, defTr, defData) {
  52. atkTr[6].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.hp > 0? "(+"+atkData.rattrs.hp*10+")" : ""}</span>`;
  53. atkTr[7].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.atk > 0? "(+"+atkData.rattrs.atk+")" : ""}</span>`;
  54. atkTr[8].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.def > 0? "(+"+atkData.rattrs.def+")" : ""}</span>`;
  55. atkTr[9].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.stm > 0? "(+"+atkData.rattrs.stm+")" : ""}</span>`;
  56. atkTr[10].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.agi > 0? "(+"+atkData.rattrs.agi+")" : ""}</span>`;
  57. atkTr[11].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.spd > 0? "(+"+atkData.rattrs.spd+")" : ""}</span>`;
  58. atkTr[12].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.tec > 0? "(+"+atkData.rattrs.tec+")" : ""}</span>`;
  59. atkTr[13].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.int > 0? "(+"+atkData.rattrs.int+")" : ""}</span>`;
  60. atkTr[14].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${atkData.rattrs.lck > 0? "(+"+atkData.rattrs.lck+")" : ""}</span>`;
  61.  
  62. defTr[6].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.hp > 0? "(+"+defData.rattrs.hp*10+")" : ""}</span>`;
  63. defTr[7].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.atk > 0? "(+"+defData.rattrs.atk+")" : ""}</span>`;
  64. defTr[8].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.def > 0? "(+"+defData.rattrs.def+")" : ""}</span>`;
  65. defTr[9].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.stm > 0? "(+"+defData.rattrs.stm+")" : ""}</span>`;
  66. defTr[10].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.agi > 0? "(+"+defData.rattrs.agi+")" : ""}</span>`;
  67. defTr[11].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.spd > 0? "(+"+defData.rattrs.spd+")" : ""}</span>`;
  68. defTr[12].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.tec > 0? "(+"+defData.rattrs.tec+")" : ""}</span>`;
  69. defTr[13].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.int > 0? "(+"+defData.rattrs.int+")" : ""}</span>`;
  70. defTr[14].querySelector("td").innerHTML += `<span style="color: rgb(0, 181, 181);"> ${defData.rattrs.lck > 0? "(+"+defData.rattrs.lck+")" : ""}</span>`;
  71. }
  72.  
  73. // 檢測是否爲行動裝置。目前已知手機版無法正常查看額外資訊也無法正常觸發通知。
  74. // 由於此腳本涉及請求,避免意料外的狀況,直接避免發送請求應是最穩妥的解法。
  75. // 正規參照:http://detectmobilebrowsers.com/ (2014)
  76. function mobileCheck() {
  77. let check = false;
  78. (function (a) {
  79. if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
  80. check = true;
  81. }
  82. })(navigator.userAgent || navigator.vendor || window.opera);
  83.  
  84. return check;
  85. };
  86.  
  87. // 表格底部訊息
  88. // type: (0 正常, 1 錯誤)
  89. function msg(str, type) {
  90. // 在表格底部添加訊息位
  91. if (document.querySelectorAll("div#root > div > div > div").length != 0 && document.querySelectorAll("div#us_msgArea").length == 0) {
  92. let html = `
  93. <div id="us_msgArea"></div>
  94. `;
  95. document.querySelector("div#root > div > div > div").insertAdjacentHTML("beforeend", html);
  96. }
  97.  
  98. let msgArea = document.querySelector("div#us_msgArea");
  99. msgArea.style.color = (type == 0) ? "green" : "red";
  100. msgArea.style.textAlign = "right";
  101. msgArea.innerHTML = `<b>${str}</b>`;
  102.  
  103. // 強制讓訊息置於表格底下(不然切換查看模式時會跳到表格上方)
  104. document.querySelector("div#root > div > div > div").insertAdjacentElement("beforeend", msgArea);
  105. }
  106.  
  107. // 計算總轉生點數
  108. function calcTotalPoints(rattrs) {
  109. let total = 0;
  110. for (let key in rattrs) {
  111. total += rattrs[key];
  112. }
  113.  
  114. return total;
  115. }
  116.  
  117. (async function () {
  118. 'use strict';
  119.  
  120. // 調整介面:使導航欄維持在頁面上方
  121. let root = document.querySelector("div#root");
  122. let navbar = document.querySelector("div#root > nav");
  123. let navbarHeight = navbar.offsetHeight;
  124. root.style.paddingTop = `calc(${navbarHeight}px + 18px)`; // height + margin bottom
  125. navbar.style.position = "fixed";
  126. navbar.style.top = "0";
  127.  
  128. // 必須是非行動裝置
  129. if (!mobileCheck()) {
  130. let frontend = await fetch("https://mykirito.com").then(r => r.text()).then(t => {
  131. return t.match(/frontend\.[0-9a-f]{8}.js/)[0];
  132. });
  133. let cds = await fetch(`https://mykirito.com/${frontend}`).then(r => r.text()).then(t => {
  134. return t.match(/;var\ .+?(\d\+?e\d);var\ .+?(\d+?e\d);var\ .+?(\d+?e\d);var\ .+?(\d+?e\d)/);
  135. });
  136. let token = localStorage.getItem("token");
  137. let myData = await fetch("https://mykirito.com/api/my-kirito", {
  138. "headers": {
  139. "accept": "application/json, text/plain, */*",
  140. "token": token
  141. },
  142. "referrer": "https://mykirito.com/",
  143. "referrerPolicy": "no-referrer-when-downgrade",
  144. "body": null,
  145. "method": "GET",
  146. "mode": "cors",
  147. "credentials": "omit"
  148. }).then(r =>
  149. r.json()
  150. );
  151.  
  152. let cdChallenge = cds[1] - 0;
  153. let cdChallengeRed = cds[2] - 0;
  154. let cdDoAction = cds[3] - 0;
  155. let notificationSeconds = 20;
  156. let levelExp = [0, 30, 60, 100, 150, 200, 250, 300, 370, 450, 500, 650, 800, 950, 1200, 1450, 1700, 1950, 2200, 2500, 2800, 3100, 3400, 3700, 4000, 4400, 4800, 5200, 5600, 6000, 6500, 7000, 7500, 8000, 8500, 9100, 9700, 10300, 11000, 11800, 12600, 13500, 14400, 15300, 16200, 17100, 18000, 19000, 20000, 21000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 37000, 39000, 41000, 44000, 47000, 53000, 56000, 59000, 62000, 65000, 68000, 71000, 74000];
  157.  
  158. document.querySelector("div#root").insertAdjacentHTML("afterend", `<div id="us_customSpace"></div>`);
  159.  
  160. if (Notification.permission == "default") {
  161. Notification.requestPermission();
  162. }
  163. if (GM_getValue("NotifiTime") == undefined) {
  164. GM_setValue("NotifiTime", "-1");
  165. }if (GM_getValue("NotidiTime") == undefined) {
  166. GM_setValue("NotidiTime", "-1");
  167. }
  168.  
  169. let url = "";
  170. let lastUrl = "";
  171. setInterval(window.onload = async function () {
  172. url = location.href;
  173.  
  174. if (GM_getValue("NotifiTime") != "-1" && Date.now() > GM_getValue("NotifiTime")) {
  175. new Notification(`還剩 ${notificationSeconds} 秒左右冷卻就結束了,可以準備打架啦!`);
  176. GM_setValue("NotifiTime", "-1");
  177. }else if (GM_getValue("NotidiTime") != "-1" && Date.now() > GM_getValue("NotidiTime")) {
  178. new Notification(`還剩 ${notificationSeconds} 秒左右冷卻就結束了,可以準備行動啦!`);
  179. GM_setValue("NotidiTime", "-1");
  180. }
  181.  
  182. if (url.includes("profile")) {
  183. // 在其他玩家頁面
  184. if (url != lastUrl) {
  185. lastUrl = url;
  186.  
  187. let playerId = url.match(/\/([0-9a-zA-Z]+?)$/)[1];
  188. let buttonTypes = document.querySelectorAll("div#root > div > div > div:nth-child(1) > button");
  189.  
  190. let playerData = await fetch(`https://mykirito.com/api/profile/${playerId}`, {
  191. "headers": {
  192. "token": token
  193. }
  194. }).then(
  195. r => r.json()
  196. ).then(
  197. t => t.profile
  198. ).catch(error => {
  199. msg("錯誤:請求玩家資料失敗", 1);
  200. return;
  201. });
  202.  
  203. // 哪個按鈕禁止點擊就表示在哪個查看類型
  204. let myTr, playerTr;
  205. if (buttonTypes[0].disabled) {
  206. // (初始化、詳細資料)顯示其他玩家的轉生點加成
  207. playerTr = document.querySelectorAll("div#root > div > div > div:nth-child(1) > table tr");
  208. addPointsToDetail(playerTr, playerData);
  209.  
  210. let defPts = calcTotalPoints(playerData.rattrs);
  211. msg(`轉生點資料解析完成,玩家總點數為(${defPts})`, 0);
  212. } else {
  213. // (初始化、能力比對)顯示其他玩家的轉生點加成
  214. myTr = document.querySelectorAll("div#root > div > div > div:nth-child(1) > div > table:nth-child(1) tr");
  215. playerTr = document.querySelectorAll("div#root > div > div > div:nth-child(1) > div > table:nth-child(2) tr");
  216. addPointsToCompare(myTr, myData, playerTr, playerData);
  217.  
  218. let atkPts = calcTotalPoints(myData.rattrs);
  219. let defPts = calcTotalPoints(playerData.rattrs);
  220. msg(`轉生點資料解析完成,雙方總點數為(${atkPts}, ${defPts})`, 0);
  221. }
  222.  
  223. // 事件監聽:切換查看類型的兩個按鈕
  224. buttonTypes[0].addEventListener("click", function () {
  225. let id = setInterval(() => {
  226. try {
  227. let tableRows = document.querySelectorAll("div#root > div > div > div:nth-child(1) > table tr");
  228. addPointsToDetail(tableRows, playerData);
  229.  
  230. let defPts = calcTotalPoints(playerData.rattrs);
  231. msg(`轉生點資料解析完成,玩家總點數為(${defPts})`, 0);
  232.  
  233. if (document.querySelectorAll("div#root > div > div > div:nth-child(1) > table tr span").length > 0) {
  234. clearInterval(id);
  235. }
  236. } catch (e) {}
  237. }, 100);
  238. });
  239. buttonTypes[1].addEventListener("click", function () {
  240. let id = setInterval(() => {
  241. try {
  242. playerTr = document.querySelectorAll("div#root > div > div > div:nth-child(1) > div > table:nth-child(2) tr");
  243. addPointsToCompare(myTr, myData, playerTr, playerData);
  244.  
  245. let atkPts = calcTotalPoints(myData.rattrs);
  246. let defPts = calcTotalPoints(playerData.rattrs);
  247. msg(`轉生點資料解析完成,雙方總點數為(${atkPts}, ${defPts})`, 0);
  248.  
  249. if (document.querySelectorAll("div#root > div > div > div:nth-child(1) > div > table:nth-child(2) tr span").length > 0) {
  250. clearInterval(id);
  251. }
  252. } catch (e) {}
  253. }, 100);
  254. });
  255.  
  256.  
  257. // 事件監聽:打架的四個按鈕
  258. let buttons = document.querySelectorAll("div#root > div > div > div:nth-child(2) > div:nth-last-child(1) button");
  259. buttons.forEach(button => {
  260. button.addEventListener("click", async () => {
  261. if (!button.disabled) {
  262. let start = Date.now();
  263.  
  264. let color = await fetch("https://mykirito.com/api/my-kirito", {
  265. "headers": {
  266. "accept": "application/json, text/plain, */*",
  267. "token": token
  268. },
  269. "referrer": "https://mykirito.com/",
  270. "referrerPolicy": "no-referrer-when-downgrade",
  271. "body": null,
  272. "method": "GET",
  273. "mode": "cors",
  274. "credentials": "omit"
  275. }).then(r =>
  276. r.json()
  277. ).then(j =>
  278. j.color
  279. );
  280.  
  281. let end = Date.now();
  282. if (color == "red") {
  283. let time = Date.now() + cdChallengeRed - (notificationSeconds * 1000) - (end - start);
  284. GM_setValue("NotifiTime", time);
  285. console.log("Notifi reg - R" + (cdChallengeRed - (notificationSeconds * 1000) - (end - start)));
  286. } else {
  287. let time = Date.now() + cdChallenge - (notificationSeconds * 1000) - (end - start);
  288. GM_setValue("NotifiTime", time);
  289. console.log("Notifi reg - N" + (cdChallenge - (notificationSeconds * 1000) - (end - start)));
  290. }
  291. }
  292. });
  293. });
  294. }
  295. } else if (url.match(/https:\/\/mykirito\.com\/?$/)) {
  296. // 在首頁
  297. if (url != lastUrl) {
  298. lastUrl = url;
  299.  
  300. let expTd = document.querySelector("div#root > div > div:nth-child(1) > div:nth-child(1) > table tr:nth-child(4) > td:nth-child(4)");
  301. let nextLevelReq = levelExp[myData.lv];
  302.  
  303. // 僅在等級變更時才需要更新資料(這裡靠原經驗值判斷)
  304. if (expTd.innerText >= nextLevelReq) {
  305. myData = await fetch("https://mykirito.com/api/my-kirito", {
  306. "headers": {
  307. "accept": "application/json, text/plain, */*",
  308. "token": token
  309. },
  310. "referrer": "https://mykirito.com/",
  311. "referrerPolicy": "no-referrer-when-downgrade",
  312. "body": null,
  313. "method": "GET",
  314. "mode": "cors",
  315. "credentials": "omit"
  316. }).then(r =>
  317. r.json()
  318. );
  319.  
  320. nextLevelReq = levelExp[myData.lv];
  321. }
  322.  
  323. expTd.innerText += ` / ${nextLevelReq}`;
  324.  
  325. // 事件監聽:行動的多個按鈕
  326. let buttons1 = document.querySelectorAll("div#root > div > div > div:nth-child(4) > button");
  327. let i;
  328. for (i=0;i<7;i++){
  329. buttons1[i].addEventListener("click", async () => {
  330. if (!buttons1[i].disabled) {
  331. let time1 = Date.now() + cdDoAction - (notificationSeconds * 1000);
  332. GM_setValue("NotidiTime", time1);
  333. console.log("Notidi reg - N" + (cdDoAction - (notificationSeconds * 1000)));
  334. }
  335. });
  336. }
  337. }
  338. } else if (url.match(/report\/[0-9a-f]+$/)) {
  339. // 在戰報頁面
  340. if (url != lastUrl) {
  341. lastUrl = url;
  342.  
  343. let reportId = url.match(/report\/([0-9a-f]+)$/)[1];
  344. let reportJson = await fetch(`https://storage.googleapis.com/kirito-1585904519813.appspot.com/reports2/${reportId}.json`).then(r => r.json());
  345.  
  346. let attackerTableRows = document.querySelectorAll("div#root > div > div > div > div > table:nth-child(1) tr");
  347. let defenderTableRows = document.querySelectorAll("div#root > div > div > div > div > table:nth-child(2) tr");
  348. // PlayerName: 4th, Abilities: 7th ~ 15th.
  349.  
  350. attackerTableRows[3].querySelector("td").innerHTML = `<a href="https://mykirito.com/profile/${reportJson.a.uid}">${reportJson.a.nickname}</a>`;
  351. defenderTableRows[3].querySelector("td").innerHTML = `<a href="https://mykirito.com/profile/${reportJson.b.uid}">${reportJson.b.nickname}</a>`;
  352.  
  353. let attackerData, defenderData;
  354. if (myData._id == reportJson.a.uid) {
  355. // 當自己為攻擊方時
  356. let playerId = reportJson.b.uid;
  357. attackerData = myData;
  358. defenderData = await fetch(`https://mykirito.com/api/profile/${playerId}`, {
  359. "headers": {
  360. "token": token
  361. }
  362. }).then(
  363. r => r.json()
  364. ).then(
  365. j => j.profile
  366. ).catch(error => {
  367. msg("錯誤:請求玩家資料失敗", 1);
  368. return;
  369. });
  370. } else if (myData._id == reportJson.b.uid) {
  371. // 當自己為防禦方時
  372. let playerId = reportJson.a.uid;
  373. attackerData = await fetch(`https://mykirito.com/api/profile/${playerId}`, {
  374. "headers": {
  375. "token": token
  376. }
  377. }).then(
  378. r => r.json()
  379. ).then(
  380. j => j.profile
  381. ).catch(error => {
  382. msg("錯誤:請求玩家資料失敗", 1);
  383. return;
  384. });
  385. defenderData = myData;
  386. } else {
  387. // 檢視別人的戰報
  388. let atkId = reportJson.a.uid;
  389. let defId = reportJson.b.uid;
  390.  
  391. attackerData = await await fetch(`https://mykirito.com/api/profile/${atkId}`, {
  392. "headers": {
  393. "token": token
  394. }
  395. }).then(
  396. r => r.json()
  397. ).then(
  398. j => j.profile
  399. ).catch(error => {
  400. msg("錯誤:請求攻擊方玩家資料失敗", 1);
  401. return;
  402. });
  403. defenderData = await fetch(`https://mykirito.com/api/profile/${defId}`, {
  404. "headers": {
  405. "token": token
  406. }
  407. }).then(
  408. r => r.json()
  409. ).then(
  410. j => j.profile
  411. ).catch(error => {
  412. msg("錯誤:請求防禦方玩家資料失敗", 1);
  413. return;
  414. });
  415. }
  416.  
  417. addPointsAndLinkToReport(attackerTableRows, attackerData, defenderTableRows, defenderData);
  418.  
  419. let atkPts = calcTotalPoints(attackerData.rattrs);
  420. let defPts = calcTotalPoints(defenderData.rattrs);
  421. msg(`轉生點資料解析完成,雙方總點數為(${atkPts}, ${defPts})`, 0);
  422. }
  423. } else {
  424. lastUrl = "";
  425. }
  426. }, 100);
  427. } else {
  428. console.log("這個腳本的查看對手配點與對戰提醒的功能不支援行動裝置");
  429. }
  430. })();

QingJ © 2025

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