(E/Ex-Hentai) AutoLogin

自動檢測 E 站的登入狀態 , 沒有登入 就將設置的 cookies 自動添加進去 , 進行快速登入

Version au 02/08/2023. Voir la dernière version.

  1. // ==UserScript==
  2. // @name (E/Ex-Hentai) AutoLogin
  3. // @version 0.0.7
  4. // @author HentiSaru
  5. // @description 自動檢測 E 站的登入狀態 , 沒有登入 就將設置的 cookies 自動添加進去 , 進行快速登入
  6. // @namespace https://greasyfork.org/users/989635
  7.  
  8. // @match https://e-hentai.org/*
  9. // @match https://exhentai.org/*
  10. // @icon http://g.e-hentai.org/favicon.ico
  11.  
  12. // @license Apache
  13. // @run-at document-end
  14.  
  15. // @grant GM_addStyle
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_registerMenuCommand
  19. // ==/UserScript==
  20.  
  21. /* ==================== 初始化設置 ==================== */
  22. var modal, Domain;
  23.  
  24. GM_addStyle(`
  25. .show-modal-background {
  26. top: 0;
  27. left: 0;
  28. width: 100%;
  29. height: 100%;
  30. z-index: 9999;
  31. position: fixed;
  32. overflow: auto;
  33. background-color: rgba(0,0,0,0.5);
  34. }
  35. .show-modal-content {
  36. width: 23%;
  37. padding: 20px;
  38. overflow: auto;
  39. color: #5C0D11;
  40. margin: 5% auto;
  41. text-align: left;
  42. border-radius: 10px;
  43. border-collapse: collapse;
  44. background-color: #fefefe;
  45. border: 2px ridge #5C0D12;
  46. }
  47. .show-button {
  48. top: 0;
  49. margin: 3% 2%;
  50. color: #5C0D12;
  51. font-size: 14px;
  52. font-weight: bold;
  53. border-radius: 3px;
  54. background-color: #EDEADA;
  55. border: 2px solid #B5A4A4;
  56. }
  57. .show-button:hover, .show-button:focus {
  58. color: #FF8033;
  59. cursor: pointer;
  60. text-decoration: none;
  61. }
  62. .set-modal-content {
  63. width: 720px;
  64. padding: 5px;
  65. overflow: auto;
  66. border-radius: 10px;
  67. text-align: center;
  68. border: 2px ridge #5C0D12;
  69. border-collapse: collapse;
  70. margin: 2% auto 8px auto;
  71. }
  72. .set-list {
  73. height: 25px;
  74. width: 70%;
  75. text-align: center;
  76. }
  77. .hidden {
  78. display: none;
  79. }
  80. `);/* ==================== 初始化設置 ==================== */
  81.  
  82. /* ==================== 自動獲取 Cookies (菜單) ==================== */
  83. const GetCookiesAutomatically = GM_registerMenuCommand(
  84. "📜 自動獲取 Cookies [請先登入]",
  85. function() {
  86. let cookies = GetCookies() , cookie_list = [];
  87. for (var cookieName in cookies) {
  88. if (cookies.hasOwnProperty(cookieName)) {
  89. var cookieValue = cookies[cookieName];
  90. cookie_list.push({"name" : cookieName,"value" : cookieValue})
  91. }
  92. }
  93. cookies = JSON.stringify(cookie_list, null, 4);
  94. Cookies_Show(cookies)
  95. }
  96. )
  97.  
  98. function Cookies_Show(cookie_list) {
  99. if (modal) {
  100. modal.remove();
  101. modal = null;
  102. }
  103. modal = document.createElement('div');
  104. modal.innerHTML = `
  105. <div class="show-modal-content">
  106. <h1 style="text-align:center;">確認選擇的 Cookies</h1>
  107. <pre><b>${cookie_list}</b></pre>
  108. <div style="text-align: right;">
  109. <button class="show-button" id="save_cookie">確認保存</button>
  110. <button class="show-button" id="modal_close">取消退出</button>
  111. </div>
  112. </div>
  113. `
  114. modal.classList.add('show-modal-background');
  115. // 添加模態框元素到頁面中
  116. document.body.appendChild(modal);
  117. modal.classList.remove('hidden');
  118.  
  119. let CloseButton = document.getElementById('modal_close');
  120. CloseButton.addEventListener('click', () => {
  121. modal.classList.add('hidden');
  122. document.removeEventListener('click', CloseButton);
  123. });
  124. let SaveButton = document.getElementById('save_cookie');
  125. SaveButton.addEventListener('click', () => {
  126. GM_setValue("E/Ex_Cookies", cookie_list);
  127. alert("保存成功!");
  128. modal.classList.add('hidden');
  129. document.removeEventListener('click', SaveButton);
  130. });
  131. }/* ==================== 自動獲取 Cookies (菜單) ==================== */
  132.  
  133. /* ==================== 手動輸入 Cookies (菜單) ==================== */
  134. const ManualSetting = GM_registerMenuCommand(
  135. "📝 手動輸入 Cookies",
  136. function() {
  137. if (modal) {
  138. modal.remove();
  139. modal = null;
  140. }
  141.  
  142. Domain = window.location.hostname;
  143. if (Domain === "e-hentai.org") {
  144. GM_addStyle('.set-modal-content { background-color: #fefefe; }');
  145. } else if (Domain === "exhentai.org") {
  146. GM_addStyle('.set-modal-content { background-color: #34353b; }');
  147. }
  148.  
  149. modal = document.createElement('div');
  150. modal.innerHTML = `
  151. <div class="set-modal-content">
  152. <h1>設置 Cookies</h1>
  153. <form id="set_cookies">
  154. <div style="margin:10px">
  155. [igneous] : <input class="set-list" type="text" name="igneous" placeholder="要登入 Ex 才需要填寫"><br>
  156. [ipb_member_id] : <input class="set-list" type="text" name="ipb_member_id" placeholder="必填項目" required><br>
  157. [ipb_pass_hash] : <input class="set-list" type="text" name="ipb_pass_hash" placeholder="必填項目" required><hr>
  158. <h2>下方選填 也可不修改</h2>
  159. [sl] : <input class="set-list" type="text" name="sl" value="dm_2"><br>
  160. [sk] : <input class="set-list" type="text" name="sk" value="gy8wgij076agx1ax6is9htzrj40i"><br>
  161. [yay] : <input class="set-list" type="text" name="yay" value="louder"><br>
  162. </div>
  163. <button type="submit" class="show-button" id="set_save_cookie">確認保存</button>
  164. <button class="show-button" id="set_modal_close">退出選單</button>
  165. </form>
  166. </div>
  167. `
  168.  
  169. modal.classList.add('show-modal-background');
  170. document.body.appendChild(modal);
  171. modal.classList.remove('hidden');
  172.  
  173. // 捕獲表單提交事件
  174. document.getElementById("set_cookies").addEventListener("submit", function(event) {
  175. event.preventDefault(); // 阻止默認的表單提交行為
  176. if (event.submitter.id === "set_save_cookie") {
  177. // 獲取所有的輸入表單
  178. const formElements = document.querySelectorAll("#set_cookies .set-list");
  179. const cookie_list = Array.from(formElements).map(input => {
  180. return { name: input.name, value: input.value };
  181. });
  182.  
  183. // 創建 textarea 元素
  184. const textarea = document.createElement("textarea");
  185. textarea.name = "confirm_cookies";
  186. textarea.style = "margin-top:20px";
  187. textarea.rows = 20;
  188. textarea.cols = 60;
  189.  
  190. // 保存後 , 在獲取並轉換格式 , 並將其顯示
  191. GM_setValue("E/Ex_Cookies", JSON.stringify(cookie_list, null, 4));
  192. let cookies = JSON.parse(GM_getValue("E/Ex_Cookies", []));
  193. textarea.value = JSON.stringify(cookies , null, 4);
  194.  
  195. // 將 textarea 添加到指定的 div 元素中
  196. const formDiv = document.querySelector("#set_cookies div");
  197. formDiv.appendChild(textarea);
  198. alert("保存成功!\n[確認正確後 按下退出選單]");
  199. }
  200. });
  201.  
  202. // 退出按鈕
  203. let CloseButton = document.getElementById("set_modal_close");
  204. CloseButton.addEventListener("click", () => {
  205. modal.classList.add("hidden");
  206. document.removeEventListener("click", CloseButton);
  207. });
  208. }
  209. )/* ==================== 手動輸入 Cookies (菜單) ==================== */
  210.  
  211. /* ==================== 手動注入 Cookies (菜單) ==================== */
  212. const CookieInjection = GM_registerMenuCommand(
  213. "🔃 手動注入 Cookies",
  214. function() {
  215. try {
  216. let login_cookies = GM_getValue("E/Ex_Cookies", []);
  217. let cookies = GetCookies();
  218. login_cookies = JSON.parse(login_cookies);
  219. deleteCookies(cookies);
  220. AddCookies(login_cookies);
  221. location.reload();
  222. } catch (error) {
  223. alert("未檢測到可注入的 Cookies !!\n請從選單中進行設置");
  224. }
  225. }
  226. );/* ==================== 手動注入 Cookies (菜單) ==================== */
  227.  
  228. /* ==================== 刪除所有 Cookies (菜單) ==================== */
  229. const CookieDelete = GM_registerMenuCommand(
  230. "🗑️ 刪除所有 Cookies",
  231. function() {
  232. let cookies = document.cookie.split("; ");
  233. deleteCookies(cookies);
  234. location.reload();
  235. }
  236. );
  237.  
  238. function deleteCookies(cookies) {
  239. for (let i = 0; i < cookies.length; i++) {
  240. let cookie = cookies[i];
  241. let eqPos = cookie.indexOf("=");
  242. let cookieName = eqPos > -1 ? cookie.slice(0, eqPos) : cookie;
  243. document.cookie = cookieName + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
  244. }
  245. }/* ==================== 刪除所有 Cookies (菜單) ==================== */
  246. /* ---------------------------------------------------------------- */
  247. /* ==================== 程式入口點 ==================== */
  248. try {
  249. let cookies = GM_getValue("E/Ex_Cookies", []);
  250. AutomaticLoginCheck(JSON.parse(cookies), window.location.hostname);
  251. } catch (error) {
  252. //console.log(error);
  253. }/* ==================== 程式入口點 ==================== */
  254.  
  255. /* ==================== 登入檢測方法 ==================== */
  256. async function AutomaticLoginCheck(login_cookies , Domain) {
  257. // 需要的 cookie 值
  258. const RequiredCookies = ["ipb_member_id","ipb_pass_hash"];
  259. let cookies = GetCookies();
  260. let cookiesFound = RequiredCookies.every(function(cookieName) {
  261. return cookies.hasOwnProperty(cookieName) && cookies[cookieName] !== undefined;
  262. });
  263. if (!cookiesFound || RequiredCookies.length !== 2) {
  264. let cookies = document.cookie.split("; ");
  265. deleteCookies(cookies);
  266. AddCookies(login_cookies);
  267. location.reload();
  268. if (Domain === "exhentai.org" && (!cookies.hasOwnProperty("igneous") || cookies.igneous === "mystery")) {
  269. deleteCookies(cookies);
  270. AddCookies(login_cookies);
  271. location.reload();
  272. }
  273. }
  274. }/* ==================== 登入檢測方法 ==================== */
  275.  
  276. /* ==================== 添加 cookie ==================== */
  277. function AddCookies(LoginCookies) {
  278. for (let i = 0; i < LoginCookies.length; i++) {
  279. let cookie = LoginCookies[i];
  280. document.cookie = cookie.name + "=" + cookie.value;
  281. }
  282. }/* ==================== 添加 cookie ==================== */
  283.  
  284. /* ==================== 取得 Cookies ==================== */
  285. function GetCookies() {
  286. let cookies = {} , cookiePairs = document.cookie.split("; ");
  287. for (let i = 0; i < cookiePairs.length; i++) {
  288. let cookiePair = cookiePairs[i].split("=");
  289. let cookieName = decodeURIComponent(cookiePair[0]);
  290. let cookieValue = decodeURIComponent(cookiePair[1]);
  291. cookies[cookieName] = cookieValue;
  292. }
  293. return cookies;
  294. }/* ==================== 取得 Cookies ==================== */