Sleazy Fork is available in English.

(E/Ex-Hentai) AutoLogin

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

À partir de 2023-07-30. Voir la dernière version.

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