[E/Ex-Hentai] AutoLogin

E/Ex - 共享帳號登入、自動獲取 Cookies、手動輸入 Cookies、本地備份以及查看備份,自動檢測登入

Fra og med 15.09.2024. Se den nyeste version.

  1. // ==UserScript==
  2. // @name [E/Ex-Hentai] AutoLogin
  3. // @name:zh-TW [E/Ex-Hentai] 自動登入
  4. // @name:zh-CN [E/Ex-Hentai] 自动登入
  5. // @name:ja [E/Ex-Hentai] 自動ログイン
  6. // @name:ko [E/Ex-Hentai] 자동 로그인
  7. // @name:en [E/Ex-Hentai] AutoLogin
  8. // @version 0.0.31
  9. // @author Canaan HS
  10. // @description E/Ex - 共享帳號登入、自動獲取 Cookies、手動輸入 Cookies、本地備份以及查看備份,自動檢測登入
  11. // @description:zh-TW E/Ex - 共享帳號登入、自動獲取 Cookies、手動輸入 Cookies、本地備份以及查看備份,自動檢測登入
  12. // @description:zh-CN E/Ex - 共享帐号登录、自动获取 Cookies、手动输入 Cookies、本地备份以及查看备份,自动检测登录
  13. // @description:ja E/Ex - 共有アカウントでのログイン、クッキーの自动取得、クッキーの手动入力、ローカルバックアップおよびバックアップの表示、自动ログインの検出
  14. // @description:ko E/Ex - 공유 계정 로그인, 자동으로 쿠키 가져오기, 쿠키 수동 입력, 로컬 백업 및 백업 보기, 자동 로그인 감지
  15. // @description:en E/Ex - Shared account login, automatic cookie retrieval, manual cookie input, local backup, and backup viewing, automatic login detection
  16.  
  17. // @connect *
  18. // @match *://e-hentai.org/*
  19. // @match *://exhentai.org/*
  20. // @icon https://e-hentai.org/favicon.ico
  21.  
  22. // @license MIT
  23. // @namespace https://greasyfork.org/users/989635
  24.  
  25. // @run-at document-start
  26. // @grant GM_setValue
  27. // @grant GM_getValue
  28. // @grant GM_notification
  29. // @grant GM_xmlhttpRequest
  30. // @grant GM_getResourceText
  31. // @grant GM_registerMenuCommand
  32. // @grant GM_unregisterMenuCommand
  33. // @grant GM_addValueChangeListener
  34.  
  35. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
  36. // @require https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.19.0/js/md5.min.js
  37. // @require https://update.greasyfork.org/scripts/495339/1413531/ObjectSyntax_min.js
  38. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.9/jquery.jgrowl.min.js
  39. // @resource jgrowl-css https://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.9/jquery.jgrowl.min.css
  40. // ==/UserScript==
  41. (async () => {
  42. const Lang = Language(Syn.Device.Lang);
  43. const domain = Syn.Device.Host;
  44. const CKOP = CookieFactory();
  45. new class AutoLogin {
  46. constructor() {
  47. this.modal = null;
  48. this.Share = Syn.Store("g", "Share") ?? this.UpdateShared();
  49. this.on = async (element, type, listener) => {
  50. $(element).on(type, listener);
  51. };
  52. this.Growl = async (message, theme, life) => {
  53. $.jGrowl(`  ${message}  `, {
  54. theme: theme,
  55. life: life
  56. });
  57. };
  58. this.CreateDetection = () => {
  59. const detection = $(".modal-background");
  60. detection[0] && detection.remove();
  61. };
  62. this.CreateMenu = async () => {
  63. $(document.body).append(this.modal);
  64. requestAnimationFrame(() => {
  65. $(".modal-background").css({
  66. opacity: "1",
  67. "background-color": "rgba(0,0,0,0.7)",
  68. transform: "translate(-50%, -50%) scale(1)"
  69. });
  70. });
  71. };
  72. this.DeleteMenu = async () => {
  73. const modal = $(".modal-background");
  74. modal.css({
  75. opacity: "0",
  76. "pointer-events": "none",
  77. "background-color": "rgba(0,0,0,0)",
  78. transform: "translate(-50%, -50%) scale(0)"
  79. });
  80. setTimeout(() => {
  81. modal.remove();
  82. }, 1300);
  83. };
  84. this.GlobalMenuToggle = async () => {
  85. Syn.StoreListen(["Expand"], listen => {
  86. listen.far && this.MenuToggle();
  87. });
  88. };
  89. this.MenuToggle = async () => {
  90. const state = Syn.Store("g", "Expand", false), disp = state ? Lang.Transl("📁 摺疊菜單") : Lang.Transl("📂 展開菜單");
  91. Syn.Menu({
  92. [disp]: {
  93. func: () => {
  94. state ? Syn.Store("s", "Expand", false) : Syn.Store("s", "Expand", true);
  95. this.MenuToggle();
  96. },
  97. hotkey: "c",
  98. close: false
  99. }
  100. }, "Switch");
  101. state ? this.Expand() : this.Collapse();
  102. };
  103. this.Expand = async () => {
  104. Syn.Menu({
  105. [Lang.Transl("📜 自動獲取")]: {
  106. func: () => this.GetCookieAutomatically()
  107. },
  108. [Lang.Transl("📝 手動輸入")]: {
  109. func: () => this.ManualSetting()
  110. },
  111. [Lang.Transl("🔍 查看保存")]: {
  112. func: () => this.ViewSaveCookie()
  113. },
  114. [Lang.Transl("🔃 手動注入")]: {
  115. func: () => this.CookieInjection()
  116. },
  117. [Lang.Transl("🗑️ 清除登入")]: {
  118. func: () => this.ClearLogin()
  119. }
  120. }, "Expand");
  121. };
  122. this.Collapse = async () => {
  123. for (let i = 1; i <= 5; i++) {
  124. GM_unregisterMenuCommand("Expand-" + i);
  125. }
  126. };
  127. }
  128. async Main() {
  129. let CurrentTime = new Date(), DetectionTime = Syn.Storage("DetectionTime", {
  130. type: localStorage
  131. });
  132. DetectionTime = DetectionTime ? new Date(DetectionTime) : new Date(CurrentTime.getTime() + 11 * 60 * 1e3);
  133. const Conversion = Math.abs(DetectionTime - CurrentTime) / (1e3 * 60);
  134. if (Conversion >= 10) {
  135. const cookie = Syn.Store("gj", "E/Ex_Cookies");
  136. cookie && CKOP.Verify(cookie);
  137. }
  138. Syn.Menu({
  139. [Lang.Transl("🍪 共享登入")]: {
  140. func: () => this.SharedLogin()
  141. }
  142. });
  143. this.MenuToggle();
  144. this.GlobalMenuToggle();
  145. }
  146. async GetSharedDict() {
  147. return new Promise((resolve, reject) => {
  148. GM_xmlhttpRequest({
  149. method: "GET",
  150. responseType: "json",
  151. url: "https://raw.githubusercontent.com/Canaan-HS/Script-DataBase/main/Share/ExShare.json",
  152. onload: response => {
  153. if (response.status === 200) {
  154. const data = response.response;
  155. if (typeof data === "object" && Object.keys(data).length > 0) {
  156. resolve(data);
  157. } else {
  158. console.error(Lang.Transl("請求為空數據"));
  159. resolve({});
  160. }
  161. } else {
  162. console.error(Lang.Transl("連線異常,更新地址可能是錯的"));
  163. resolve({});
  164. }
  165. },
  166. onerror: error => {
  167. console.error(Lang.Transl("請求錯誤: "), error);
  168. resolve({});
  169. }
  170. });
  171. });
  172. }
  173. async UpdateShared() {
  174. const Shared = await this.GetSharedDict();
  175. if (Object.keys(Shared).length > 0) {
  176. const localHash = md5(JSON.stringify(Syn.Store("g", "Share", {})));
  177. const remoteHash = md5(JSON.stringify(Shared));
  178. if (localHash !== remoteHash) {
  179. this.Share = Shared;
  180. Syn.Store("s", "Share", Shared);
  181. this.Growl(Lang.Transl("共享數據更新完成"), "jGrowl", 1500);
  182. const modal = Syn.$$(".modal-background");
  183. if (modal) {
  184. setTimeout(() => {
  185. modal.remove();
  186. this.SharedLogin();
  187. }, 600);
  188. }
  189. } else {
  190. this.Growl(Lang.Transl("共享數據無需更新"), "jGrowl", 1500);
  191. }
  192. } else {
  193. Syn.Store("s", "Share", {});
  194. this.Growl(Lang.Transl("共享數據獲取失敗"), "jGrowl", 1500);
  195. }
  196. }
  197. async SharedLogin() {
  198. this.CreateDetection();
  199. const Share = this.Share, AccountQuantity = Object.keys(Share).length, Igneous = CKOP.Get().igneous;
  200. let Select = $(`<select id="account-select" class="acc-select"></select>`), Value;
  201. for (let i = 1; i <= AccountQuantity; i++) {
  202. if (Share[i][0].value == Igneous) {
  203. Value = i;
  204. }
  205. Select.append($("<option>").attr({
  206. value: i
  207. }).text(`${Lang.Transl("帳戶")} ${i}`));
  208. }
  209. this.modal = $(`
  210. <div class="modal-background">
  211. <div class="acc-modal">
  212. <h1>${Lang.Transl("帳戶選擇")}</h1>
  213. <div class="acc-select-flex">${Select.prop("outerHTML")}</div>
  214. <div class="acc-button-flex">
  215. <button class="modal-button" id="update">${Lang.Transl("更新")}</button>
  216. <button class="modal-button" id="login">${Lang.Transl("登入")}</button>
  217. </div>
  218. </div>
  219. </div>
  220. `);
  221. this.CreateMenu();
  222. Value && $("#account-select").val(Value);
  223. const self = this;
  224. self.on(".modal-background", "click", function (click) {
  225. click.stopImmediatePropagation();
  226. const target = click.target;
  227. if (target.id == "login") {
  228. CKOP.ReAdd(Share[+$("#account-select").val()]);
  229. } else if (target.id == "update") {
  230. self.UpdateShared();
  231. } else if (target.className == "modal-background") {
  232. self.DeleteMenu();
  233. }
  234. });
  235. }
  236. async GetCookieAutomatically() {
  237. let cookie_box = [];
  238. for (const [name, value] of Object.entries(CKOP.Get())) {
  239. cookie_box.push({
  240. name: name,
  241. value: value
  242. });
  243. }
  244. cookie_box.length > 1 ? this.Cookie_Show(JSON.stringify(cookie_box, null, 4)) : alert(Lang.Transl("未獲取到 Cookies !!\n\n請先登入帳戶"));
  245. }
  246. async Cookie_Show(cookies) {
  247. this.CreateDetection();
  248. this.modal = `
  249. <div class="modal-background">
  250. <div class="show-modal">
  251. <h1 style="text-align: center;">${Lang.Transl("確認選擇的 Cookies")}</h1>
  252. <pre><b>${cookies}</b></pre>
  253. <div style="text-align: right;">
  254. <button class="modal-button" id="save">${Lang.Transl("確認保存")}</button>
  255. <button class="modal-button" id="close">${Lang.Transl("取消退出")}</button>
  256. </div>
  257. </div>
  258. </div>
  259. `;
  260. this.CreateMenu();
  261. const self = this;
  262. self.on(".modal-background", "click", function (click) {
  263. click.stopImmediatePropagation();
  264. const target = click.target;
  265. if (target.id == "save") {
  266. Syn.Store("s", "E/Ex_Cookies", cookies);
  267. self.Growl(Lang.Transl("保存成功!"), "jGrowl", 1500);
  268. self.DeleteMenu();
  269. } else if (target.className == "modal-background" || target.id == "close") {
  270. self.DeleteMenu();
  271. }
  272. });
  273. }
  274. async ManualSetting() {
  275. this.CreateDetection();
  276. this.modal = `
  277. <div class="modal-background">
  278. <div class="set-modal">
  279. <h1>${Lang.Transl("設置 Cookies")}</h1>
  280. <form id="set_cookies">
  281. <div id="input_cookies" class="set-box">
  282. <label>[igneous]:</label><input class="set-list" type="text" name="igneous" placeholder="${Lang.Transl("要登入 Ex 才需要填寫")}"><br>
  283. <label>[ipb_member_id]:</label><input class="set-list" type="text" name="ipb_member_id" placeholder="${Lang.Transl("必填項目")}" required><br>
  284. <label>[ipb_pass_hash]:</label><input class="set-list" type="text" name="ipb_pass_hash" placeholder="${Lang.Transl("必填項目")}" required><hr>
  285. <h3>${Lang.Transl("下方選填 也可不修改")}</h3>
  286. <label>[sl]:</label><input class="set-list" type="text" name="sl" value="dm_2"><br>
  287. <label>[sk]:</label><input class="set-list" type="text" name="sk"><br>
  288. </div>
  289. <button type="submit" class="modal-button" id="save">${Lang.Transl("確認保存")}</button>
  290. <button class="modal-button" id="close">${Lang.Transl("退出選單")}</button>
  291. </form>
  292. </div>
  293. </div>
  294. `;
  295. this.CreateMenu();
  296. let cookie;
  297. const textarea = $("<textarea>").attr({
  298. style: "margin: 1.15rem auto 0 auto",
  299. rows: 18,
  300. cols: 40,
  301. readonly: true
  302. }), self = this;
  303. self.on("#set_cookies", "submit", function (submit) {
  304. submit.preventDefault();
  305. submit.stopImmediatePropagation();
  306. const cookie_list = Array.from($("#set_cookies .set-list")).map(function (input) {
  307. const value = $(input).val();
  308. return value.trim() !== "" ? {
  309. name: $(input).attr("name"),
  310. value: value
  311. } : null;
  312. }).filter(Boolean);
  313. cookie = JSON.stringify(cookie_list, null, 4);
  314. textarea.val(cookie);
  315. $("#set_cookies div").append(textarea);
  316. self.Growl(Lang.Transl("[確認輸入正確]按下退出選單保存"), "jGrowl", 3e3);
  317. });
  318. self.on(".modal-background", "click", function (click) {
  319. click.stopImmediatePropagation();
  320. const target = click.target;
  321. if (target.className == "modal-background" || target.id == "close") {
  322. click.preventDefault();
  323. cookie && Syn.Store("s", "E/Ex_Cookies", cookie);
  324. self.DeleteMenu();
  325. }
  326. });
  327. }
  328. async ViewSaveCookie() {
  329. this.CreateDetection();
  330. this.modal = `
  331. <div class="modal-background">
  332. <div class="set-modal">
  333. <h1>${Lang.Transl("當前設置 Cookies")}</h1>
  334. <div id="view_cookies" style="margin: 0.6rem"></div>
  335. <button class="modal-button" id="save">${Lang.Transl("更改保存")}</button>
  336. <button class="modal-button" id="close">${Lang.Transl("退出選單")}</button>
  337. </div>
  338. </div>
  339. `;
  340. this.CreateMenu();
  341. const cookie = Syn.Store("gj", "E/Ex_Cookies");
  342. const textarea = $("<textarea>").attr({
  343. rows: 20,
  344. cols: 50,
  345. id: "view_SC",
  346. style: "margin-top: 1.25rem;"
  347. }), self = this;
  348. textarea.val(JSON.stringify(cookie, null, 4));
  349. $("#view_cookies").append(textarea);
  350. self.on(".modal-background", "click", function (click) {
  351. click.stopImmediatePropagation();
  352. const target = click.target;
  353. if (target.id == "save") {
  354. GM_notification({
  355. title: Lang.Transl("變更通知"),
  356. text: Lang.Transl("已保存變更"),
  357. image: "https://cdn-icons-png.flaticon.com/512/5234/5234222.png",
  358. timeout: 3e3
  359. });
  360. Syn.Store("sj", "E/Ex_Cookies", JSON.parse($("#view_SC").val()));
  361. self.DeleteMenu();
  362. } else if (target.className == "modal-background" || target.id == "close") {
  363. self.DeleteMenu();
  364. }
  365. });
  366. }
  367. async CookieInjection() {
  368. try {
  369. CKOP.ReAdd(Syn.Store("gj", "E/Ex_Cookies"));
  370. } catch (error) {
  371. alert(Lang.Transl("未檢測到可注入的 Cookies !!\n\n請從選單中進行設置"));
  372. }
  373. }
  374. async ClearLogin() {
  375. CKOP.Delete();
  376. location.reload();
  377. }
  378. }().Main();
  379. new class Style {
  380. async Import() {
  381. let show_style, button_style, button_hover, jGrowl_style, acc_style;
  382. if (domain == "e-hentai.org") {
  383. button_hover = "color: #8f4701;";
  384. jGrowl_style = "background-color: #5C0D12; color: #fefefe;";
  385. show_style = "background-color: #fefefe; border: 3px ridge #34353b;";
  386. acc_style = "color: #5C0D12; background-color: #fefefe; border: 2px solid #B5A4A4;";
  387. button_style = "color: #5C0D12; border: 2px solid #B5A4A4; background-color: #fefefe;";
  388. } else if (domain == "exhentai.org") {
  389. button_hover = "color: #989898;";
  390. jGrowl_style = "background-color: #fefefe; color: #5C0D12;";
  391. show_style = "background-color: #34353b; border: 2px ridge #5C0D12;";
  392. acc_style = "color: #f1f1f1; background-color: #34353b; border: 2px solid #8d8d8d;";
  393. button_style = "color: #fefefe; border: 2px solid #8d8d8d; background-color: #34353b;";
  394. Syn.AddStyle(`
  395. body {
  396. padding: 2px;
  397. color: #f1f1f1;
  398. text-align: center;
  399. background: #34353b;
  400. }
  401. `);
  402. }
  403. Syn.AddStyle(`
  404. ${GM_getResourceText("jgrowl-css")}
  405. .jGrowl {
  406. ${jGrowl_style}
  407. top: 2rem;
  408. left: 50%;
  409. width: auto;
  410. z-index: 9999;
  411. font-size: 1.3rem;
  412. border-radius: 2px;
  413. text-align: center;
  414. white-space: nowrap;
  415. transform: translateX(-50%);
  416. }
  417. .modal-background {
  418. top: 50%;
  419. left: 50%;
  420. opacity: 0;
  421. width: 100%;
  422. height: 100%;
  423. z-index: 8888;
  424. overflow: auto;
  425. position: fixed;
  426. transition: 0.6s ease;
  427. background-color: rgba(0,0,0,0);
  428. transform: translate(-50%, -50%) scale(0.3);
  429. }
  430. .acc-modal {
  431. ${show_style}
  432. width: 18%;
  433. overflow: auto;
  434. margin: 11rem auto;
  435. border-radius: 10px;
  436. }
  437. .acc-select-flex {
  438. display: flex;
  439. align-items: center;
  440. flex-direction: initial;
  441. justify-content: space-around;
  442. }
  443. .acc-button-flex {
  444. display: flex;
  445. padding: 0 0 15px 0;
  446. justify-content: center;
  447. }
  448. .acc-select {
  449. ${acc_style}
  450. width: 10rem;
  451. padding: 4px;
  452. margin: 1.1rem 1.4rem 1.5rem 1.4rem;
  453. font-weight: bold;
  454. cursor: pointer;
  455. font-size: 1.2rem;
  456. text-align: center;
  457. border-radius: 5px;
  458. }
  459. .show-modal {
  460. ${show_style}
  461. width: 25%;
  462. padding: 1.5rem;
  463. overflow: auto;
  464. margin: 5rem auto;
  465. text-align: left;
  466. border-radius: 10px;
  467. border-collapse: collapse;
  468. }
  469. .modal-button {
  470. ${button_style}
  471. top: 0;
  472. margin: 3% 2%;
  473. font-size: 14px;
  474. font-weight: bold;
  475. border-radius: 3px;
  476. }
  477. .modal-button:hover, .modal-button:focus {
  478. ${button_hover}
  479. cursor: pointer;
  480. text-decoration: none;
  481. }
  482. .set-modal {
  483. ${show_style}
  484. width: 35rem;
  485. padding: 0.3rem;
  486. overflow: auto;
  487. border-radius: 10px;
  488. text-align: center;
  489. border-collapse: collapse;
  490. margin: 2% auto 8px auto;
  491. }
  492. .set-box {
  493. display: flex;
  494. margin: 0.6rem;
  495. font-weight: bold;
  496. flex-direction: column;
  497. align-items: flex-start;
  498. }
  499. .set-list {
  500. width: 95%;
  501. font-weight: 550;
  502. font-size: 1.1rem;
  503. text-align: center;
  504. }
  505. hr {
  506. width: 98%;
  507. opacity: 0.2;
  508. border: 1px solid;
  509. margin-top: 1.3rem;
  510. }
  511. label {
  512. margin: 0.4rem;
  513. font-size: 0.9rem;
  514. }
  515. `);
  516. }
  517. }().Import();
  518. function CookieFactory() {
  519. let Cookie = undefined;
  520. const Today = new Date();
  521. Today.setFullYear(Today.getFullYear() + 1);
  522. const Expires = Today.toUTCString();
  523. const UnixUTC = new Date(0).toUTCString();
  524. let RequiredCookie = ["ipb_member_id", "ipb_pass_hash"];
  525. if (domain == "exhentai.org") RequiredCookie.unshift("igneous");
  526. return {
  527. Get: () => {
  528. return document.cookie.split("; ").reduce((acc, cookie) => {
  529. const [name, value] = cookie.split("=");
  530. acc[decodeURIComponent(name)] = decodeURIComponent(value);
  531. return acc;
  532. }, {});
  533. },
  534. Add: function (CookieObject) {
  535. Syn.Storage("DetectionTime", {
  536. type: localStorage,
  537. value: new Date().getTime()
  538. });
  539. for (Cookie of CookieObject) {
  540. document.cookie = `${encodeURIComponent(Cookie.name)}=${encodeURIComponent(Cookie.value)}; domain=.${domain}; path=/; expires=${Expires};`;
  541. }
  542. location.reload();
  543. },
  544. Delete: function () {
  545. Object.keys(this.Get()).forEach(Name => {
  546. document.cookie = `${Name}=; expires=${UnixUTC}; path=/;`;
  547. document.cookie = `${Name}=; expires=${UnixUTC}; path=/; domain=.${domain}`;
  548. });
  549. },
  550. ReAdd: function (Cookies) {
  551. this.Delete();
  552. this.Add(Cookies);
  553. },
  554. Verify: function (Cookies) {
  555. const Cookie = this.Get();
  556. const VCookie = new Set(Object.keys(Cookie));
  557. const Result = RequiredCookie.every(key => VCookie.has(key) && Cookie[key] !== "mystery");
  558. if (!Result) {
  559. this.ReAdd(Cookies);
  560. } else {
  561. Syn.Storage("DetectionTime", {
  562. type: localStorage,
  563. value: new Date().getTime()
  564. });
  565. }
  566. }
  567. };
  568. }
  569. function Language(lang) {
  570. const Word = {
  571. Traditional: {},
  572. Simplified: {
  573. "🍪 共享登入": "🍪 共享登录",
  574. "📂 展開菜單": "📂 展开菜单",
  575. "📁 摺疊菜單": "📁 折叠菜单",
  576. "📜 自動獲取": "📜 自动获取",
  577. "📝 手動輸入": "📝 手动输入",
  578. "🔍 查看保存": "🔍 查看保存",
  579. "🔃 手動注入": "🔃 手动注入",
  580. "🗑️ 清除登入": "🗑️ 清除登录",
  581. "帳戶": "账户",
  582. "更新": "更新",
  583. "登入": "登录",
  584. "確認選擇的 Cookies": "确认选择的 Cookies",
  585. "確認保存": "确认保存",
  586. "取消退出": "取消退出",
  587. "退出選單": "退出菜单",
  588. "保存成功!": "保存成功!",
  589. "更改保存": "更改保存",
  590. "變更通知": "变更通知",
  591. "已保存變更": "已保存变更",
  592. "設置 Cookies": "设置 Cookies",
  593. "要登入 Ex 才需要填寫": "要登录 Ex 才需要填写",
  594. "必填項目": "必填项目",
  595. "下方選填 也可不修改": "下方选填 也可不修改",
  596. "[確認輸入正確]按下退出選單保存": "[确认输入正确]按下退出菜单保存",
  597. "當前設置 Cookies": "当前设置 Cookies",
  598. "帳戶選擇": "账户选择",
  599. "未獲取到 Cookies !!\n\n請先登入帳戶": "未获取到 Cookies !!\n\n请先登录账户",
  600. "未檢測到可注入的 Cookies !!\n\n請從選單中進行設置": "未检测到可注入的 Cookies !!\n\n请从菜单中进行设置",
  601. "共享數據更新完成": "共享数据更新完成",
  602. "共享數據無需更新": "共享数据无需更新",
  603. "共享數據獲取失敗": "共享数据获取失败",
  604. "請求為空數據": "请求为空数据",
  605. "連線異常,更新地址可能是錯的": "连接异常,更新地址可能是错的",
  606. "請求錯誤: ": "请求错误: "
  607. },
  608. English: {
  609. "🍪 共享登入": "🍪 Shared Login",
  610. "📂 展開菜單": "📂 Expand Menu",
  611. "📁 摺疊菜單": "📁 Collapse Menu",
  612. "📜 自動獲取": "📜 Auto Retrieve",
  613. "📝 手動輸入": "📝 Manual Input",
  614. "🔍 查看保存": "🔍 View Saved",
  615. "🔃 手動注入": "🔃 Manual Injection",
  616. "🗑️ 清除登入": "🗑️ Clear Login",
  617. "帳戶": "Account",
  618. "更新": "Update",
  619. "登入": "Login",
  620. "確認選擇的 Cookies": "Confirm Selected Cookies",
  621. "確認保存": "Confirm Save",
  622. "取消退出": "Cancel Exit",
  623. "退出選單": "Exit Menu",
  624. "保存成功!": "Save Successful!",
  625. "更改保存": "Change Saved",
  626. "變更通知": "Change Notification",
  627. "已保存變更": "Changes Saved",
  628. "設置 Cookies": "Set Cookies",
  629. "要登入 Ex 才需要填寫": "Required for Ex Login",
  630. "必填項目": "Mandatory Field",
  631. "下方選填 也可不修改": "Optional Below, No Changes Needed",
  632. "[確認輸入正確]按下退出選單保存": "[Confirm Correct Input] Press Exit Menu to Save",
  633. "當前設置 Cookies": "Current Set Cookies",
  634. "帳戶選擇": "Account Selection",
  635. "未獲取到 Cookies !!\n\n請先登入帳戶": "No Cookies Retrieved !!\n\nPlease Login First",
  636. "未檢測到可注入的 Cookies !!\n\n請從選單中進行設置": "No Injectable Cookies Detected !!\n\nPlease Set in Menu",
  637. "共享數據更新完成": "Shared data update completed",
  638. "共享數據無需更新": "No need to update shared data",
  639. "共享數據獲取失敗": "Shared Data Retrieval Failed",
  640. "請求為空數據": "Request Contains No Data",
  641. "連線異常,更新地址可能是錯的": "Connection error, the update address may be incorrect",
  642. "請求錯誤: ": "Request Error: "
  643. },
  644. Korea: {
  645. "🍪 共享登入": "🍪 공유 로그인",
  646. "📂 展開菜單": "📂 메뉴 확장",
  647. "📁 摺疊菜單": "📁 메뉴 축소",
  648. "📜 自動獲取": "📜 자동 가져오기",
  649. "📝 手動輸入": "📝 수동 입력",
  650. "🔍 查看保存": "🔍 저장 보기",
  651. "🔃 手動注入": "🔃 수동 주입",
  652. "🗑️ 清除登入": "🗑️ 로그인 지우기",
  653. "確認選擇的 Cookies": "선택한 쿠키 확인",
  654. "帳戶": "계정",
  655. "更新": "업데이트",
  656. "登入": "로그인",
  657. "確認保存": "저장 확인",
  658. "取消退出": "취소 종료",
  659. "退出選單": "메뉴 종료",
  660. "保存成功!": "저장 성공!",
  661. "更改保存": "변경 저장",
  662. "變更通知": "변경 알림",
  663. "已保存變更": "변경 사항 저장됨",
  664. "設置 Cookies": "쿠키 설정",
  665. "要登入 Ex 才需要填寫": "Ex 로그인에 필요",
  666. "必填項目": "필수 항목",
  667. "下方選填 也可不修改": "아래 선택 항목, 변경 필요 없음",
  668. "[確認輸入正確]按下退出選單保存": "[입력 정확성 확인] 메뉴 종료를 눌러 저장",
  669. "當前設置 Cookies": "현재 설정된 쿠키",
  670. "帳戶選擇": "계정 선택",
  671. "未獲取到 Cookies !!\n\n請先登入帳戶": "쿠키를 가져오지 못했습니다 !!\n\n먼저 로그인 해주세요",
  672. "未檢測到可注入的 Cookies !!\n\n請從選單中進行設置": "주입 가능한 쿠키를 감지하지 못했습니다 !!\n\n메뉴에서 설정해 주세요",
  673. "共享數據更新完成": "공유 데이터 업데이트 완료",
  674. "共享數據無需更新": "공유 데이터 업데이트 필요 없음",
  675. "共享數據獲取失敗": "공유 데이터 가져오기 실패",
  676. "請求為空數據": "요청 데이터가 비어 있습니다",
  677. "連線異常,更新地址可能是錯的": "연결 이상, 업데이트 주소가 잘못되었을 수 있습니다",
  678. "請求錯誤: ": "요청 오류: "
  679. },
  680. Japan: {
  681. "🍪 共享登入": "🍪 共有ログイン",
  682. "📂 展開菜單": "📂 メニュー展開",
  683. "📁 摺疊菜單": "📁 メニュー折りたたみ",
  684. "📜 自動獲取": "📜 自動取得",
  685. "📝 手動輸入": "📝 手動入力",
  686. "🔍 查看保存": "🔍 保存を表示",
  687. "🔃 手動注入": "🔃 手動注入",
  688. "🗑️ 清除登入": "🗑️ ログインクリア",
  689. "帳戶": "アカウント",
  690. "更新": "更新",
  691. "登入": "ログイン",
  692. "確認選擇的 Cookies": "選択したクッキーを確認",
  693. "確認保存": "保存を確認",
  694. "取消退出": "キャンセルして終了",
  695. "退出選單": "メニューを終了",
  696. "保存成功!": "保存成功!",
  697. "更改保存": "変更を保存",
  698. "變更通知": "変更通知",
  699. "已保存變更": "変更が保存されました",
  700. "設置 Cookies": "クッキーを設定",
  701. "要登入 Ex 才需要填寫": "Exログインに必要",
  702. "必填項目": "必須項目",
  703. "下方選填 也可不修改": "下の選択肢、変更の必要はありません",
  704. "[確認輸入正確]按下退出選單保存": "[入力が正しいことを確認] メニュー終了を押して保存",
  705. "當前設置 Cookies": "現在設定されているクッキー",
  706. "帳戶選擇": "アカウント選択",
  707. "未獲取到 Cookies !!\n\n請先登入帳戶": "クッキーを取得できませんでした!!\n\n先にログインしてください",
  708. "未檢測到可注入的 Cookies !!\n\n請從選單中進行設置": "注入可能なクッキーが検出されませんでした!!\n\nメニューから設定してください",
  709. "共享數據更新完成": "共有データの更新が完了しました",
  710. "共享數據無需更新": "共有データを更新する必要がありません",
  711. "共享數據獲取失敗": "共有データの取得に失敗しました",
  712. "請求為空數據": "リクエストが空データです",
  713. "連線異常,更新地址可能是錯的": "接続異常、更新されたアドレスが間違っている可能性があります",
  714. "請求錯誤: ": "リクエストエラー: "
  715. }
  716. }, Match = {
  717. ko: Word.Korea,
  718. ja: Word.Japan,
  719. "en-US": Word.English,
  720. "zh-CN": Word.Simplified,
  721. "zh-SG": Word.Simplified,
  722. "zh-TW": Word.Traditional,
  723. "zh-HK": Word.Traditional,
  724. "zh-MO": Word.Traditional
  725. }, ML = Match[lang] ?? Match["en-US"];
  726. return {
  727. Transl: Str => ML[Str] ?? Str
  728. };
  729. }
  730. })();