您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
JKF 捷克论坛助手:自动签到、定时签到、自动感谢、自动加载原图、自动播放图片、自动支付购买主题贴、自动完成投票任务,优化浏览体验,一键批量回帖/感谢,一键打包下载帖子图片,自动识别验证码,自动现在有空,自动点击置顶广告,自动发文
// ==UserScript== // @name JKForum 助手 // @name:en JKForum Helper // @name:zh-TW JKForum 助手 // @name:ja JKForum 助手 // @name:ko JKForum 조수 // @namespace https://github.com/Eished/jkforum_helper // @version 0.9.3 // @description JKF 捷克论坛助手:自动签到、定时签到、自动感谢、自动加载原图、自动播放图片、自动支付购买主题贴、自动完成投票任务,优化浏览体验,一键批量回帖/感谢,一键打包下载帖子图片,自动识别验证码,自动现在有空,自动点击置顶广告,自动发文 // @description:en JKF JKForum Helper: Auto-sign-in, timed sign-in, auto-thank you, auto-load original image, auto-play image, auto-pay to buy theme post, auto-complete voting task, optimize browsing experience, one-click bulk reply/thank you, one-click package to download post image,Skip mobile verification code when logging in // @description:zh-TW JKF 捷克論壇助手:自動簽到、定時簽到、自動感謝、自動加載原圖、自動播放圖片、自動支付購買主題貼、自動完成投票任務,優化瀏覽體驗,一鍵批量回帖/感謝,一鍵打包下載帖子圖片,自動識別驗證碼,自動現在有空,自動點擊置頂廣告,自動發文 // @description:ja JKF チェコ語フォーラム助手:自動チェックイン、時限式チェックイン、オートサンキュー、オリジナル画像の自動読み込み、画像の自動再生、トピック投稿の自動支払い、ポールタスクの自動完了、ブラウジングエクスペリエンスの最適化、ワンクリックでの一括返信/サンキュー、ワンクリックでの投稿画像のパッケージダウンロード,ログイン時にモバイル認証コードをスキップ // @description:ko JKF 체코 포럼 조수: 자동 로그인, 정기 로그인, 자동 감사, 원본 사진 자동로드, 테마 스티커 구매 자동 결제, 투표 작업 자동 완료, 최적화 된 브라우징 경험, 원 클릭 일괄 회신 / 감사, 원 클릭 포스트 사진의 패키지 다운로드 클릭다운로드하십시오,로그인 시 모바일 인증 코드 건너뛰기 // @author Eished // @copyright Eished // @license MIT // @match *://*.jkforum.net/* // @run-at document-idle // @supportURL https://github.com/Eished/jkforum_helper/issues // @homepage https://github.com/Eished/jkforum_helper // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_info // @grant GM_xmlhttpRequest // @grant GM_openInTab // @grant GM_registerMenuCommand // @grant GM_addElement // @grant GM_addStyle // @grant GM_notification // @grant GM_addValueChangeListener // @connect mymypic.net // @connect jkf.iknow.fun // @connect cdn.jsdelivr.net // @connect github.com // @connect greasyfork.org // @connect jkf.hare200.com // @require https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/react-table.production.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/build/react-copy-to-clipboard.min.js // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDExNi4xNjQ2NTUsIDIwMjEvMDEvMjYtMTU6NDE6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YzYwNmI3NGQtODA4Zi03YjQ3LWI4NGYtYjNlZmJiMTM4NDIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkM3MzFDMzYyRUE5MzExRUJCOTU4RkY3NUMxOTY5MDdGIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkM3MzFDMzYxRUE5MzExRUJCOTU4RkY3NUMxOTY5MDdGIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMS4yIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA2MWY1NjgyLTk5OTctNDU0OS04NjIzLWZhNzY0MmVjMTM5MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpjNjA2Yjc0ZC04MDhmLTdiNDctYjg0Zi1iM2VmYmIxMzg0MjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5urL1nAAAJJUlEQVR42uxba2wU1xX+ZnZ2vYvX4BpDCYVA6xgKkR0wlYlJnyK1iiweVlqgGFpKK6qWAuYtQgitoYANGCTqRnJIQbQ/sJoAKsESMkrTitSQpuJhUBwVHCC21QeCgh17vevd6Tkzs+uZfXgftsevHOvT7twd35lz7rnnfufcGUGWZQxnETHMZdgbQLpy5UpfX0MgjCAkExwabBpEDT4NbkIHoZ3QRviUv/Msbff0/o1ZLBbl5npL0gkZhCkavkj4gtaeqhnArilu6aYfr2YEF6GV8EgS8J/ffh9NaSlo8PlQLwr4iNBAaBUT1YCMKtkdPTJAGuF5wrcIeYQvE0b3hQs5k4CmUmAkm9Kj3Dz/NRJuEP5CWrxDfnSVPn2KRnJsBoDNCSneKUPIJywjvEj4vBnzVCClPqXJMZL9olObVgIm0udEUqTAR8p4fbjmlfGmRcApyYI7QjRDyGo3sQZBGgP8hPAB4TyhyCzlu1VAU5CngVXCDLuEPaT4NZcHx9weTAtEoB6uAvMItYTXCc8N2HCuGYNG3+mw4ceiiL9T4PxVp5fijpCYAThYHSZUE2YOmnVN8wwyRLLDildpavyZvGFqJCOI3QS4twnFg3aB1zwiyYrnaVq82+6mQC3EZoCRhD8Rvj0kmI6sxIdxkoi3yRNmBBtBDENaThBeGFJ0TzUCe/UfPZ30KUQ2wFpC4ZDkvGQEmxXPUEwoV/I/IdQAvK7uHurc3ybhh+QFXwvnAVu1+T90hUaelkf+eEX2dTE7aKRmxaBRxBqd4EQUotJWES92+pBlFVDnN8ACwqiouTOZTxC6ruyjzCRSQYUzLb10d264/+HrWK1WtLe3h5xXd5dSRXcC2R+N/nMTlIAokgG+S65Q5//tnI5cRsThw4fl+vr6APLz8yOeW1VVZTh36tSp3fa9evVqw/l37tyRCwsLld9S7JCby8h+vyNUQn52fPR7DQciRmo/b0DuqMAV7xspgqRlcF+JxYKTJ08GKRI4Tk1NjXjulClTDOc6HI6I52ZnZ+PIkSOGc86cOYNz586FH8kE3d8iGr5PpxXhaW7KjjWxcbuNfuf1eiOe29HRETIFwondbseJEycMyt+6dQsrV65EZ2dnxOwwEWmlW5K7Eignfc1mD5jRg5DSY9m/fz9mzuxKNVpbW1FUVIQnT57E3EdBFiGHlIsSF6wUYlJHqLUnQV0VstgA0/pL+fnz52P9+vWGtjVr1uD69etx9fP1TOBnC7QCWjRxacU3dcgzJa10ZbqMHz8elZWVhraKigqcPHky7r5cHq2C2B73v07kGDCuPwzAyo8b13Xp2tpabNq0ydR7oFiSzgb4nNnKb9iwAQUFBYHjBw8eYPny5SGBs88NQMyXDZBsjrXVSTdr1izs27fP8NuqVavQ0NBgvhsKcLAB7GZcy+PxKMzu+PHjSEpKCrTv3r074nrf56mBDLuoywf6VHh527FjB7KysgJtZ8+exa5du/otpSAyZJFgwvZYW1sb5s2bh23bthnajx07ht7YnLVJmh97oydC8BmrP5IZJEiSJOzdu1dhfXopKSlBTU1NCMOMV07WAu9/Av+eQUR5heJuzjNQN+A0C5hiAJvNhrS0tJD2nJwcrF27FocOHepR/x/+S0U0+dELdE1LV21AgMm7w1evXg2ZBjt37sSkSZNMub4YZrdI0pr63AtaWlqUBOfGjRtYuHAh5syZo7SPGjUKpaWlWLp0acJ9pzsJKYi6JzjSrjtHUL9KZo3+unXrFOVZNm/ejEuXLikFFpYlS5Yoy+OFCxcS6vsX36T5/T2NDndb0IG676xvM8bFvhOmuvrvnALrpby8PCRIxuzapAWvZ9EQnEbzAiRGj53GYBZrPSBY9OTHP/cfPnwYOJ4+fTo2btyYKKHpesSiOwRNEZ8PPlG3KESVsWPHGo4fP36csEc0Nzdjz549hrbt27cjIyPDPCZIE0KMPnMQCFZc5vILV2saGxt7dAOc/t68eTNw7HQ6cfDgQTOzQRcbIKbSS2FhIdLT0wPH9+7dU9ATYQLEAVEvixYtUgolJuUCrWyA/3Y3V1nmzp2LsrIyQ9v58+d7zOBYOPKfPn3a0MbEKDnZlCT1IRvA4MdMWfnJsaqqKpw6dQqXL1/GxYsXMWbMmMA5XKs/evRor90FkyPOF/ySmZmJrVu3muEBzWyAfwbT09zcXCxevFhZn2fPnh3yj8XFxbh9+3av3Qj3FUyHt2zZYiir95E0sAHq9MvctGmRa6T379/HihUrQmp54STYhYN3ioLlwIEDhpjCZXLOFm22JPj6gqmo/PdDZoJcguVyooNTU87Z8/LyMGHCBCUeuFwu3L17V2Fu1dXVePToUUz98wjqgyb3EY0qM0XW1wvYaDa6B5+rl0tlgsIBmMTU+VPif0DdIBmQkkIE8aMS4Kl0lbZlvEy++6Dr95e/A/x6OWIri2sGoFX8Y8GW8qykMcF3B7IBgqVkAS1drV3HeV+Kh85pLNaH92wi2v3JEK9D6wa85to2Z9E3ghJ5j4Z4qDPpzLmBv5v3CDcHiwcouzttOnjim/+dXjRJImqgsyNPg3IMB5EVD3iN4msrZKMj/YGLNkNaeRp9jxeNlD5X6OsB+pn083jS48GmPPMJCn4bJAv+F3jOOOi0y7yED1XXd3fiN0lWvKmvC4Qrih4hlA01/V0evGWVUCxEeVI0kJ8QXh0Kbs+D3e7G78ntl1lEYn9ybAZg4YcmXyI0DVblabnroJHfRm7/AzKAO1zVONq+ABOkXEJlnKtt/wY7WXH5Ggp4X3VYUaZUgyOUzGPZGGkm/FQzxHHC44GotEJvucjnwTu01C20WZBPI/9BgEFGkHj2Ba4RVhF+yZUrqA9Vs1FG9JfCrJjyvpAX9aR8NTVXWS14PzDicuxdJSqTob4xxg8f50B9bS69t/V10DA1lwKp6ltjrsAbY8DfCH8lP75Omrjj0oaNY7VDGD26V990486ehvrgFYOfQH9KMwo/iut/edKmeZ+oux2vFmfcGsNvIfDGwb9tEhqX5eITZxI+5ioO6dlEo+zWvzOYyC57ksMJgZ/PMVEsOuX9O9P+LUufxkL9RjCo1OJS3T3W1wJjEZFIgfDZ2+PDXP4vwABKHSZ0zSd04wAAAABJRU5ErkJggg== // ==/UserScript== /* eslint-disable */ /* spell-checker: disable */ // @[ You can find all source codes in GitHub repo ] /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 529: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // Imports var ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ = __webpack_require__(81); var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(645); var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "/*\n! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n*/\n\nhtml {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font family by default.\n2. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n font-size: 1em;\n /* 2 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n line-height: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/*\nEnsure the default browser behavior of the `hidden` attribute.\n*/\n\n[hidden] {\n display: none;\n}\n\n[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n border-radius: 0px;\n padding-top: 0.5rem;\n padding-right: 0.75rem;\n padding-bottom: 0.5rem;\n padding-left: 0.75rem;\n font-size: 1rem;\n line-height: 1.5rem;\n --tw-shadow: 0 0 #0000;\n}\n\n[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-date-and-time-value {\n min-height: 1.5em;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n padding-top: 0;\n padding-bottom: 0;\n}\n\nselect {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n padding-right: 2.5rem;\n print-color-adjust: exact;\n}\n\n[multiple] {\n background-image: initial;\n background-position: initial;\n background-repeat: unset;\n background-size: initial;\n padding-right: 0.75rem;\n print-color-adjust: unset;\n}\n\n[type='checkbox'],[type='radio'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n padding: 0;\n print-color-adjust: exact;\n display: inline-block;\n vertical-align: middle;\n background-origin: border-box;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n flex-shrink: 0;\n height: 1rem;\n width: 1rem;\n color: #2563eb;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n --tw-shadow: 0 0 #0000;\n}\n\n[type='checkbox'] {\n border-radius: 0px;\n}\n\n[type='radio'] {\n border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n[type='radio']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='file'] {\n background: unset;\n border-color: inherit;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-size: unset;\n line-height: inherit;\n}\n\n[type='file']:focus {\n outline: 1px solid ButtonText;\n outline: 1px auto -webkit-focus-ring-color;\n}\n\n*, ::before, ::after {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.pointer-events-auto {\n pointer-events: auto;\n}\n\n.static {\n position: static;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.inset-0 {\n top: 0px;\n right: 0px;\n bottom: 0px;\n left: 0px;\n}\n\n.inset-y-0 {\n top: 0px;\n bottom: 0px;\n}\n\n.-left-8 {\n left: -2rem;\n}\n\n.top-1\\/2 {\n top: 50%;\n}\n\n.top-0 {\n top: 0px;\n}\n\n.right-0 {\n right: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.z-50 {\n z-index: 50;\n}\n\n.m-2 {\n margin: 0.5rem;\n}\n\n.-m-2 {\n margin: -0.5rem;\n}\n\n.m-1 {\n margin: 0.25rem;\n}\n\n.m-4 {\n margin: 1rem;\n}\n\n.mx-1 {\n margin-left: 0.25rem;\n margin-right: 0.25rem;\n}\n\n.my-1 {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n\n.-my-6 {\n margin-top: -1.5rem;\n margin-bottom: -1.5rem;\n}\n\n.mx-2 {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n}\n\n.ml-4 {\n margin-left: 1rem;\n}\n\n.mt-2 {\n margin-top: 0.5rem;\n}\n\n.ml-3 {\n margin-left: 0.75rem;\n}\n\n.mt-8 {\n margin-top: 2rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-0\\.5 {\n margin-top: 0.125rem;\n}\n\n.mt-0 {\n margin-top: 0px;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.ml-auto {\n margin-left: auto;\n}\n\n.mb-4 {\n margin-bottom: 1rem;\n}\n\n.ml-1 {\n margin-left: 0.25rem;\n}\n\n.block {\n display: block;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: flex;\n}\n\n.inline-flex {\n display: inline-flex;\n}\n\n.table {\n display: table;\n}\n\n.flow-root {\n display: flow-root;\n}\n\n.h-12 {\n height: 3rem;\n}\n\n.h-screen {\n height: 100vh;\n}\n\n.h-fit {\n height: -webkit-fit-content;\n height: -moz-fit-content;\n height: fit-content;\n}\n\n.h-20 {\n height: 5rem;\n}\n\n.h-full {\n height: 100%;\n}\n\n.h-7 {\n height: 1.75rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-24 {\n height: 6rem;\n}\n\n.h-5 {\n height: 1.25rem;\n}\n\n.h-3 {\n height: 0.75rem;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-8 {\n height: 2rem;\n}\n\n.max-h-\\[95\\%\\] {\n max-height: 95%;\n}\n\n.w-12 {\n width: 3rem;\n}\n\n.w-full {\n width: 100%;\n}\n\n.w-64 {\n width: 16rem;\n}\n\n.w-80 {\n width: 20rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.w-screen {\n width: 100vw;\n}\n\n.w-72 {\n width: 18rem;\n}\n\n.w-40 {\n width: 10rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-24 {\n width: 6rem;\n}\n\n.w-5 {\n width: 1.25rem;\n}\n\n.w-3 {\n width: 0.75rem;\n}\n\n.w-16 {\n width: 4rem;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-7 {\n width: 1.75rem;\n}\n\n.min-w-full {\n min-width: 100%;\n}\n\n.max-w-full {\n max-width: 100%;\n}\n\n.max-w-md {\n max-width: 28rem;\n}\n\n.max-w-\\[150px\\] {\n max-width: 150px;\n}\n\n.flex-1 {\n flex: 1 1 0%;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.table-auto {\n table-layout: auto;\n}\n\n.translate-x-full {\n --tw-translate-x: 100%;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.translate-x-0 {\n --tw-translate-x: 0px;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-help {\n cursor: help;\n}\n\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.flex-col {\n flex-direction: column;\n}\n\n.flex-wrap {\n flex-wrap: wrap;\n}\n\n.items-start {\n align-items: flex-start;\n}\n\n.items-end {\n align-items: flex-end;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-between {\n justify-content: space-between;\n}\n\n.justify-evenly {\n justify-content: space-evenly;\n}\n\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n\n.divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\n}\n\n.divide-gray-200 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-divide-opacity));\n}\n\n.divide-gray-100 > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-opacity: 1;\n border-color: rgb(243 244 246 / var(--tw-divide-opacity));\n}\n\n.overflow-auto {\n overflow: auto;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.overflow-x-hidden {\n overflow-x: hidden;\n}\n\n.overflow-y-scroll {\n overflow-y: scroll;\n}\n\n.overflow-ellipsis {\n text-overflow: ellipsis;\n}\n\n.text-ellipsis {\n text-overflow: ellipsis;\n}\n\n.whitespace-nowrap {\n white-space: nowrap;\n}\n\n.rounded-md {\n border-radius: 0.375rem;\n}\n\n.rounded {\n border-radius: 0.25rem;\n}\n\n.rounded-lg {\n border-radius: 0.5rem;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.rounded-t {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.rounded-b {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-0 {\n border-width: 0px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-b {\n border-bottom-width: 1px;\n}\n\n.border-t {\n border-top-width: 1px;\n}\n\n.border-b-2 {\n border-bottom-width: 2px;\n}\n\n.border-solid {\n border-style: solid;\n}\n\n.border-gray-200 {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity));\n}\n\n.border-gray-400 {\n --tw-border-opacity: 1;\n border-color: rgb(156 163 175 / var(--tw-border-opacity));\n}\n\n.bg-transparent {\n background-color: transparent;\n}\n\n.bg-gray-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(249 250 251 / var(--tw-bg-opacity));\n}\n\n.bg-indigo-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(129 140 248 / var(--tw-bg-opacity));\n}\n\n.bg-indigo-600 {\n --tw-bg-opacity: 1;\n background-color: rgb(79 70 229 / var(--tw-bg-opacity));\n}\n\n.bg-gray-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(107 114 128 / var(--tw-bg-opacity));\n}\n\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n}\n\n.bg-gray-900 {\n --tw-bg-opacity: 1;\n background-color: rgb(17 24 39 / var(--tw-bg-opacity));\n}\n\n.bg-gray-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity));\n}\n\n.bg-blue-200 {\n --tw-bg-opacity: 1;\n background-color: rgb(191 219 254 / var(--tw-bg-opacity));\n}\n\n.bg-green-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(74 222 128 / var(--tw-bg-opacity));\n}\n\n.bg-gray-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(156 163 175 / var(--tw-bg-opacity));\n}\n\n.bg-red-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(248 113 113 / var(--tw-bg-opacity));\n}\n\n.bg-blue-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(96 165 250 / var(--tw-bg-opacity));\n}\n\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity));\n}\n\n.bg-gray-300 {\n --tw-bg-opacity: 1;\n background-color: rgb(209 213 219 / var(--tw-bg-opacity));\n}\n\n.bg-opacity-75 {\n --tw-bg-opacity: 0.75;\n}\n\n.bg-opacity-50 {\n --tw-bg-opacity: 0.5;\n}\n\n.bg-cover {\n background-size: cover;\n}\n\n.bg-center {\n background-position: center;\n}\n\n.object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n\n.object-center {\n -o-object-position: center;\n object-position: center;\n}\n\n.p-2 {\n padding: 0.5rem;\n}\n\n.p-5 {\n padding: 1.25rem;\n}\n\n.p-1\\.5 {\n padding: 0.375rem;\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-6 {\n padding: 1.5rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.p-0 {\n padding: 0px;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n.py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n\n.py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.pr-4 {\n padding-right: 1rem;\n}\n\n.pl-2 {\n padding-left: 0.5rem;\n}\n\n.pl-10 {\n padding-left: 2.5rem;\n}\n\n.pl-1 {\n padding-left: 0.25rem;\n}\n\n.pl-5 {\n padding-left: 1.25rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.text-center {\n text-align: center;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n\n.font-bold {\n font-weight: 700;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.font-normal {\n font-weight: 400;\n}\n\n.uppercase {\n text-transform: uppercase;\n}\n\n.leading-tight {\n line-height: 1.25;\n}\n\n.leading-6 {\n line-height: 1.5rem;\n}\n\n.tracking-wider {\n letter-spacing: 0.05em;\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity));\n}\n\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity));\n}\n\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgb(59 130 246 / var(--tw-text-opacity));\n}\n\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity));\n}\n\n.text-gray-400 {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity));\n}\n\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity));\n}\n\n.text-indigo-600 {\n --tw-text-opacity: 1;\n color: rgb(79 70 229 / var(--tw-text-opacity));\n}\n\n.text-gray-800 {\n --tw-text-opacity: 1;\n color: rgb(31 41 55 / var(--tw-text-opacity));\n}\n\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity));\n}\n\n.text-gray-700 {\n --tw-text-opacity: 1;\n color: rgb(55 65 81 / var(--tw-text-opacity));\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.opacity-100 {\n opacity: 1;\n}\n\n.shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition {\n transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.delay-150 {\n transition-delay: 150ms;\n}\n\n.duration-300 {\n transition-duration: 300ms;\n}\n\n.duration-150 {\n transition-duration: 150ms;\n}\n\n.duration-500 {\n transition-duration: 500ms;\n}\n\n.duration-75 {\n transition-duration: 75ms;\n}\n\n.ease-in-out {\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n#jkforum-helper .toggle-bg:after {\n content: '';\n position: absolute;\n top: 0.125rem;\n left: 0.125rem;\n height: 0.75rem;\n width: 0.75rem;\n border-radius: 9999px;\n border-width: 1px;\n --tw-border-opacity: 1;\n border-color: rgb(209 213 219 / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity));\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n#jkforum-helper input:checked + .toggle-bg:after {\n transform: translateX(100%);\n --tw-border-opacity: 1;\n border-color: rgb(255 255 255 / var(--tw-border-opacity));\n}\n\n#jkforum-helper input:checked + .toggle-bg {\n --tw-border-opacity: 1;\n border-color: rgb(37 99 235 / var(--tw-border-opacity));\n --tw-bg-opacity: 1;\n background-color: rgb(37 99 235 / var(--tw-bg-opacity));\n}\n\n.border-b {\n border-bottom: 1px solid lightgray;\n}\n\n/* 增加 visited 样式,图片模式已阅的帖子变灰色 */\n\n.xw0 a:visited {\n color: grey;\n}\n\n#jkforum-helper button {\n border: unset;\n}\n\n.focus-within\\:text-gray-400:focus-within {\n --tw-text-opacity: 1;\n color: rgb(156 163 175 / var(--tw-text-opacity));\n}\n\n.hover\\:translate-x-9:hover {\n --tw-translate-x: 2.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.hover\\:rotate-\\[360deg\\]:hover {\n --tw-rotate: 360deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.hover\\:scale-110:hover {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.hover\\:border-gray-200:hover {\n --tw-border-opacity: 1;\n border-color: rgb(229 231 235 / var(--tw-border-opacity));\n}\n\n.hover\\:bg-indigo-700:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-gray-200:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(229 231 235 / var(--tw-bg-opacity));\n}\n\n.hover\\:bg-gray-100:hover {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity));\n}\n\n.hover\\:text-gray-500:hover {\n --tw-text-opacity: 1;\n color: rgb(107 114 128 / var(--tw-text-opacity));\n}\n\n.hover\\:text-indigo-500:hover {\n --tw-text-opacity: 1;\n color: rgb(99 102 241 / var(--tw-text-opacity));\n}\n\n.hover\\:text-gray-900:hover {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity));\n}\n\n.hover\\:shadow-lg:hover {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.focus\\:border-blue-500:focus {\n --tw-border-opacity: 1;\n border-color: rgb(59 130 246 / var(--tw-border-opacity));\n}\n\n.focus\\:border-gray-100:focus {\n --tw-border-opacity: 1;\n border-color: rgb(243 244 246 / var(--tw-border-opacity));\n}\n\n.focus\\:bg-indigo-700:focus {\n --tw-bg-opacity: 1;\n background-color: rgb(67 56 202 / var(--tw-bg-opacity));\n}\n\n.focus\\:shadow-lg:focus {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\:ring-0:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus\\:ring-indigo-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));\n}\n\n.focus\\:ring-blue-500:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));\n}\n\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n.active\\:bg-indigo-800:active {\n --tw-bg-opacity: 1;\n background-color: rgb(55 48 163 / var(--tw-bg-opacity));\n}\n\n.active\\:shadow-lg:active {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.disabled\\:opacity-25:disabled {\n opacity: 0.25;\n}\n\n.group:hover .group-hover\\:text-gray-900 {\n --tw-text-opacity: 1;\n color: rgb(17 24 39 / var(--tw-text-opacity));\n}\n\n@media (min-width: 640px) {\n .sm\\:px-6 {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n }\n\n .sm\\:text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n }\n\n .sm\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n\n .sm\\:leading-5 {\n line-height: 1.25rem;\n }\n\n .sm\\:duration-700 {\n transition-duration: 700ms;\n }\n}\n", ""]); // Exports module.exports = ___CSS_LOADER_EXPORT___; /***/ }), /***/ 645: /***/ ((module) => { "use strict"; /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ 81: /***/ ((module) => { "use strict"; module.exports = function (i) { return i[1]; }; /***/ }), /***/ 466: /***/ (() => { (function (workerScript) { if (!/MSIE 10/i.test (navigator.userAgent)) { try { var blob = new Blob (["\ var fakeIdToId = {};\ onmessage = function (event) {\ var data = event.data,\ name = data.name,\ fakeId = data.fakeId,\ time;\ if(data.hasOwnProperty('time')) {\ time = data.time;\ }\ switch (name) {\ case 'setInterval':\ fakeIdToId[fakeId] = setInterval(function () {\ postMessage({fakeId: fakeId});\ }, time);\ break;\ case 'clearInterval':\ if (fakeIdToId.hasOwnProperty (fakeId)) {\ clearInterval(fakeIdToId[fakeId]);\ delete fakeIdToId[fakeId];\ }\ break;\ case 'setTimeout':\ fakeIdToId[fakeId] = setTimeout(function () {\ postMessage({fakeId: fakeId});\ if (fakeIdToId.hasOwnProperty (fakeId)) {\ delete fakeIdToId[fakeId];\ }\ }, time);\ break;\ case 'clearTimeout':\ if (fakeIdToId.hasOwnProperty (fakeId)) {\ clearTimeout(fakeIdToId[fakeId]);\ delete fakeIdToId[fakeId];\ }\ break;\ }\ }\ "]); // Obtain a blob URL reference to our worker 'file'. workerScript = window.URL.createObjectURL(blob); } catch (error) { /* Blob is not supported, use external script instead */ } } var worker, fakeIdToCallback = {}, lastFakeId = 0, maxFakeId = 0x7FFFFFFF, // 2 ^ 31 - 1, 31 bit, positive values of signed 32 bit integer logPrefix = 'HackTimer.js by turuslan: '; if (typeof (Worker) !== 'undefined') { function getFakeId () { do { if (lastFakeId == maxFakeId) { lastFakeId = 0; } else { lastFakeId ++; } } while (fakeIdToCallback.hasOwnProperty (lastFakeId)); return lastFakeId; } try { worker = new Worker (workerScript); window.setInterval = function (callback, time /* , parameters */) { var fakeId = getFakeId (); fakeIdToCallback[fakeId] = { callback: callback, parameters: Array.prototype.slice.call(arguments, 2) }; worker.postMessage ({ name: 'setInterval', fakeId: fakeId, time: time }); return fakeId; }; window.clearInterval = function (fakeId) { if (fakeIdToCallback.hasOwnProperty(fakeId)) { delete fakeIdToCallback[fakeId]; worker.postMessage ({ name: 'clearInterval', fakeId: fakeId }); } }; window.setTimeout = function (callback, time /* , parameters */) { var fakeId = getFakeId (); fakeIdToCallback[fakeId] = { callback: callback, parameters: Array.prototype.slice.call(arguments, 2), isTimeout: true }; worker.postMessage ({ name: 'setTimeout', fakeId: fakeId, time: time }); return fakeId; }; window.clearTimeout = function (fakeId) { if (fakeIdToCallback.hasOwnProperty(fakeId)) { delete fakeIdToCallback[fakeId]; worker.postMessage ({ name: 'clearTimeout', fakeId: fakeId }); } }; worker.onmessage = function (event) { var data = event.data, fakeId = data.fakeId, request, parameters, callback; if (fakeIdToCallback.hasOwnProperty(fakeId)) { request = fakeIdToCallback[fakeId]; callback = request.callback; parameters = request.parameters; if (request.hasOwnProperty ('isTimeout') && request.isTimeout) { delete fakeIdToCallback[fakeId]; } } if (typeof (callback) === 'string') { try { callback = new Function (callback); } catch (error) { console.log (logPrefix + 'Error parsing callback code string: ', error); } } if (typeof (callback) === 'function') { callback.apply (window, parameters); } }; worker.onerror = function (event) { console.log (event); }; } catch (error) { console.log (logPrefix + 'Initialisation failed'); console.error (error); } } else { console.log (logPrefix + 'Initialisation failed - HTML5 Web Worker is not supported'); } }) ('HackTimerWorker.js'); /***/ }), /***/ 745: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var m = __webpack_require__(533); if (true) { exports.createRoot = m.createRoot; exports.hydrateRoot = m.hydrateRoot; } else { var i; } /***/ }), /***/ 600: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var result = __webpack_require__(529); if (result && result.__esModule) { result = result.default; } if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /***/ 632: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); const lib_1 = __webpack_require__(915); const Home_1 = __webpack_require__(818); const react_1 = __importStar(__webpack_require__(995)); const commonMeta = __webpack_require__(419); const App = ({ username, formhash }) => { const [user, setUser] = (0, react_1.useState)(); const [showHome, setShowHome] = (0, react_1.useState)(false); const [counter, setCounter] = (0, react_1.useState)({ signBtn: 0, downloadBtn: 0, replyBtn: 0, thkBtn: 0, }); // 防止按钮重复点击 (0, react_1.useEffect)(() => { if (!user) { (0, lib_1.creatUser)(username, formhash).then((user) => { (0, lib_1.launch)(user); // 启动自动签到、投票、加载原图等 setUser(user); }); } }, [username, formhash, user]); return (react_1.default.createElement("div", { className: "fixed z-50" }, showHome ? (user && (react_1.default.createElement(Home_1.Home, { setShowHome: () => { setShowHome(!showHome); }, user: user, counter: counter, setCounter: setCounter }))) : (react_1.default.createElement("button", { className: "h-12 w-12 fixed -left-8 top-1/2 block text-white bg-transparent vertical transition ease-in-out delay-150 hover:translate-x-9 hover:scale-110 duration-300 bg-cover bg-center hover:rotate-[360deg]", style: { backgroundImage: `url(${commonMeta.icon})` }, onClick: () => { if (user) { setShowHome(!showHome); } else { new lib_1.MessageBox('未获取到用户,请稍后再试'); } } })))); }; exports["default"] = App; /***/ }), /***/ 321: /***/ ((__unused_webpack_module, exports) => { "use strict"; /* eslint-disable @typescript-eslint/no-explicit-any */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Status = exports.RunStatus = exports.Mood = void 0; var Mood; (function (Mood) { Mood["kaixin"] = "kx"; Mood["nanguo"] = "ng"; Mood["yumen"] = "ym"; Mood["wuliao"] = "wl"; Mood["fennu"] = "nu"; Mood["cahan"] = "ch"; Mood["fendou"] = "fd"; Mood["yonglan"] = "yl"; Mood["shuai"] = "shuai"; })(Mood = exports.Mood || (exports.Mood = {})); var Status; (function (Status) { Status["online"] = "online"; Status["offline"] = "offline"; })(Status || (Status = {})); exports.Status = Status; var RunStatus; (function (RunStatus) { RunStatus["NotRunning"] = "\u672A\u8FD0\u884C"; RunStatus["Waiting"] = "\u7B49\u5F85\u4E2D"; RunStatus["Running"] = "\u8FD0\u884C\u4E2D"; RunStatus["Error"] = "\u9519\u8BEF"; })(RunStatus || (RunStatus = {})); exports.RunStatus = RunStatus; /***/ }), /***/ 237: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Button = void 0; const react_1 = __importDefault(__webpack_require__(995)); const Button = (_a) => { var { text, title = '', onClick, disabled } = _a, rest = __rest(_a, ["text", "title", "onClick", "disabled"]); return (react_1.default.createElement("button", Object.assign({}, rest, { title: title, type: "button", "data-mdb-ripple": "true", "data-mdb-ripple-color": "light", disabled: disabled, className: `mx-1 my-1 px-2 py-1 text-xs font-medium text-center text-white inline-block leading-tight uppercase rounded shadow-md ${disabled ? ' cursor-not-allowed bg-indigo-400 ' : 'bg-indigo-600 hover:bg-indigo-700 hover:shadow-lg focus:bg-indigo-700 focus:shadow-lg active:bg-indigo-800 active:shadow-lg transition duration-150 ease-in-out focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500'}`, onClick: onClick }), text)); }; exports.Button = Button; /***/ }), /***/ 84: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Input = void 0; const react_1 = __importDefault(__webpack_require__(995)); const Input = (_a) => { var { label, placeholder, autoComplete, value, type = 'text' } = _a, args = __rest(_a, ["label", "placeholder", "autoComplete", "value", "type"]); return (react_1.default.createElement(react_1.default.Fragment, null, label ? (react_1.default.createElement("label", { htmlFor: 'input' + label, className: "block m-1 text-xs font-medium text-gray-900" }, label)) : (''), react_1.default.createElement("input", Object.assign({}, args, { autoComplete: autoComplete, type: type, id: label ? 'input' + label : '', placeholder: placeholder, value: value, className: "py-1 pl-2 block w-full text-gray-900 bg-gray-50 rounded-lg border sm:text-xs focus:ring-blue-500 focus:border-blue-500 " })))); }; exports.Input = Input; /***/ }), /***/ 653: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Modal = void 0; const react_1 = __importDefault(__webpack_require__(995)); const Modal = ({ header, footer, children, width, height, isShow = false, onClose }) => { if (!isShow) { return react_1.default.createElement(react_1.default.Fragment, null); } return (react_1.default.createElement("div", { className: "fixed top-0 right-0 h-full w-full left-0 z-50 overflow-y-auto overflow-x-hidden items-center justify-center flex bg-gray-900 bg-opacity-50" }, react_1.default.createElement("div", { className: `relative rounded-lg bg-white shadow m-4 flex flex-col ${width} ${height}` }, react_1.default.createElement("div", { className: "flex items-start justify-between rounded-t border-gray-300 border-solid border-0 border-b p-5" }, react_1.default.createElement("h3", { className: "text-xl font-medium text-gray-900 " }, header), react_1.default.createElement("button", { "aria-label": "Close", className: "ml-auto inline-flex items-center rounded-lg bg-transparent p-1.5 text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 ", type: "button", onClick: onClose }, react_1.default.createElement("svg", { stroke: "currentColor", fill: "none", strokeWidth: "0", viewBox: "0 0 24 24", "aria-hidden": "true", className: "h-5 w-5", height: "1em", width: "1em", xmlns: "http://www.w3.org/2000/svg" }, react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M6 18L18 6M6 6l12 12" })))), react_1.default.createElement("div", { className: "p-6 h-full overflow-auto" }, children), react_1.default.createElement("div", { className: "flex items-center rounded-b p-6 border-gray-300 border-solid border-0 border-t" }, footer)))); }; exports.Modal = Modal; /***/ }), /***/ 414: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Panel = void 0; const react_1 = __importDefault(__webpack_require__(995)); const Panel = ({ title, children }) => { return (react_1.default.createElement("div", { className: "border-b py-1" }, react_1.default.createElement("p", { className: "text-center font-bold" }, title), react_1.default.createElement("div", { className: "flex flex-wrap" }, children))); }; exports.Panel = Panel; /***/ }), /***/ 420: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); /* eslint-disable react/jsx-key */ const commonType_1 = __webpack_require__(321); const tools_1 = __webpack_require__(633); const react_1 = __importStar(__webpack_require__(995)); const react_table_1 = __webpack_require__(282); const Button_1 = __webpack_require__(237); const Toggle_1 = __webpack_require__(219); const EditableCell = ({ value: initialValue, row: { index }, column: { id }, updateMyData, // This is a custom function that we supplied to our table instance }) => { // We need to keep and update the state of the cell normally const [value, setValue] = (0, react_1.useState)(initialValue); const onChange = (e) => { setValue(e.target.value); }; // We'll only update the external data when the input is blurred const onBlur = () => { updateMyData(index, id, value); }; // If the initialValue is changed external, sync it up with our state (0, react_1.useEffect)(() => { setValue(initialValue); }, [initialValue]); return (react_1.default.createElement("div", null, react_1.default.createElement("input", { className: "w-6 mx-1", value: value, onChange: onChange, onBlur: onBlur }), "\u5206\u949F/\u70B9\u51FB")); }; const ToggleCell = ({ value, row: { index }, column: { id }, updateMyData, // This is a custom function that we supplied to our table instance }) => { const update = () => { updateMyData(index, id, value === commonType_1.Status.online ? commonType_1.Status.offline : commonType_1.Status.online); }; return (react_1.default.createElement(Toggle_1.Toggle, { mykey: `${id}-${index}-${value}`, label: value === commonType_1.Status.online ? '已启用' : '未启用', onClick: update, checked: value === commonType_1.Status.online })); }; const LightCell = ({ value }) => { const getLightColor = (value) => { switch (true) { case value === commonType_1.RunStatus.Running: return 'bg-green-400'; case value === commonType_1.RunStatus.NotRunning: return 'bg-gray-400'; case value === commonType_1.RunStatus.Error: return 'bg-red-400'; case value === commonType_1.RunStatus.Waiting: return 'bg-blue-400'; default: break; } }; return (react_1.default.createElement("div", { title: "\u72B6\u6001\u4E3A\u2018\u7B49\u5F85\u4E2D\u2019\u65F6\u4E3A\u672A\u5230\u6267\u884C\u65F6\u95F4\u6BB5\uFF0C\u72B6\u6001\u4E3A\u2018\u9519\u8BEF\u2019\u65F6\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u65B0\u8FD0\u884C", className: `flex items-center w-16 cursor-help` }, react_1.default.createElement("span", { className: `rounded-md px-2 py-1 font-bold text-white ${getLightColor(value)}` }, value))); }; const DeleteCell = ({ row: { index }, deleteData, // This is a custom function that we supplied to our table instance }) => { return react_1.default.createElement(Button_1.Button, { text: '删除', onClick: () => deleteData(index) }); }; function ReactTableCard({ title, data, updateMyData, deleteData, skipPageReset = true, searchBar = true, }) { const colHeader = (headerItem) => { if (headerItem === 'title') { return { Header: '标题', accessor: headerItem, Cell: (props) => { return (react_1.default.createElement("strong", { title: props.value, className: "block whitespace-nowrap overflow-hidden overflow-ellipsis mx-1" }, props.value)); }, }; } else if (headerItem === 'status') { return { Header: '启用状态', accessor: headerItem, Cell: ToggleCell, }; } else if (headerItem === 'runStatus') { return { Header: '运行状态', accessor: headerItem, Cell: LightCell, }; } else if (headerItem === 'cycle') { return { Header: '点击间隔时间', accessor: headerItem, Cell: EditableCell, }; } else if (headerItem === 'delete') { return { Header: '操作', accessor: headerItem, Cell: DeleteCell, }; } else if (headerItem === 'url') { return { Header: '帖子ID', accessor: headerItem, Cell: ({ value }) => { return (react_1.default.createElement("a", { className: "border-b", title: value, target: "_blank", href: value, rel: "noreferrer" }, (0, tools_1.getTid)(value))); }, }; } else if (headerItem === 'times') { return { Header: '点击次数', accessor: headerItem, Cell: ({ value }) => { return react_1.default.createElement("span", null, value + ' 次'); }, }; } else if (headerItem === 'nextClickTime') { return { Header: '下次点击', accessor: headerItem, Cell: ({ value }) => { return react_1.default.createElement("span", null, new Date(value).toLocaleString()); }, }; } else if (headerItem === 'retry') { return { Header: '重试次数', accessor: headerItem, Cell: ({ value }) => { return react_1.default.createElement("span", null, value); }, }; } else if (headerItem === 'runTime') { return { Header: '运行时段', accessor: headerItem, Cell: ({ value }) => { return react_1.default.createElement("span", null, value ? value.startTime + ':00~' + value.endTime + ':59' : '24h'); }, }; } else { return { Header: headerItem, accessor: headerItem, }; } }; const memoColumns = (0, react_1.useMemo)(() => { const headers = Object.keys(data[0]).map(colHeader); // push columns return headers; }, [data]); const memoData = (0, react_1.useMemo)(() => data, [data]); const memoTitle = (0, react_1.useMemo)(() => title, [title]); const defaultSort = () => { const headers = Object.keys(data[0]).map(colHeader); return headers.filter((col) => (col.Header === 'name' ? { id: 'total', desc: true } : { id: 'sum', desc: true })); }; const defaultColumn = { Cell: EditableCell, }; const tableInstance = (0, react_table_1.useTable)({ columns: memoColumns, data: memoData, initialState: { // sortBy: [defaultSort()], pageSize: 20, }, // defaultColumn, autoResetPage: !skipPageReset, disableSortRemove: true, updateMyData, deleteData, }, react_table_1.useGlobalFilter, react_table_1.useSortBy, react_table_1.usePagination); const { getTableProps, getTableBodyProps, headerGroups, prepareRow, setGlobalFilter, page, canPreviousPage, canNextPage, pageOptions, pageCount, gotoPage, nextPage, previousPage, setPageSize, state: { pageIndex, pageSize, globalFilter }, } = tableInstance; return (react_1.default.createElement("div", null, react_1.default.createElement("div", { className: "bg-white px-2 py-4" }, react_1.default.createElement("h3", { className: "text-lg px-2 py-2 leading-6 font-medium text-gray-900" }, memoTitle), searchBar ? (react_1.default.createElement("div", { className: "mx-2 flex-1 relative text-gray-500 focus-within:text-gray-400" }, react_1.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-1 flex items-center pointer-events-none" }, react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", className: "h-4 w-4", height: "25", width: "25" }, react_1.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }))), react_1.default.createElement("input", { className: "pl-5 block shadow-sm border-2 transition text-gray-900 disabled:opacity-25 focus:border-gray-100 focus:outline-none focus:ring-0 duration-150 ease-in-out sm:text-sm sm:leading-5", type: "text", value: globalFilter || '', onChange: (e) => setGlobalFilter(e.target.value) }))) : (''), react_1.default.createElement("table", Object.assign({}, getTableProps(), { className: "mb-4 min-w-full divide-y divide-gray-100 table-auto" }), react_1.default.createElement("thead", { className: "bg-gray-50 text-xs uppercase text-gray-700 " }, headerGroups.map((headerGroup) => (react_1.default.createElement("tr", Object.assign({}, headerGroup.getHeaderGroupProps()), headerGroup.headers.map((column) => (react_1.default.createElement("th", Object.assign({}, column.getHeaderProps(column.getSortByToggleProps()), { className: "px-2 py-3 text-left text-xs text-gray-500 uppercase tracking-wider" }), react_1.default.createElement("div", { className: "flex" }, column.render('Header'), column.isSorted ? (column.isSortedDesc ? (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "h-4 w-4", height: "16", width: "16" }, react_1.default.createElement("path", { fillRule: "evenodd", d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", clipRule: "evenodd" }))) : (react_1.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "h-4 w-4", height: "16", width: "16" }, react_1.default.createElement("path", { fillRule: "evenodd", d: "M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z", clipRule: "evenodd" })))) : (''))))))))), react_1.default.createElement("tbody", Object.assign({ className: "w-full divide-y text-left text-sm text-gray-500 ", role: "table" }, getTableBodyProps()), page.map((row) => { prepareRow(row); return (react_1.default.createElement("tr", Object.assign({}, row.getRowProps(), { className: "hover:bg-gray-200 bg-white" }), row.cells.map((cell) => { return (react_1.default.createElement("td", Object.assign({}, cell.getCellProps(), { className: "text-xs p-0 h-8 whitespace-nowrap font-medium text-gray-900 max-w-[150px] overflow-hidden text-ellipsis" }), cell.render('Cell'))); }))); }))), react_1.default.createElement("div", { className: "flex justify-center bg-gray-100" }, react_1.default.createElement("div", { className: "px-2 text-left text-xs text-gray-500 tracking-wider" }, react_1.default.createElement("button", { className: "bg-gray-200 hover:bg-gray-100 font-bold py-1 px-2 border-b-2 border-gray-400 hover:border-gray-200 rounded", onClick: () => gotoPage(0), disabled: !canPreviousPage }, '<< 第一页'), ' ', react_1.default.createElement("button", { className: "bg-gray-200 hover:bg-gray-100 font-bold py-1 px-2 border-b-2 border-gray-400 hover:border-gray-200 rounded", onClick: () => previousPage(), disabled: !canPreviousPage }, '< 上一页'), ' ', react_1.default.createElement("button", { className: "bg-gray-200 hover:bg-gray-100 font-bold py-1 px-2 border-b-2 border-gray-400 hover:border-gray-200 rounded", onClick: () => nextPage(), disabled: !canNextPage }, '下一页 >'), ' ', react_1.default.createElement("button", { className: "bg-gray-200 hover:bg-gray-100 font-bold py-1 px-2 border-b-2 border-gray-400 hover:border-gray-200 rounded", onClick: () => gotoPage(pageCount - 1), disabled: !canNextPage }, '最后一页 >>'), ' ', react_1.default.createElement("span", null, "| \u7B2C", ' ', react_1.default.createElement("strong", null, pageIndex + 1, " \u9875\uFF0C\u5171 ", pageOptions.length, " \u9875"), ' '), react_1.default.createElement("span", null, "| \u8DF3\u8F6C\u5230\u7B2C", ' ', react_1.default.createElement("input", { className: "w-8 bg-gray-100 hover:bg-gray-200", type: "number", defaultValue: pageIndex + 1, onChange: (e) => { const page = e.target.value ? Number(e.target.value) - 1 : 0; gotoPage(page); } }), ' ', "\u9875"), ' ', react_1.default.createElement("select", { className: "bg-gray-100 hover:bg-gray-200 pl-1", value: pageSize, onChange: (e) => { setPageSize(Number(e.target.value)); } }, [10, 20, 50].map((pageSize) => (react_1.default.createElement("option", { key: pageSize, value: pageSize }, "\u663E\u793A", pageSize, "\u6761"))))))))); } exports["default"] = ReactTableCard; /***/ }), /***/ 815: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextArea = void 0; const react_1 = __importDefault(__webpack_require__(995)); const TextArea = ({ label, placeholder, onChange, value, rows = 3, cols }) => { return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("label", { htmlFor: 'textarea' + label, className: "block m-1 text-xs font-medium text-gray-900 " }, label), react_1.default.createElement("textarea", { className: "px-2 block w-full text-gray-900 bg-gray-50 rounded-lg border sm:text-xs focus:ring-blue-500 focus:border-blue-500 ", id: 'textarea' + label, rows: rows, cols: cols, placeholder: placeholder, onChange: (e) => { onChange(e.target.value); }, value: value }))); }; exports.TextArea = TextArea; /***/ }), /***/ 219: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Toggle = void 0; const react_1 = __importStar(__webpack_require__(995)); const Toggle = ({ label, checked, title, mykey = '-', onClick }) => { const [selected, setSelected] = (0, react_1.useState)(checked); (0, react_1.useEffect)(() => { setSelected(checked); }, [checked]); return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("label", { key: label + mykey, title: title, htmlFor: 'toggle-' + mykey + label, className: "mx-1 my-1 flex items-center cursor-pointer relative" }, react_1.default.createElement("input", { type: "checkbox", id: 'toggle-' + mykey + label, className: "sr-only", checked: selected, onClick: () => { setSelected(!selected); }, onChange: (e) => { onClick(e.target.checked); } }), react_1.default.createElement("div", { className: "toggle-bg bg-gray-300 border-2 border-gray-200 h-4 w-7 rounded-full" }), react_1.default.createElement("span", { className: "ml-1 text-gray-900 text-xs" }, label)))); }; exports.Toggle = Toggle; /***/ }), /***/ 740: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Toggle = exports.TextArea = exports.ReactTableCard = exports.Panel = exports.Modal = exports.Input = exports.Button = void 0; var Button_1 = __webpack_require__(237); Object.defineProperty(exports, "Button", ({ enumerable: true, get: function () { return Button_1.Button; } })); var Input_1 = __webpack_require__(84); Object.defineProperty(exports, "Input", ({ enumerable: true, get: function () { return Input_1.Input; } })); var Modal_1 = __webpack_require__(653); Object.defineProperty(exports, "Modal", ({ enumerable: true, get: function () { return Modal_1.Modal; } })); var Panel_1 = __webpack_require__(414); Object.defineProperty(exports, "Panel", ({ enumerable: true, get: function () { return Panel_1.Panel; } })); var Table_1 = __webpack_require__(420); Object.defineProperty(exports, "ReactTableCard", ({ enumerable: true, get: function () { return __importDefault(Table_1).default; } })); var TextArea_1 = __webpack_require__(815); Object.defineProperty(exports, "TextArea", ({ enumerable: true, get: function () { return TextArea_1.TextArea; } })); var Toggle_1 = __webpack_require__(219); Object.defineProperty(exports, "Toggle", ({ enumerable: true, get: function () { return Toggle_1.Toggle; } })); /***/ }), /***/ 629: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); const app_1 = __importDefault(__webpack_require__(632)); const lib_1 = __webpack_require__(915); __webpack_require__(466); // 定时器不会因为窗口隐藏而降频 const react_1 = __importDefault(__webpack_require__(995)); const client_1 = __webpack_require__(745); const start = () => { const username = (0, lib_1.getUserName)(); const formhash = (0, lib_1.getFormhash)(); if (username && formhash) { Promise.resolve().then(() => __importStar(__webpack_require__(19))); // 初始化消息盒子 lib_1.MessageBox.generate(); // 添加根元素 const rootDiv = document.createElement('div'); rootDiv.id = 'jkforum-helper'; document.body.prepend(rootDiv); const root = (0, client_1.createRoot)(rootDiv); // createRoot(container!) if you use TypeScript root.render(react_1.default.createElement(app_1.default, { username: username, formhash: formhash })); } }; if (true) { start(); } else {} /***/ }), /***/ 516: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.postDataCdata = exports.postData = exports.getData = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); // GM_xmlhttpRequest GET异步通用模块 function getData(url, type = "document" /* DOCUMENT */, usermethod = "GET" /* GET */) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: usermethod, url: url, responseType: type, timeout: 5 * 60 * 1000, onload: function (response) { if (response.status >= 200 && response.status < 400) { resolve(response.response); } else { reject(response); } }, onerror: function (error) { new _1.MessageBox('网络错误'); reject(error); }, ontimeout: () => { new _1.MessageBox('网络超时', 'none', "LOG_POP_GM" /* LOG_POP_GM */); reject('timeout'); }, }); }); } exports.getData = getData; function postDataCdata(url, postData, responseType = "document" /* DOCUMENT */, usermethod = "POST" /* POST */, contentType = "application/x-www-form-urlencoded" /* FORM */) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: usermethod, url: url, headers: { 'Content-Type': contentType, }, data: postData, responseType: responseType, timeout: 1 * 60 * 1000, onload: function (response) { if (response.status >= 200 && response.status < 400) { resolve((0, tools_1.turnCdata)(response.response)); } else { new _1.MessageBox('请求错误:' + response.status); reject(response.status); } }, onerror: function (error) { new _1.MessageBox('网络错误'); reject(error); }, ontimeout: () => { new _1.MessageBox('网络超时', 'none', "LOG_POP_GM" /* LOG_POP_GM */); reject('timeout'); }, }); }); } exports.postDataCdata = postDataCdata; // 正常的post function postData(url, data, { responseType = "document" /* DOCUMENT */, usermethod = "POST" /* POST */, contentType = "application/x-www-form-urlencoded" /* FORM */, authorization, cookie, } = { responseType: "document" /* DOCUMENT */, usermethod: "POST" /* POST */, contentType: "application/x-www-form-urlencoded" /* FORM */, }) { const headers = { 'content-type': contentType, }; if (authorization) { headers.authorization = authorization; } if (cookie) { headers.cookie = cookie; } return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: usermethod, url, headers, data, responseType: responseType, timeout: 1 * 60 * 1000, onload: function (response) { if (response.status >= 200 && response.status < 400) { resolve(response.response); } else { reject(response); } }, onerror: function (error) { reject(error); }, ontimeout: () => { new _1.MessageBox('网络超时', 'none', "LOG_POP_GM" /* LOG_POP_GM */); reject('timeout'); }, }); }); } exports.postData = postData; /***/ }), /***/ 342: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autoPost = void 0; const tools_1 = __webpack_require__(633); const ajax_1 = __webpack_require__(516); const message_1 = __webpack_require__(244); const autoPost = (user) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b; if ((_a = user.posts) === null || _a === void 0 ? void 0 : _a.length) { if (confirm('已有历史文章,是否使用历史文章发文')) { if (!((_b = user.posts) === null || _b === void 0 ? void 0 : _b.length)) { return alert('没有读取到文章'); } const post = user.posts[user.posts.length - 1]; yield newThread(post, user.formhash); return; } } if (!location.href.includes('mod=post&action=newthread')) { return alert('请进入发表文章页面,输入好文章后再点击自动发文,第一次发文后会保存,之后发文无需再次进入发表文章页面'); } const form = document.querySelector('#postform'); if (!form) { return alert('未找到发帖输入框'); } const inputTime = prompt('请输入回帖间隔时间(单位分钟,默认361分钟)', '361'); if (!Number.isInteger(Number(inputTime))) { return alert('时间未输入或者数值错误'); } if (!form.message.value || !form.message.value) { return alert('请输入文章内容'); } const newPost = { typeid: form.typeid.value, subject: form.subject.value, message: form.message.value, allownoticeauthor: form.allownoticeauthor.value, postUrl: location.href + '&extra=&topicsubmit=yes', postTime: Number(inputTime) * 60 * 1000, }; if (!user.posts) { user.posts = []; } user.posts.push(newPost); GM_setValue(user.username, user); //保存当天日// today 初始化 yield newThread(newPost, user.formhash); }); exports.autoPost = autoPost; const newThread = (post, formhash) => __awaiter(void 0, void 0, void 0, function* () { var _c; const currentUnixTimestamp = Math.floor(Date.now() / 1000); const data = (0, tools_1.urlSearchParams)({ formhash: formhash, posttime: currentUnixTimestamp, wysiwyg: '1', typeid: post.typeid, subject: post.subject, message: post.message, accept_checkbox: 'on', 'localid[]': 1, 'imglocalid[]': 1, uploadalbum: -2, usesig: 1, allownoticeauthor: post.allownoticeauthor, }).toString(); try { const res = yield (0, ajax_1.postData)(post.postUrl, data, { responseType: "document" /* DOCUMENT */, usermethod: "POST" /* POST */, contentType: "application/x-www-form-urlencoded" /* FORM */, }); const msg = (_c = res === null || res === void 0 ? void 0 : res.querySelector('#messagetext p')) === null || _c === void 0 ? void 0 : _c.textContent; if (msg) { new message_1.MessageBox(msg); } else { new message_1.MessageBox(`发文成功,到设置时间(${post.postTime / 1000 / 60}分钟)后将会再次自动发表文章`); setTimeout(() => { newThread(post, formhash); }, post.postTime); } } catch (error) { new message_1.MessageBox('发文失败:' + JSON.stringify(error)); } }); /***/ }), /***/ 134: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.noDisplayPic = exports.downloadImgs = void 0; const ConcurrencyPromisePool_1 = __webpack_require__(287); const file_saver_1 = __webpack_require__(581); const jszip_1 = __importDefault(__webpack_require__(583)); const _1 = __webpack_require__(915); function downloadImgs(user, counter, setCounter) { var _a; // 防重复点击 setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 1 })); const imgsUrls = []; // 图片下载链接 const imgsTitles = []; // 图片名称 const foName = document.querySelector('.title-cont h1'); if (!foName) { new _1.MessageBox('没有帖子标题!'); return setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); } const folderName = foName.innerHTML.trim().replace(/\.+/g, '-'); const pcbImg = document.querySelectorAll('.pcb img'); // 所有帖子楼层的图片,逐个过滤 if (pcbImg.length) { for (let i = 0; i < pcbImg.length; i++) { //遍历图片列表 const img = pcbImg[i]; if (img.title && img.getAttribute('file') && ((_a = img.getAttribute('file')) === null || _a === void 0 ? void 0 : _a.includes('mymypic.net'))) { const reg = /\./g; if (!reg.test(img.title)) { // 文件格式校验 if (reg.test(img.alt)) { // 文件格式修复 img.title = img.alt; } else { new _1.MessageBox('获取图片名失败!'); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); return; } } const imgTitles = img.title.split('.'); const title = `${imgTitles[imgTitles.length - 2]}-${i + 1}.${imgTitles[imgTitles.length - 1]}`; // 标题 +i.jpg,防重名! imgsTitles.push(title); // 保存下载名称到数组 const imgAtrrFile = img.getAttribute('file'); imgAtrrFile && imgsUrls.push(imgAtrrFile.split('.thumb.')[0]); // 保存下载链接到数组 } else if (!img.getAttribute('file') && img.src.includes('mymypic.net')) { const nameSrc = img.src.split('/'); imgsTitles.push(nameSrc[nameSrc.length - 1]); // 保存下载名称到数组 imgsUrls.push(img.src.split('.thumb.')[0]); // 保存下载链接到数组 } else { // console.log(img.src, '跨域请求,不可下载外链图片!'); // new MessageBox('跨域请求,不可下载外链图片!'); } } if (imgsUrls.length && imgsTitles.length) { batchDownload(imgsUrls, imgsTitles, folderName, user, counter, setCounter); } else { new _1.MessageBox('没有可下载的图片!'); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); return 0; } } else { new _1.MessageBox('没有图片!'); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); return 0; } } exports.downloadImgs = downloadImgs; // 批量下载 顺序 function batchDownload(imgsUrls, imgsTitles, folderName, user, counter, setCounter) { const zip = new jszip_1.default(); const promises = []; const mesIdH = new _1.MessageBox('正在下载...', 'none'); // 永久消息 const mesIdP = new _1.MessageBox('...', 'none'); // 永久消息 for (let index = 0; index < imgsUrls.length; index++) { const item = imgsUrls[index]; // 包装成 promise const promise = () => { const file_name = imgsTitles[index]; // 获取文件名 mesIdH.update(`正在下载:第 ${index + 1} / ${imgsUrls.length} 张,文件名:${file_name}`); return (0, _1.getData)(item, "blob" /* BLOB */) .then((blob) => { const data = blob; // 下载文件, 并存成ArrayBuffer对象 zip.file(file_name, data, { binary: true, }); // 逐个添加文件 mesIdP.update(`第 ${index + 1} 张,文件名:${file_name},大小:${(data.size / 1024).toFixed(0)} Kb,下载完成!等待压缩...`); }) .catch((err) => { // 移除消息; if (err.responseText) { const domParser = new DOMParser(); const xmlDoc = domParser.parseFromString(err.responseText, 'text/html'); mesIdP.update(`第 ${index + 1} 张,请求错误:${xmlDoc.body.innerHTML}`); } else if (err.status) { console.error(err.status); } else { console.error(err); } return -1; // 错误处理, 标记错误并返回 }); }; promises.push(promise); } const pool = new ConcurrencyPromisePool_1.ConcurrencyPromisePool(user.limit); pool.all(promises).then((results) => { mesIdH.remove(); counter.downloadBtn = 0; for (let i = 0; i < results.length; i++) { if (results[i] == -1) { // new MessageBox("文件缺失!") counter.downloadBtn++; } } if (results.length == counter.downloadBtn) { new _1.MessageBox('全部图片下载失败!'); mesIdP.remove(); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); return; } if (counter.downloadBtn) { if (!confirm(`检测到文件缺失 ${counter.downloadBtn} 张,是否继续压缩?`)) { mesIdP.remove(); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); return; } } mesIdP.update('正在压缩打包,大文件请耐心等待...'); zip .generateAsync({ type: 'blob', }) .then((content) => { // 生成二进制流 mesIdP.remove(); setCounter(Object.assign(Object.assign({}, counter), { downloadBtn: 0 })); (0, file_saver_1.saveAs)(content, `${folderName} [${imgsUrls.length}P]`); // 利用file-saver保存文件,大文件需等待很久 }); }); } function noDisplayPic() { var _a; const pcbImg = document.querySelectorAll('.pcb img'); // 所有帖子楼层的图片,逐个过滤 if (pcbImg.length) { for (let i = 0; i < pcbImg.length; i++) { //遍历图片列表 const img = pcbImg[i]; // 前10张 if (img.title && img.getAttribute('file') && ((_a = img.getAttribute('file')) === null || _a === void 0 ? void 0 : _a.includes('mymypic.net'))) { img.src = 'https://www.jkforum.net/static/image/common/none.gif'; // new MessageBox("屏蔽图片成功"); // 懒加载部分 const observer = new MutationObserver(() => { // 监听元素子节点属性变化,然后屏蔽链接 if (img.src != 'https://www.jkforum.net/static/image/common/none.gif') { observer.disconnect(); // 断开监听 console.log('屏蔽图片成功:', img.src); img.src = 'https://www.jkforum.net/static/image/common/none.gif'; } }); // 建立监听器 observer.observe(img, { // 开始监听 attributes: true, }); } } new _1.MessageBox('屏蔽图片完成!'); } else { new _1.MessageBox('没有图片!'); } } exports.noDisplayPic = noDisplayPic; /***/ }), /***/ 662: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setFastReply = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); function setFastReply(user) { return __awaiter(this, void 0, void 0, function* () { // 设置快速回复 try { const htmlData = yield (0, _1.getData)(user.fastReplyUrl); const options = htmlData.querySelectorAll('#rqcss select option'); const fastReply = []; //返回数组 if (options.length) { options.forEach((option) => { if (option.value) { //去掉空值 fastReply.push((0, tools_1.replaceHtml)(option.value)); //去掉需要转义的内容 } }); } else { new _1.MessageBox('获取快速回复失败!'); return user; } if (fastReply.length) { user.fastReply = fastReply; new _1.MessageBox('获取快速回复成功!'); } else { new _1.MessageBox('获取快速回复失败!'); } return user; } catch (e) { console.error(e); return user; } }); } exports.setFastReply = setFastReply; /***/ }), /***/ 915: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setTimeoutWorker = exports.setIntervalWorker = exports.autoVoted = exports.getUserName = exports.getUserFromName = exports.getFormhash = exports.creatUser = exports.User = exports.autoThk = exports.timeControl = exports.sign = exports.resetReplyData = exports.replyOrThk = exports.addPageBatch = exports.addOnePage = exports.autoPlay = exports.addPlayEvent = exports.autoPay = exports.loadOriginImage = exports.autofillCaptcha = exports.MessageBox = exports.swThk = exports.swRePic = exports.swPay = exports.swDailyTask = exports.checkUpdate = exports.launch = exports.autoDailyTasks = exports.setFastReply = exports.noDisplayPic = exports.downloadImgs = exports.postDataCdata = exports.postData = exports.getData = void 0; var ajax_1 = __webpack_require__(516); Object.defineProperty(exports, "getData", ({ enumerable: true, get: function () { return ajax_1.getData; } })); Object.defineProperty(exports, "postData", ({ enumerable: true, get: function () { return ajax_1.postData; } })); Object.defineProperty(exports, "postDataCdata", ({ enumerable: true, get: function () { return ajax_1.postDataCdata; } })); var downloadPicture_1 = __webpack_require__(134); Object.defineProperty(exports, "downloadImgs", ({ enumerable: true, get: function () { return downloadPicture_1.downloadImgs; } })); Object.defineProperty(exports, "noDisplayPic", ({ enumerable: true, get: function () { return downloadPicture_1.noDisplayPic; } })); var fastReply_1 = __webpack_require__(662); Object.defineProperty(exports, "setFastReply", ({ enumerable: true, get: function () { return fastReply_1.setFastReply; } })); var launch_1 = __webpack_require__(450); Object.defineProperty(exports, "autoDailyTasks", ({ enumerable: true, get: function () { return launch_1.autoDailyTasks; } })); Object.defineProperty(exports, "launch", ({ enumerable: true, get: function () { return launch_1.launch; } })); var menuCommand_1 = __webpack_require__(817); Object.defineProperty(exports, "checkUpdate", ({ enumerable: true, get: function () { return menuCommand_1.checkUpdate; } })); Object.defineProperty(exports, "swDailyTask", ({ enumerable: true, get: function () { return menuCommand_1.swDailyTask; } })); Object.defineProperty(exports, "swPay", ({ enumerable: true, get: function () { return menuCommand_1.swPay; } })); Object.defineProperty(exports, "swRePic", ({ enumerable: true, get: function () { return menuCommand_1.swRePic; } })); Object.defineProperty(exports, "swThk", ({ enumerable: true, get: function () { return menuCommand_1.swThk; } })); var message_1 = __webpack_require__(244); Object.defineProperty(exports, "MessageBox", ({ enumerable: true, get: function () { return message_1.MessageBox; } })); var ocr_1 = __webpack_require__(2); Object.defineProperty(exports, "autofillCaptcha", ({ enumerable: true, get: function () { return ocr_1.autofillCaptcha; } })); var originImage_1 = __webpack_require__(87); Object.defineProperty(exports, "loadOriginImage", ({ enumerable: true, get: function () { return originImage_1.loadOriginImage; } })); var pay_1 = __webpack_require__(363); Object.defineProperty(exports, "autoPay", ({ enumerable: true, get: function () { return pay_1.autoPay; } })); var play_1 = __webpack_require__(687); Object.defineProperty(exports, "addPlayEvent", ({ enumerable: true, get: function () { return play_1.addPlayEvent; } })); Object.defineProperty(exports, "autoPlay", ({ enumerable: true, get: function () { return play_1.autoPlay; } })); var replyAndThank_1 = __webpack_require__(872); Object.defineProperty(exports, "addOnePage", ({ enumerable: true, get: function () { return replyAndThank_1.addOnePage; } })); Object.defineProperty(exports, "addPageBatch", ({ enumerable: true, get: function () { return replyAndThank_1.addPageBatch; } })); Object.defineProperty(exports, "replyOrThk", ({ enumerable: true, get: function () { return replyAndThank_1.replyOrThk; } })); var resetReplyData_1 = __webpack_require__(821); Object.defineProperty(exports, "resetReplyData", ({ enumerable: true, get: function () { return resetReplyData_1.resetReplyData; } })); var sign_1 = __webpack_require__(943); Object.defineProperty(exports, "sign", ({ enumerable: true, get: function () { return sign_1.sign; } })); Object.defineProperty(exports, "timeControl", ({ enumerable: true, get: function () { return sign_1.timeControl; } })); var thank_1 = __webpack_require__(226); Object.defineProperty(exports, "autoThk", ({ enumerable: true, get: function () { return thank_1.autoThk; } })); var user_1 = __webpack_require__(506); Object.defineProperty(exports, "User", ({ enumerable: true, get: function () { return user_1.User; } })); Object.defineProperty(exports, "creatUser", ({ enumerable: true, get: function () { return user_1.creatUser; } })); Object.defineProperty(exports, "getFormhash", ({ enumerable: true, get: function () { return user_1.getFormhash; } })); Object.defineProperty(exports, "getUserFromName", ({ enumerable: true, get: function () { return user_1.getUserFromName; } })); Object.defineProperty(exports, "getUserName", ({ enumerable: true, get: function () { return user_1.getUserName; } })); var vote_1 = __webpack_require__(608); Object.defineProperty(exports, "autoVoted", ({ enumerable: true, get: function () { return vote_1.autoVoted; } })); var webWorker_1 = __webpack_require__(67); Object.defineProperty(exports, "setIntervalWorker", ({ enumerable: true, get: function () { return webWorker_1.setIntervalWorker; } })); Object.defineProperty(exports, "setTimeoutWorker", ({ enumerable: true, get: function () { return webWorker_1.setTimeoutWorker; } })); /***/ }), /***/ 450: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.launch = exports.autoDailyTasks = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); // 启动 function launch(user) { return __awaiter(this, void 0, void 0, function* () { try { // 增加路由地址判断,只执行对应函数 const localUrl = location.href; if (localUrl.includes('thread')) { if (user.autoThkSw) { // 自动感谢当前贴 yield (0, _1.autoThk)(user); } if (user.autoPaySw) { // 自动购买当前贴 yield (0, _1.autoPay)(user); } if (user.autoRePicSw) { // 自动加载原图; (0, _1.loadOriginImage)(); } // 自动播放图片 const counter = { playBtn: 0, playFlag: 0, }; (0, _1.addPlayEvent)(counter, user); } else if (localUrl.includes('/forum-') || localUrl.includes('/type-') // || localUrl.includes('forum.php?mod=forumdisplay') // 图片模式只有一个页面,不需要 ) { // 去掉高亮标题 const hightLightTitles = document.querySelectorAll('[style="color: #2B65B7"]'); if (hightLightTitles.length) { hightLightTitles.forEach((e) => { e.style.color = ''; }); } } // 天变动则签到\投票 const now = new tools_1.NowTime(); if (user.today != now.day) { user.today = now.day; yield Promise.all([(0, _1.sign)(user), (0, _1.autoVoted)(user)]); } // 异步启动定时每日任务 if (user.autoDailyTask) { autoDailyTasks(user); } } catch (e) { GM_setValue(user.username, user); //保存当天日// today 初始化 console.error(e); } }); } exports.launch = launch; const autoDailyTasks = (user) => __awaiter(void 0, void 0, void 0, function* () { yield (0, tools_1.waitFor)(86400000); yield Promise.all([(0, _1.sign)(user), (0, _1.autoVoted)(user)]); yield autoDailyTasks(user); }); exports.autoDailyTasks = autoDailyTasks; /***/ }), /***/ 817: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.swThk = exports.swRePic = exports.swPay = exports.swDailyTask = exports.checkUpdate = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); function swRePic(user) { if (user.autoRePicSw) { user.autoRePicSw = false; GM_setValue(user.username, user); new _1.MessageBox('已关闭加载原图'); } else { user.autoRePicSw = true; GM_setValue(user.username, user); new _1.MessageBox('已开启加载原图'); } } exports.swRePic = swRePic; function swPay(user) { if (user.autoPaySw) { user.autoPaySw = false; GM_setValue(user.username, user); new _1.MessageBox('已关闭自动购买'); } else { user.autoPaySw = true; GM_setValue(user.username, user); new _1.MessageBox('已开启自动购买'); } } exports.swPay = swPay; function swThk(user) { if (user.autoThkSw) { user.autoThkSw = false; GM_setValue(user.username, user); new _1.MessageBox('已关闭自动感谢'); } else { user.autoThkSw = true; GM_setValue(user.username, user); new _1.MessageBox('已开启自动感谢'); } } exports.swThk = swThk; function swDailyTask(user) { if (user.autoDailyTask) { user.autoDailyTask = false; GM_setValue(user.username, user); new _1.MessageBox('已关闭定时每日任务,刷新页面后生效'); } else { user.autoDailyTask = true; GM_setValue(user.username, user); new _1.MessageBox('已开启定时每日任务,刷新页面后生效'); } } exports.swDailyTask = swDailyTask; function checkUpdate(user) { return __awaiter(this, void 0, void 0, function* () { const msg = new _1.MessageBox('正在检查更新...', 'none'); const data = yield (0, _1.getData)(user.greasyforkUrl); const version = data.querySelectorAll('.script-show-version span')[1].innerHTML; if ((0, tools_1.getVersionNum)(user.version) < (0, tools_1.getVersionNum)(version)) { GM_openInTab(`${user.greasyforkUrl}-jkforum-%E5%8A%A9%E6%89%8B/code/JKForum%20%E5%8A%A9%E6%89%8B.user.js`); } else { new _1.MessageBox('已是最新版本!'); } msg.remove(); }); } exports.checkUpdate = checkUpdate; /***/ }), /***/ 244: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MessageBox = void 0; /** * 消息通知类:不依赖框架 * @example * 0.先在入口文件中调用静态方法 generate() 方法初始化消息弹出窗口; * 1. new MessageBox('hello') * 2.空初始化时调用 show() 显示消息; * 3.setTime:ms,非数字时为永久消息,需手动调用 update() 刷新消息,remove() 移除消息; * 4.importance:LOG_POP:log+自定义弹窗;LOG_POP_GM:log+自定义弹窗+GM系统提示;POP:自定义弹窗; */ class MessageBox { constructor(text, setTime = 5000, importance = "LOG_POP" /* LOG_POP */) { this._msg = null; // 永久显示标记,和元素地址 this._text = text; this._setTime = setTime; this._importance = importance; this._timer = 0; // 计数器 // 非空初始化,立即执行; if (text !== undefined && text !== null) { this.show(); } } // 静态方法,初始化消息盒子,先调用本方法初始化消息弹出窗口 static generate() { // 添加样式 GM_addStyle(` #messageBox { width: 222px; position: fixed; right: 5%; bottom: 20px; z-index: 999 } #messageBox div { width: 100%; background-color: #64ce83; float: left; padding: 5px 10px; margin-top: 10px; border-radius: 10px; color: #fff; box-shadow: 0px 0px 1px 3px #ffffff } `); this._msgBox = document.createElement('div'); // 创建类型为div的DOM对象 this._msgBox.id = 'messageBox'; document.body.append(this._msgBox); // 消息盒子添加到body } // 显示消息 show(text = this._text, setTime = this._setTime, importance = this._importance) { if (this._msg !== null) { throw new Error('先移除上条消息,才可再次添加!'); } if (text === undefined || text === null) { throw new Error('未输入消息'); } this._text = text; this._setTime = setTime; this._importance = importance; this._msg = document.createElement('div'); this._msg.textContent = text; MessageBox._msgBox.append(this._msg); // 显示消息 switch (importance) { case "LOG_POP" /* LOG_POP */: { console.log(text); break; } case "LOG_POP_GM" /* LOG_POP_GM */: { console.log(text); GM_notification(text); break; } default: { break; } } if (setTime && !isNaN(Number(setTime))) { // 默认5秒删掉消息,可设置时间,none一直显示 setTimeout(() => { this.remove(); }, Number(setTime)); } } update(text) { if (isNaN(Number(this._setTime)) && this._msg) { this._msg.textContent = text; console.log(text); switch (this._importance) { case "LOG_POP" /* LOG_POP */: { break; } case "LOG_POP_GM" /* LOG_POP_GM */: { console.log(text); GM_notification(text); break; } default: { break; } } } else { throw new Error('只有弹窗永久消息支持刷新内容:' + this._setTime); } } // 移除方法,没有元素则等待setTime 5秒再试5次 remove() { if (this._msg) { this._msg.remove(); this._msg = null; // 清除标志位 } else { // 空初始化时,消息异步发送,导致先执行移除而获取不到元素,默认 setTime=5000 // 消息发出后,box 非空,可以移除,不会执行 setTime="none" if (this._timer == 4) { throw new Error('移除的元素不存在:' + this._msg); } this._timer++; setTimeout(() => { this.remove(); }, Number(this._setTime)); } } } exports.MessageBox = MessageBox; /***/ }), /***/ 2: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autofillCaptcha = exports.RETRY = void 0; const commonType_1 = __webpack_require__(321); const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); /** * OCR */ exports.RETRY = 'retry'; function captcha(thread, user) { return __awaiter(this, void 0, void 0, function* () { const tid = (0, tools_1.getTid)(thread.url); const url = `${user.votedUrl}id=topthreads:setstatus&tid=${tid}&handlekey=k_setstatus&infloat=1&freeon=yes&inajax=1`; return new Promise((resolve, reject) => { const image = document.createElement('img'); image.id = 'captcha'; image.src = 'https://www.jkforum.net/captcha/code.php' + '?' + new Date().getMilliseconds(); image.width = 120; image.crossOrigin = 'anonymous'; document.body.append(image); image.onload = function () { return __awaiter(this, void 0, void 0, function* () { const base64Img = (0, tools_1.getBase64Image)(image); if (!base64Img) { new _1.MessageBox('图片转码失败,正在重试...'); return reject(exports.RETRY); } //文件的Base64字符串获取验证码 const code = yield readImage(base64Img, user); if (image.parentNode) { image.parentNode.removeChild(image); } if (typeof code === 'object') { if (code.error_msg === '服务器内部错误') { // 服务器错误自动重试,resolve不受10次重试次数显示 new _1.MessageBox(`服务器内部错误,将在 ${thread.cycle} 分钟后自动重试,多次重试未恢复请联系管理员`, 60000 * Number(thread.cycle), "LOG_POP_GM" /* LOG_POP_GM */); return resolve(code.error_msg); } else { // 令牌错误不重试 new _1.MessageBox('运行错误,请手动重试或联系管理员:' + code.error_msg, 'none', "LOG_POP_GM" /* LOG_POP_GM */); return reject(code); } } const response = yield (0, _1.postData)(url, (0, tools_1.urlSearchParams)({ captcha_input: code }).toString()).catch((e) => { console.log(e); return exports.RETRY; }); if (!response) { new _1.MessageBox(tid + ',无效的帖子ID,请检查帖子状态', 'none', 'LOG_POP_GM'); return reject(response); } const result = (0, tools_1.turnCdata)(response); if (result === exports.RETRY) { new _1.MessageBox(tid + ',验证码发送失败,正在重试...'); return reject(exports.RETRY); } else if (result === '更新完成!若狀態仍沒更新,請嘗試刷新頁面') { new _1.MessageBox(tid + ',更新完成!自動‘現在有空’中,請不要刷新頁面!'); return resolve(result); } else if (result === 'Access denied.') { new _1.MessageBox(tid + ',无此帖子的访问权限,请检查帖子状态', 'none', 'LOG_POP_GM'); return reject(result); } else { new _1.MessageBox(tid + ',验证码错误,正在重试...'); return reject(exports.RETRY); } }); }; image.onerror = function (error) { console.log(error); if (image.parentNode) { image.parentNode.removeChild(image); } new _1.MessageBox(tid + ',验证码图片加载失败,正在重试...'); return reject(exports.RETRY); }; }); }); } function readImage(base64, user) { return __awaiter(this, void 0, void 0, function* () { const body = (0, tools_1.urlSearchParams)({ image: base64, token: user.token }).toString(); const response = yield (0, _1.postData)(user.ocrUrl, body, { responseType: "json" /* JSON */, usermethod: "POST" /* POST */, contentType: "application/x-www-form-urlencoded" /* FORM */, }).catch((e) => { var _a; // 导致提示信息错误 return { error_msg: ((_a = e.response) === null || _a === void 0 ? void 0 : _a.message) ? e.response.message : e.statusText, error_code: 0 }; }); const ocrResults = response; if ('words_result' in ocrResults) { const words = ocrResults.words_result[0].words.replace(/g/gi, '6'); if (words.length < 4) { return String((0, tools_1.rdNum)(0, 10)) + words; } else if (words.length > 4) { return words.slice(1, 5); } else { return words; } } else if ('error_msg' in ocrResults) { return ocrResults; } return String((0, tools_1.rdNum)(1000, 10000)); }); } function autofillCaptcha(t, user, setNextClickTime, saveStatusData, triggerNextClick) { var _a; return __awaiter(this, void 0, void 0, function* () { try { // 在异步请求前设置好时间,防止时间错误 let timeInterval = 60000 * Number(t.cycle); let skip = false; const now = new Date(); if (t.runTime) { const hours = (0, tools_1.hoursUntilTimeRange)(t.runTime.startTime, t.runTime.endTime); if (hours !== 0) { // 不在运行时间内时,随机数增加到120秒(2分钟)内,减少并发启动时造成的错误重试 const overMinutes = now.getMinutes() * 60000 + now.getSeconds() * 1000 - (0, tools_1.rdNum)(0, 120000); timeInterval = hours * 3600000 - overMinutes; skip = true; } } const nextClickTime = now.getTime() + timeInterval; t.nextClickTime = nextClickTime; if (!skip) { saveStatusData(t.url, commonType_1.RunStatus.Running); yield captcha(t, user); t.retry = 0; } else { saveStatusData(t.url, commonType_1.RunStatus.Waiting); } // 调用计数和存入时间 setNextClickTime(t, skip); setTimeout(() => { triggerNextClick(t); }, timeInterval); } catch (e) { if (typeof e === 'string') { if (e === exports.RETRY) { const timeInterval = 1000 + (0, tools_1.rdNum)(0, 5000); const nextClickTime = new Date().getTime() + timeInterval; t.nextClickTime = nextClickTime; t.retry = ((_a = t.retry) !== null && _a !== void 0 ? _a : 0) + 1; // 调用计数 setNextClickTime(t); setTimeout(() => { triggerNextClick(t); }, timeInterval); // 重试频率限制 } else { // 错误则改变状态 saveStatusData(t.url, commonType_1.RunStatus.Error); } } else { saveStatusData(t.url, commonType_1.RunStatus.Error); } } }); } exports.autofillCaptcha = autofillCaptcha; /***/ }), /***/ 87: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.loadOriginImage = void 0; const _1 = __webpack_require__(915); // 加载原图,自动播放 function loadOriginImage() { return __awaiter(this, void 0, void 0, function* () { const tfImg = document.querySelectorAll('.t_f ignore_js_op img'); //获取图片列表,附件也是ignore_js_op if (tfImg) { // 加载原图开关 let count = 0; for (let i = 0; i < tfImg.length; i++) { //遍历图片列表 const img = tfImg[i]; img.setAttribute('onmouseover', ''); // 去掉下载原图提示 const file = img.getAttribute('file'); if (img.src.includes('.thumb.') && file) { // 去掉缩略图 加载部分 img.src = file.split('.thumb.')[0]; console.log('加载原图成功 thumb:', img.src); count++; } else if (img.src.includes('static/image/common/none.gif') && img.getAttribute('file')) { // 懒加载部分 if (file === null || file === void 0 ? void 0 : file.includes('.thumb.')) { img.setAttribute('file', file.split('.thumb.')[0]); // 网站自带forum_viewthread.js attachimgshow(pid, onlyinpost) 从file延迟加载 console.log('加载原图成功 none.gif:', img.getAttribute('file')); count++; } } } if (count) { new _1.MessageBox(`加载原图成功 ${count} 张!`); } } }); } exports.loadOriginImage = loadOriginImage; /***/ }), /***/ 363: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autoPay = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); // 自动支付 function autoPay(user) { var _a; return __awaiter(this, void 0, void 0, function* () { if (document.querySelector('.viewpay')) { const url = user.payUrl; const referer = location.href; const pData = `formhash=${user.formhash}&referer=${(0, tools_1.turnUrl)(referer)}&tid=${(0, tools_1.getTid)(referer)}&handlekey=pay`; const stringOrHtml = yield (0, _1.postDataCdata)(url, pData); if ((0, tools_1.checkHtml)(stringOrHtml)) { // 确认html const info = (_a = stringOrHtml.querySelector('script')) === null || _a === void 0 ? void 0 : _a.innerHTML.split(`', `)[1].slice(1); new _1.MessageBox(info); location.reload(); } else { new _1.MessageBox(stringOrHtml); //其它情况直接输出 } } }); } exports.autoPay = autoPay; /***/ }), /***/ 687: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.addPlayEvent = exports.autoPlay = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); const addPlayEvent = (counter, user) => { const zoomimgs = document.querySelectorAll(`img[zoomfile]`); //获取图片列表 if (zoomimgs) { // 自动播放 for (let i = 0; i < zoomimgs.length; i++) { //遍历图片列表 zoomimgs[i].addEventListener('click', () => { autoPlay(counter, user); }, { once: true, }); } } const onclickzoomimgs = document.querySelectorAll(`img[onclick="zoom(this, this.src, 0, 0, 0)"]`); //获取图片列表 if (onclickzoomimgs) { // 自动播放 for (let i = 0; i < onclickzoomimgs.length; i++) { //遍历图片列表 onclickzoomimgs[i].addEventListener('click', () => { autoPlay(counter, user); }, { once: true, }); } } }; exports.addPlayEvent = addPlayEvent; // 自动播放图片 function autoPlay(counter, user) { return __awaiter(this, void 0, void 0, function* () { const append_parent = document.querySelector('#append_parent'); // 监听子节点 if (counter.playBtn || !append_parent) { // 防重复点击、添加 return; } counter.playBtn = 1; // 已添加标志 const observer = new MutationObserver(() => { // 监听元素子节点变化,然后添加节点 const imgzoom_y = document.querySelector('#imgzoom .y'); if (imgzoom_y) { // 按钮也是延迟加载,监听是否有 .y observer.disconnect(); // 断开监听 addAutoPlay(counter, user); // 添加按钮 } }); // 建立监听器 observer.observe(append_parent, { // 开始监听 append_parent childList: true, }); }); } exports.autoPlay = autoPlay; // 添加播放图片按钮、事件 function addAutoPlay(counter, user) { var _a; const append_parent = document.querySelector('#append_parent'); if (!append_parent) return; const imgzoom = append_parent.querySelector('#imgzoom'); const imgzoom_cover = append_parent.querySelector('#imgzoom_cover'); if (!imgzoom) return; const y = imgzoom.querySelector('.y'); const a = document.createElement('a'); a.title = '自动播放/停止播放'; a.innerHTML = '自动播放/停止播放'; a.href = 'javascript:void(0);'; a.addEventListener('click', play); // 添加监听播放事件 a.style.cssText = `background: url(../../template/yibai_city1/style/common/arw_l.gif) rgb(241, 196, 15) center no-repeat;transform: rotate(180deg);width: 60px;height: 18px;overflow: hidden;`; if (!y) return; y.prepend(a); // 添加按钮 // 遮挡暂停 window.onblur = function () { counter.playFlag = 0; }; // 点击背景层暂停 imgzoom_cover === null || imgzoom_cover === void 0 ? void 0 : imgzoom_cover.addEventListener('click', () => { counter.playFlag = 0; }); // 关闭按钮暂停 (_a = y.querySelector('.imgclose')) === null || _a === void 0 ? void 0 : _a.addEventListener('click', () => { counter.playFlag = 0; }); function play() { return __awaiter(this, void 0, void 0, function* () { if (!counter.playFlag && !counter.playObserver) { // 再次点击暂停,只运行一个监听器 counter.playFlag = 1; const imgzoom_waiting = append_parent === null || append_parent === void 0 ? void 0 : append_parent.querySelector('#imgzoom_waiting'); const zimg_next = imgzoom === null || imgzoom === void 0 ? void 0 : imgzoom.querySelector('.zimg_next'); // 是否有下一张 if (!zimg_next || !imgzoom_waiting) { counter.playFlag = 0; new _1.MessageBox('只有一张图!'); return; } counter.playObserver = new MutationObserver(() => __awaiter(this, void 0, void 0, function* () { var _a; const display = imgzoom_waiting.style.display; if (display == 'none') { yield (0, tools_1.waitFor)(user.autoPlayDiff); // 延迟,然后判断是否停止 if (counter.playFlag == 0 && counter.playObserver) { counter.playObserver.disconnect(); counter.playObserver = undefined; // disconnect()并没有清空监听器 return; } (_a = imgzoom === null || imgzoom === void 0 ? void 0 : imgzoom.querySelector('.zimg_next')) === null || _a === void 0 ? void 0 : _a.click(); // 刷新NodeList } })); counter.playObserver.observe(imgzoom_waiting, { attributes: true, }); // 开始点击下一张 yield (0, tools_1.waitFor)(user.autoPlayDiff); zimg_next.click(); } else { counter.playFlag = 0; } }); } } /***/ }), /***/ 960: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.reCaptcha = void 0; const reCaptcha = () => { Window.prototype.onloadCaptchaCallback = function () { const onCaptchaChange = (token) => { GM_setValue('CaptchaValue', token); }; grecaptcha.render('reCaptcha', { sitekey: '6LfxHOIUAAAAAJ-E2oORT8_zgG3Ia0QM1sg9Pe2s', callback: onCaptchaChange, hl: 'zh-TW', }); }; const script = document.createElement('script'); script.src = 'https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit'; script.async = true; script.defer = true; document.head.append(script); }; exports.reCaptcha = reCaptcha; /***/ }), /***/ 872: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.replyOrThk = exports.addPageBatch = exports.addOnePage = void 0; const lib_1 = __webpack_require__(915); const tools_1 = __webpack_require__(633); function chooceReply(user, value) { if (value) { let replyLen = 0; // 统计长度,用于在 user.userReplyMessage 中定位下标 value.split(';').forEach((element) => { // 中文分号分隔字符串 if (element) { user.userReplyMessage.push(element); // 存储自定义回帖内容 replyLen++; } }); GM_setValue(user.username, user); new lib_1.MessageBox('已使用自定义回复'); return replyLen; } else { if (user.fastReply.length && confirm('确认使用快速回复?否则使用历史回复')) { GM_setValue(user.username, user); new lib_1.MessageBox('已使用快速回复'); return user.fastReply.length; } else if (user.userReplyMessage.length && confirm('确认使用历史自定义回复?')) { GM_setValue(user.username, user); new lib_1.MessageBox('已使用历史自定义回复'); return user.userReplyMessage.length; } else { alert('没有获取到任何回复,请确认有浏览可快速回贴的版块的权限!否则需要手动输入回帖内容!'); return -1; } } } function addOnePage(user, inputValue) { const currentHref = location.href; // 获取当前页地址 const reg = /(type-)|(forum-)/; // const reg = /(forum-)/; if (!reg.test(currentHref)) { new lib_1.MessageBox('不支持的页面,仅支持在地址为 forum-x-x 和 type-x-x 的板块页面使用'); return; } const fid = currentHref.split('-')[1]; // 获取板块fid const page = currentHref.split('-')[2].split('.')[0]; // 获取页码 if (currentHref.includes('type-')) { addPageBatch(user, `${fid}-${page}-${page}`, inputValue, 'type'); new lib_1.MessageBox('type-x-x 地址板块仅支持添加第一页'); } else { addPageBatch(user, `${fid}-${page}-${page}`, inputValue); } } exports.addOnePage = addOnePage; function addPageBatch(user, pageCode, inputValue, type = null) { return __awaiter(this, void 0, void 0, function* () { const reg = new RegExp(/^\d+-\d+-\d+$/); let forumPage = ''; if (reg.test(pageCode)) { // 如果输入了正确地址单页 forumPage = pageCode; } else { new lib_1.MessageBox('未获取到页码'); return; } if (reg.test(forumPage)) { // 如果输入了正确地址则进行批量处理 user.page = forumPage; GM_setValue(user.username, user); let pageFrom = parseInt(forumPage.split('-')[1]); // 获取起点页码 const pageEnd = parseInt(forumPage.split('-')[2]); // 获取终点页码 const fid = forumPage.split('-')[0]; // 获取版块代码 if (pageFrom > pageEnd) { new lib_1.MessageBox('页码错误:起点页不能大于终点页!'); return; } const msId = new lib_1.MessageBox('正在添加:' + forumPage, 'none'); const replyLen = chooceReply(user, inputValue); //如果输入了值则使用用户值,如果没有则使用默认值;没有默认值则返回错误 if (replyLen <= 0) { new lib_1.MessageBox('获取回帖内容失败!'); msId.remove(); return '获取回帖内容失败!'; } while (pageFrom <= pageEnd) { let currentHref = ''; if (type != null) { currentHref = 'https://www.jkforum.net/' + type + '-' + fid + '-' + pageFrom + '.html'; //生成帖子列表地址 } else { currentHref = 'https://www.jkforum.net/forum-' + fid + '-' + pageFrom + '.html'; //生成帖子列表地址 } new lib_1.MessageBox('当前地址:' + currentHref + ',页码:' + pageFrom); let data = yield (0, lib_1.getData)(currentHref); // 判断是否需要切换到列表模式。 while (data.querySelector(`[class="chked"]`)) { yield (0, lib_1.getData)('https://www.jkforum.net/forum.php?mod=forumdisplay&fid=' + fid + '&forumdefstyle=yes'); // 切换到列表模式,同步请求。 new lib_1.MessageBox('已切换到列表模式'); data = yield (0, lib_1.getData)(currentHref); } // 添加回帖任务 setThreadsTask(user, data, fid, replyLen); // 设置任务列表 pageFrom++; } msId.remove(); } else { new lib_1.MessageBox('请输入回帖列表页码,格式:版块代码-起点页-终点页 ;例如:640-1-2 ;版块代码见版块URL中间数字:forum-640-1', 10000); } }); } exports.addPageBatch = addPageBatch; // 添加任务列表 function setThreadsTask(user, htmlData, fid, replyLen) { //帖子类名 40个a标签数组 const hrefs = htmlData.querySelectorAll('.s'); // 获取作者昵称和 UID const cites = htmlData.querySelectorAll('cite a'); // 以 fid 创建对象,如果fid存在则写入fid的数组的fidthreads属性的数组内;否则创建新的 fidthreads,自我调用 const fidthreads = { fid: fid, fidTime: 0, fidRepIndex: 0, fidThkIndex: 0, fidthreads: [], }; let fidTime = 0; // 统计总时间 function newFid() { if (user.replyThreads.length) { for (let i = 0; i < user.replyThreads.length; i++) { if (user.replyThreads[i].fid == fid) { addThrInfo(user.replyThreads[i]); user.replyThreads[i].fidTime += fidTime; // 累加时间 GM_setValue(user.username, user); return; // 匹配到则退出循环 // 传入对应对象 } } // 如果没匹配到同样增加 user.replyThreads.push(fidthreads); newFid(); } else { user.replyThreads.push(fidthreads); // 初始化threads newFid(); } } function addThrInfo(elem) { // 回帖变量随即范围限制 let start = 0; if (replyLen == user.fastReply.length || replyLen == user.userReplyMessage.length) { // 判断起始位置 } else { start = user.userReplyMessage.length - replyLen; // 用户数组长-增加的数据长=起始位置; replyLen = user.userReplyMessage.length; // 结束位置 } const msId = new lib_1.MessageBox('...', 'none'); let count = 0; // 贴数统计 // 遍历去除回帖用户 for (let i = 0; i < cites.length; i += 2) { // 加入数组 const touser = cites[i].innerHTML; const touseruid = cites[i].href.split('uid=')[1]; // href="home.php?mod=space&uid=1123445" const href = hrefs[i / 2].href; const tid = (0, tools_1.getTid)(href); let noSkip = true; // 跳过标识 for (let index = 0; index < elem.fidthreads.length; index++) { // 确保帖子的唯一性 const element = elem.fidthreads[index]; if (element.tid == tid) { noSkip = false; msId.update(`${fid}:任务列表:${index},thread-${tid}-1-1 :已在任务列表,已跳过此贴!`); break; } } if (noSkip) { const replyIndex = (0, tools_1.rdNum)(start, replyLen - 1); // 从返回的输入长度获取随机值 const randomTime = (0, tools_1.rdNum)(user.interval, user.differ + user.interval); const thread = { tid: tid, touseruid: touseruid, touser: touser, replyIndex: replyIndex, replyLen: replyLen, randomTime: randomTime, // 回帖时间随机数 }; fidTime += randomTime; elem.fidthreads.push(thread); // 给对象数组添加 count++; } } GM_setValue(user.username, user); msId.remove(); new lib_1.MessageBox(`${fid}:任务列表成功添加 ${count} 贴!`, 10000); } newFid(); // 启动 } // 回帖\感谢函数 function replyOrThk(counter, user, type = "reply" /* REPLY */, setCounter) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { let fidIndex = 0; // 当前回帖版块序号 let thkFidIndex = 0; // 当前感谢版块序号 // 初始化永久消息 const mesIdRep = new lib_1.MessageBox(); const mesIdRepContent = new lib_1.MessageBox(); const mesIdThk = new lib_1.MessageBox(); if (!user.replyThreads.length) { new lib_1.MessageBox('任务列表为空,请先添加任务!'); return; } else if (type == "reply" /* REPLY */) { setCounter(Object.assign(Object.assign({}, counter), { replyBtn: 1 })); mesIdRep.show('开始回帖...', 'none'); mesIdRepContent.show('...', 'none'); } else { setCounter(Object.assign(Object.assign({}, counter), { thkBtn: 1 })); // 防止重复点击 mesIdThk.show('开始感谢...', 'none'); } while ((type == "reply" /* REPLY */ && fidIndex < user.replyThreads.length) || (type == "thk" /* THANK */ && thkFidIndex < user.replyThreads.length)) { // 分别处理感谢和回帖 const elementForum = user.replyThreads[type == "reply" /* REPLY */ ? fidIndex : thkFidIndex]; const fid = elementForum.fid; let fidRepIndex = elementForum.fidRepIndex; // 上次回复位置 let fidThkIndex = elementForum.fidThkIndex; // 上次感谢位置 while ((elementForum.fidthreads.length > fidRepIndex && type == "reply" /* REPLY */) || (elementForum.fidthreads.length > fidThkIndex && type == "thk" /* THANK */)) { // 分别处理感谢和回帖 switch (type) { case "reply" /* REPLY */: { mesIdRep.update(fid + '-版块,当前位置:' + fidRepIndex + ' ,总数:' + elementForum.fidthreads.length + ',预计总耗时:' + (elementForum.fidTime / 1000 / 60).toFixed(1) + ' 分钟时间'); // 显示永久消息 const elementThr = elementForum.fidthreads[fidRepIndex]; const tid = elementThr.tid; const replyIndex = elementThr.replyIndex; const replyLen = elementThr.replyLen; const randomTime = elementThr.randomTime; // 回帖链接 const replyUrlParamsData = (0, tools_1.urlSearchParams)({ fid: fid, tid: tid, extra: 'page%3D1', replysubmit: 'yes', infloat: 'yes', inflohandlekeyat: 'fastpost', inajax: 1, }); // 拼接回帖报文 const date = new Date(); const posttime = (date.getTime() / 1000).toFixed(0); // 生产时间戳 const replyParamsObj = { message: '', posttime: posttime, formhash: user.formhash, usesig: 1, subject: '', }; // 回帖数据对象 if (replyLen == user.fastReply.length) { replyParamsObj.message = user.fastReply[replyIndex]; } else if (replyLen <= user.userReplyMessage.length + 1) { replyParamsObj.message = user.userReplyMessage[replyIndex]; } else { new lib_1.MessageBox('回帖数据错误,请重置回帖数据', 'none'); return; } const replyParamsData = (0, tools_1.urlSearchParams)(replyParamsObj); // 发送数据 const data = yield (0, lib_1.postDataCdata)(user.replyUrl + replyUrlParamsData.toString(), replyParamsData.toString()); if ((0, tools_1.checkHtml)(data)) { // 确认html const info = (_a = data.querySelector('script')) === null || _a === void 0 ? void 0 : _a.innerHTML.split(`, `)[1]; if (!info) { throw new Error("querySelector('script') 错误:" + info); } new lib_1.MessageBox(info.split(',')[0].slice(1) + ',' + info.split(',')[1] + '!'); // 返回html成功消息 } else { new lib_1.MessageBox(data, 'none'); //其它情况直接输出 } mesIdRepContent.update('序号:' + fidRepIndex + ',随机号:' + replyIndex + ',用时:' + randomTime + ',帖子:' + tid + ',内容:' + replyParamsData.get('message')); //测试使用 elementForum.fidRepIndex = ++fidRepIndex; GM_setValue(user.username, user); yield (0, tools_1.waitFor)(randomTime); // 等待指定时间 break; } case "thk" /* THANK */: { const elementThr = elementForum.fidthreads[fidThkIndex]; const thkParamsData = (0, tools_1.urlSearchParams)({ formhash: user.formhash, tid: elementThr.tid, touser: elementThr.touser, touseruid: elementThr.touseruid, handlekey: 'k_thankauthor', addsubmit: 'true', }); const data = yield (0, lib_1.postDataCdata)(user.thkUrl, thkParamsData.toString()); //post感谢数据 if ((0, tools_1.checkHtml)(data)) { const info = (_b = data.querySelector('.alert_info')) === null || _b === void 0 ? void 0 : _b.innerHTML.split('<')[0].trim(); //去除html,返回字符串 new lib_1.MessageBox(info, 1000); } else { new lib_1.MessageBox(data, 1000); //其它情况直接输出 } mesIdThk.update(fid + '-版块,当前位置:' + fidThkIndex + ' ,总数:' + elementForum.fidthreads.length + ',帖子ID:' + thkParamsData.get('tid')); // 刷新永久消息 elementForum.fidThkIndex = ++fidThkIndex; GM_setValue(user.username, user); yield (0, tools_1.waitFor)(user.thkDiffer); // 等待指定时间 break; } default: console.log('参数不在范围'); break; } } if (type == "thk" /* THANK */) { thkFidIndex++; // 翻页 } else if (type == "reply" /* REPLY */) { fidIndex++; // 翻页 } GM_setValue(user.username, user); } if (type == "thk" /* THANK */) { mesIdThk.remove(); // 移除永久消息 new lib_1.MessageBox('全部感谢完成!', 10000, "LOG_POP_GM" /* LOG_POP_GM */); setCounter(Object.assign(Object.assign({}, counter), { thkBtn: 0 })); } else if (type == "reply" /* REPLY */) { mesIdRep.remove(); // 移除永久消息 mesIdRepContent.remove(); new lib_1.MessageBox('全部回帖完成!', 10000, "LOG_POP_GM" /* LOG_POP_GM */); setCounter(Object.assign(Object.assign({}, counter), { replyBtn: 0 })); } }); } exports.replyOrThk = replyOrThk; /***/ }), /***/ 821: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.resetReplyData = void 0; const message_1 = __webpack_require__(244); const resetReplyData = (user) => { user.replyThreads = []; user.fastReply = []; user.userReplyMessage = []; GM_setValue(user.username, user); new message_1.MessageBox('重置回帖数据成功'); }; exports.resetReplyData = resetReplyData; /***/ }), /***/ 943: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.timeControl = exports.sign = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); // 定时签到 function timeControl(counter, setCounter, user) { const signtime = user.signtime; // 设定签到时间 // 初始化永久消息通知 const msIdSig = new _1.MessageBox(); const msIdTime = new _1.MessageBox(); let timer = 0; function control() { return __awaiter(this, void 0, void 0, function* () { const now = new tools_1.NowTime(); // 获取当前时间,到秒 if (now.seconds == signtime) { clearInterval(timer); // timer=1 未知原因 setCounter(Object.assign(Object.assign({}, counter), { signBtn: 0 })); // 移除永久消息通知 msIdSig.remove(); msIdTime.update('执行中....'); for (let i = 0; i < user.signNum; i++) { //重试次数 sign(user); msIdTime.update('执行第' + (i + 1) + '次'); yield (0, tools_1.waitFor)(user.interTime); //重试间隔 } msIdTime.remove(); } else { msIdTime.update('时间没有到:' + signtime + ',目前时间:' + now.seconds); } }); } if (!counter.signBtn) { // 防重复点击 msIdSig.show('定时签到中,请勿退出...', 'none'); msIdTime.show('...', 'none'); // 占位消息,给刷新用 timer = window.setInterval(control, 500); setCounter(Object.assign(Object.assign({}, counter), { signBtn: timer })); // 运行自动签到} } } exports.timeControl = timeControl; function sign(user) { var _a; return __awaiter(this, void 0, void 0, function* () { const signParamsData = (0, tools_1.urlSearchParams)({ formhash: user.formhash, qdxq: user.mood, qdmode: 1, todaysay: user.todaysay, fastreply: 1, }).toString(); const stringOrHtml = yield (0, _1.postDataCdata)(user.signUrl, signParamsData); // 直接post签到数据 if ((0, tools_1.checkHtml)(stringOrHtml)) { // 确认html const info = (_a = stringOrHtml.querySelector('.c')) === null || _a === void 0 ? void 0 : _a.innerHTML.split('<')[0].trim(); // 解析html,返回字符串 new _1.MessageBox(info); } else { new _1.MessageBox(stringOrHtml); //其它情况直接输出 } }); } exports.sign = sign; /***/ }), /***/ 226: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autoThk = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); // 自动感谢 function autoThk(user) { var _a; return __awaiter(this, void 0, void 0, function* () { const forms = document.forms; if (!(forms === null || forms === void 0 ? void 0 : forms.thankform)) { return; } const thankform = forms.thankform; const thkParamsData = (0, tools_1.urlSearchParams)({ formhash: user.formhash, tid: thankform.tid.value, touser: thankform.touser.value, touseruid: thankform.touseruid.value, handlekey: 'k_thankauthor', addsubmit: 'true', }).toString(); const xmlData = yield (0, _1.postDataCdata)(user.thkUrl, thkParamsData); //post感谢数据 if (xmlData && (0, tools_1.checkHtml)(xmlData)) { const info = (_a = xmlData.querySelector('.alert_info')) === null || _a === void 0 ? void 0 : _a.innerHTML.split('<')[0].trim(); //去除html,返回字符串 new _1.MessageBox(info); } else { new _1.MessageBox(xmlData); //其它情况直接输出 } if (document.querySelectorAll('#k_thankauthor').length == 2) { //感谢可见 location.reload(); } }); } exports.autoThk = autoThk; /***/ }), /***/ 506: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getUserName = exports.getUserFromName = exports.getFormhash = exports.creatUser = exports.User = void 0; const commonType_1 = __webpack_require__(321); const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); class User { constructor(username, formhash) { this.version = GM_info.script.version; this.today = ''; // 签到日期 this.signtime = '23:59:59'; // 定时签到时间 this.signNum = 10; // 定时签到重试次数 this.interTime = 200; // 定时签到重试间隔时间ms this.todaysay = '簽到'; // 签到输入内容 this.mood = commonType_1.Mood.fendou; // 签到心情 this.autoPlayDiff = 2000; // 自动播放图片间隔时间ms this.autoPaySw = true; // 自动支付开关 this.autoThkSw = true; // 自动感谢开关 this.autoRePicSw = true; // 自动加载原图开关 this.autoDailyTask = false; // 定时每日任务开关 this.differ = 10000; // 回帖随机间隔时间ms this.interval = 20000; // 回帖基础间隔时间ms this.thkDiffer = 1000; // 批量感谢间隔时间ms this.limit = 2; // 并发下载图片数量限制 this.page = ''; // 批量回帖页码 this.token = ''; // OCR token this.freeTime = 3300000; // 现在有空间隔 this.freeTid = ''; // 自动现在有空 帖子ID,一个账号一个贴子 this.freeData = []; this.votedMessage = '+1'; // 投票输入内容 this.ocrUrl = 'https://jkf.iknow.fun/api/ocr/numbers'; this.votedUrl = 'https://www.jkforum.net/plugin.php?'; this.applyVotedUrl = 'https://www.jkforum.net/home.php?mod=task&do=apply&id=59'; this.taskDoneUrl = 'https://www.jkforum.net/home.php?mod=task&do=draw&id=59'; this.signUrl = 'https://www.jkforum.net/plugin/?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1'; this.thkUrl = 'https://www.jkforum.net/plugin/?id=thankauthor:thank&inajax=1'; this.payUrl = 'https://www.jkforum.net/forum.php?mod=misc&action=pay&paysubmit=yes&infloat=yes&inajax=1'; this.fastReplyUrl = 'https://www.jkforum.net/thread-8364615-1-1.html'; this.replyUrl = 'https://www.jkforum.net/forum.php?mod=post&action=reply&'; this.greasyforkUrl = 'http://greasyfork.icu/zh-CN/scripts/427246'; this.userReplyMessage = []; // 用户保存的回复,历史回帖内容 this.fastReply = []; // 保存的快速回复,快速回帖内容 this.replyThreads = []; // 回帖任务数据 this.username = username; this.formhash = formhash; } } exports.User = User; const getUserName = () => { var _a; return (_a = document.querySelector('.avatar_info a')) === null || _a === void 0 ? void 0 : _a.innerHTML; }; exports.getUserName = getUserName; const getUserFromName = () => { const userName = getUserName(); return userName ? GM_getValue(userName) : null; }; exports.getUserFromName = getUserFromName; const getFormhash = () => { var _a; return new URLSearchParams((_a = document.querySelector('.listmenu li a')) === null || _a === void 0 ? void 0 : _a.href).get('formhash'); }; exports.getFormhash = getFormhash; const creatUser = (username, formhash) => __awaiter(void 0, void 0, void 0, function* () { let user = GM_getValue(username); const userMod = new User(username, formhash); if (!user) { // 空则写入,或版本变动写入 user = userMod; user = yield (0, _1.setFastReply)(user); // 设置快速回复 GM_setValue(username, user); new _1.MessageBox('添加用户成功!'); } else if (user.version !== GM_info.script.version) { const compa = (0, tools_1.isSameObjKey)(userMod, user); // 比较key // 更新所有 Url 参数 user = (0, tools_1.updateUserUrl)(user, userMod); // new对User赋值 // key相同 只改变版本 user.version = GM_info.script.version; // 记录新版本 if (!compa) { // key不同 user = (0, tools_1.mergeObjValue)(userMod, user); // new对User赋值 new _1.MessageBox('数据更新成功!'); } user = yield (0, _1.setFastReply)(user); // 设置快速回复 GM_setValue(username, user); new _1.MessageBox('版本更新成功!请阅读使用说明。'); } if (user.formhash !== formhash) { // formhash 变动存储 user.formhash = formhash; GM_setValue(username, user); } return user; }); exports.creatUser = creatUser; /***/ }), /***/ 608: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.autoVoted = void 0; const tools_1 = __webpack_require__(633); const _1 = __webpack_require__(915); function autoVoted(user) { var _a; return __awaiter(this, void 0, void 0, function* () { yield (0, _1.getData)(user.applyVotedUrl); // 申请任务 const msId = new _1.MessageBox('申请投票任务执行成功!正在投票请勿退出页面...', 'none'); // 投票请求链接 const votedUrlParams = (0, tools_1.urlSearchParams)({ id: 'voted', }).toString(); const htmlData = yield (0, _1.getData)(user.votedUrl + votedUrlParams); const vidUrl = (_a = htmlData.querySelector('.voted a')) === null || _a === void 0 ? void 0 : _a.href; // 找到链接 const vid = vidUrl.split('&')[2].split('=')[1]; // 纯数字// 分解链接 const hrefHtmlData = yield (0, _1.getData)(vidUrl); const aidUrl = hrefHtmlData.querySelector('.hp_s_c a').href; // 找到链接 const aid = aidUrl.split('&')[2].split('=')[1]; // 纯数字// 分解链接 // 投票请求链接数据 const votedParams = (0, tools_1.urlSearchParams)({ id: 'voted', ac: 'dian', aid: aid, vid: vid, qr: '', inajax: 1, }).toString(); // Post 数据 const votedParamsData = (0, tools_1.urlSearchParams)({ formhash: user.formhash, inajax: 1, handlekey: 'dian', sid: 0, message: user.votedMessage, }).toString(); // 投票 const votedMessage = yield (0, _1.postDataCdata)(user.votedUrl + votedParams, votedParamsData); if ((0, tools_1.checkHtml)(votedMessage)) { let info = ''; const alertInfo = votedMessage.querySelector('.alert_info'); const script = votedMessage.querySelector('script'); if (alertInfo) { info = alertInfo.innerHTML; // 解析html,返回字符串,失败警告 new _1.MessageBox(info); } else if (script) { info = script.innerHTML.split(`', `)[1].slice(1); // 解析html,获取字符串,成功消息 new _1.MessageBox(info); yield (0, _1.getData)(user.taskDoneUrl); // 执行领奖励 new _1.MessageBox('领取投票奖励成功!'); } } else { new _1.MessageBox(votedMessage); //其它情况直接输出 } msId.remove(); GM_setValue(user.username, user); //保存当天日// today 初始化 }); } exports.autoVoted = autoVoted; /***/ }), /***/ 67: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setTimeoutWorker = exports.setIntervalWorker = void 0; function setIntervalWorker(callback, interval) { const workerBlob = new Blob([`setInterval(() => { postMessage('') }, ${interval})`]); const workerURL = URL.createObjectURL(workerBlob); const worker = new Worker(workerURL); worker.onmessage = () => { callback(); }; return worker; } exports.setIntervalWorker = setIntervalWorker; function setTimeoutWorker(callback, timeout) { const workerBlob = new Blob([`setTimeout(() => { postMessage('') }, ${timeout})`]); const workerURL = URL.createObjectURL(workerBlob); const worker = new Worker(workerURL); worker.onmessage = () => { callback(); worker.terminate(); }; return worker; } exports.setTimeoutWorker = setTimeoutWorker; /***/ }), /***/ 287: /***/ ((__unused_webpack_module, exports) => { "use strict"; /* eslint-disable @typescript-eslint/no-explicit-any */ /* NodeJS Promise并发控制 https://xin-tan.com/2020-09-13-bing-fa-kong-zhi/ */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ConcurrencyPromisePool = void 0; class ConcurrencyPromisePool { constructor(limit) { this.limit = limit; this.runningNum = 0; this.queue = []; this.results = []; } all(promises = []) { return new Promise((resolve, reject) => { for (const promise of promises) { // 发送所有 promise this._run(promise, resolve, reject); } }); } _run(promise, resolve, reject) { // 超出限制的 promise 入队 if (this.runningNum >= this.limit) { // console.log(">>> 达到上限,入队:", promise); this.queue.push(promise); return; } // 正在运行的 promise ++this.runningNum; promise() .then((res) => { this.results.push(res); --this.runningNum; // 运行结束条件:队列长度 && 正在运行的数量 if (this.queue.length === 0 && this.runningNum === 0) { // promise返回结果, 然后递归结束; const results = [...this.results]; // 清空结果,方便重复使用 this.results = []; return resolve(results); } // 队列还有则,出队,然后递归调用 if (this.queue.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this._run(this.queue.shift(), resolve, reject); } }) .catch(reject); } } exports.ConcurrencyPromisePool = ConcurrencyPromisePool; /***/ }), /***/ 19: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tailwindStyles = __webpack_require__(600); // 导出的是 GM_addStyle 的值 // delete css conflicts exports["default"] = GM_addStyle(tailwindStyles .replace(/\nimg,\nvideo {\n {2}max-width: 100%;\n {2}height: auto;\n}\n/, '') .replace(/\*,\n::before,\n::after \{\n {2}box-sizing: border-box;\n {2}\/\* 1 \*\/\n {2}border-width: 0;\n {2}\/\* 2 \*\/\n {2}border-style: solid;\n {2}\/\* 2 \*\/\n {2}border-color: #e5e7eb;\n {2}\/\* 2 \*\/\n}/, '') .replace(/-webkit-appearance: button;\n {2}\/\* 1 \*\/\n {2}background-color: transparent;\n {2}\/\* 2 \*\/\n {2}background-image: none;\n {2}\/\* 2 \*\//, '') .replace(/display: block;\n {2}\/\* 1 \*\//, '') .replace(/padding-top: 0.5rem;\n {2}padding-right: 0.75rem;\n {2}padding-bottom: 0.5rem;\n {2}padding-left: 0.75rem;/, '') .replace(/font-size: inherit;\n {2}font-weight: inherit;/, '')); /***/ }), /***/ 633: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.waitFor = exports.urlSearchParams = exports.updateUserUrl = exports.turnUrl = exports.turnCdata = exports.replaceHtml = exports.rdNum = exports.preciseSetTimeout = exports.preciseSetInterval = exports.mergeObjValue = exports.isSameObjKey = exports.hoursUntilTimeRange = exports.getVersionNum = exports.getUuiD = exports.getTid = exports.getBase64Image = exports.checkHtml = exports.NowTime = void 0; const lib_1 = __webpack_require__(915); // POST返回 xml数据类型转换成 字符串或html 模块 function turnCdata(xmlRepo) { var _a; const data = (_a = xmlRepo.querySelector('root')) === null || _a === void 0 ? void 0 : _a.textContent; if (!data) return ''; // 如果判断去掉html是否还有文字,否则返回html if (replaceHtml(data)) { return replaceHtml(data); // 去掉html内容,返回文字 } else { const domParser = new DOMParser(); const htmlData = domParser.parseFromString(data, 'text/html'); return htmlData; } } exports.turnCdata = turnCdata; // URL 参数添加器 function urlSearchParams(object) { const searchParamsData = new URLSearchParams(); for (const key in object) { searchParamsData.append(key, String(object[key])); } return searchParamsData; } exports.urlSearchParams = urlSearchParams; // 编码统一资源定位符模块 function turnUrl(data, type) { if (type) { return decodeURI(data); } else { return encodeURI(data); } } exports.turnUrl = turnUrl; // 判断html和字符串是不是html function checkHtml(htmlStr) { if (htmlStr instanceof Document) { return true; } else { const reg = /<[^>]+>/g; return reg.test(htmlStr); } } exports.checkHtml = checkHtml; // 过滤html标签、前后空格、特殊符号 function replaceHtml(txt) { const reg3 = /[\r|\n|\b|\f|\t|\v]+/g; //去掉特殊符号 const reg = /<.+>/g; //去掉所有<>内内容 // 先reg3,\n特殊符号会影响reg的匹配 return txt.replace(reg3, '').replace(reg, '').trim(); } exports.replaceHtml = replaceHtml; // promise 等待模块 const waitFor = (ms) => new Promise((r) => setTimeout(r, ms)); exports.waitFor = waitFor; // n, m 范围随机整数生成 function rdNum(n, m) { const c = m - n + 1; return Math.floor(Math.random() * c + n); } exports.rdNum = rdNum; class NowTime { constructor() { const date = new Date(); this.day = date.toLocaleDateString(); this.seconds = date.toTimeString().split(' ')[0]; this.date = date; } } exports.NowTime = NowTime; // 比较键 function isSameObjKey(source, target) { if (Object.keys(target).length === Object.keys(source).length) { // 用户数据匹配 for (const key of Object.keys(source)) { // https://stackoverflow.com/questions/39282873/object-hasownproperty-yields-the-eslint-no-prototype-builtins-error-how-to if (!Object.prototype.hasOwnProperty.call(target, key)) { return false; } } return true; } else { return false; } } exports.isSameObjKey = isSameObjKey; // 赋值对象的值 function mergeObjValue(target, source) { Object.keys(source).forEach((key) => { if (source[key] && Object.prototype.hasOwnProperty.call(target, key)) { target[key] = source[key]; } }); return target; } exports.mergeObjValue = mergeObjValue; // 更新User对象的URL值,自动有空间隔时间 function updateUserUrl(target, source) { Object.keys(source).forEach((key) => { if (key.includes('Url') || key === 'freeTime') { target[key] = source[key]; } }); return target; } exports.updateUserUrl = updateUserUrl; /** * 生成不重复的ID * @param { Number } randomLength */ function getUuiD(randomLength) { return Number(Math.random().toString().substr(2, randomLength) + Date.now()).toString(36); } exports.getUuiD = getUuiD; const getVersionNum = (ver) => { return Number(ver.replace(/\./g, '')); }; exports.getVersionNum = getVersionNum; const getTid = (url) => { let tid = url.split('-')[1]; if (!tid) { tid = new URLSearchParams(url).get('tid'); // 用于获取分类贴链接下的 tid if (!tid) { new lib_1.MessageBox('没有找到Tid: ' + url); throw new Error('没有找到Tid: ' + url); } } return tid; }; exports.getTid = getTid; const preciseSetInterval = (handler, delay, timeout = 0) => { let baseTime = Date.now(); const callHandler = () => { if (Math.abs(Date.now() - baseTime) <= delay + timeout) { baseTime = Date.now(); handler(); } }; return window.setInterval(callHandler, delay); }; exports.preciseSetInterval = preciseSetInterval; const preciseSetTimeout = (handler, delay, timeout = 0) => { let baseTime = Date.now(); const callHandler = () => { if (Math.abs(Date.now() - baseTime) <= delay + timeout) { baseTime = Date.now(); handler(); } }; return window.setTimeout(callHandler, delay); }; exports.preciseSetTimeout = preciseSetTimeout; function hoursUntilTimeRange(startHour, endHour) { const date = new Date(); const currentHour = date.getHours(); if (startHour <= endHour) { // 范围在同一天的情况 if (currentHour >= startHour && currentHour <= endHour) { return 0; } else if (currentHour < startHour) { return startHour - currentHour; } else { return 24 - currentHour + startHour; } } else { // 范围跨越两天的情况 if (currentHour >= startHour || currentHour <= endHour) { return 0; } else { return startHour - currentHour; } } } exports.hoursUntilTimeRange = hoursUntilTimeRange; /** * 图像转Base64 */ function getBase64Image(img) { const canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; const ctx = canvas.getContext('2d'); if (!ctx) { return; } ctx.drawImage(img, 0, 0, img.width, img.height); const imgd = ctx.getImageData(0, 0, img.width, img.height); // const threshold = 250; const imgData = imgd.data; const len = imgData.length - 1; for (let i = 0; i <= len; i += 4) { const R = imgData[i]; const G = imgData[i + 1]; const B = imgData[i + 2]; // const Alpha = imgData[i + 3]; const avg = (R + G + B) / 3; // if (avg > threshold) { // imgData[i] = 255; // imgData[i + 1] = 255; // imgData[i + 2] = 255; // } else { // imgData[i] = 0; // imgData[i + 1] = 0; // imgData[i + 2] = 0; // } imgData[i] = avg; imgData[i + 1] = avg; imgData[i + 2] = avg; } ctx.putImageData(imgd, 0, 0); // const ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase(); const dataURL = canvas.toDataURL('image/jpeg'); return dataURL; } exports.getBase64Image = getBase64Image; /***/ }), /***/ 699: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.AutoClickManage = void 0; const commonType_1 = __webpack_require__(321); const components_1 = __webpack_require__(740); const lib_1 = __webpack_require__(915); const ConcurrencyPromisePool_1 = __webpack_require__(287); const tools_1 = __webpack_require__(633); const react_1 = __importStar(__webpack_require__(995)); const AutoClickManage = ({ onClose, user }) => { var _a, _b, _c, _d; const [data, setData] = (0, react_1.useState)(user.freeData ? user.freeData.map((d) => (Object.assign(Object.assign({}, d), { runStatus: commonType_1.RunStatus.NotRunning }))) : []); const [token, setToken] = (0, react_1.useState)(user.token); const [threadUrl, setThreadUrl] = (0, react_1.useState)(''); const [running, setRunning] = (0, react_1.useState)(false); const [startTime, setStartTime] = (0, react_1.useState)(((_b = (_a = user.freeData) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.runTime) ? String(user.freeData[0].runTime.startTime) : '0'); const [endTime, setEndTime] = (0, react_1.useState)(((_d = (_c = user.freeData) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.runTime) ? String(user.freeData[0].runTime.endTime) : '23'); const [pool] = (0, react_1.useState)(new ConcurrencyPromisePool_1.ConcurrencyPromisePool(1)); const isInitialMount = (0, react_1.useRef)(true); // When our cell renderer calls updateMyData, we'll use the rowIndex, columnId and new value to update the original data const updateMyData = (rowIndex, columnId, value) => { setData((old) => old.map((row, index) => { if (index === rowIndex) { return Object.assign(Object.assign({}, old[rowIndex]), { [columnId]: value }); } return row; })); }; const deleteData = (rowId) => { // We also turn on the flag to not reset the page setData((old) => { old.splice(rowId, 1); return [...old]; }); }; const addThread = () => __awaiter(void 0, void 0, void 0, function* () { var _e, _f, _g, _h; if (!threadUrl) { return alert('请输入帖子链接'); } const tid = (0, tools_1.getTid)(threadUrl); if (!tid) { return alert(`帖子地址错误,未找到帖子ID:${threadUrl}`); } if (data.some((t) => (0, tools_1.getTid)(t.url) === tid)) { return alert(tid + ',帖子已存在!'); } if (!threadUrl.includes('thread')) { return alert(`帖子地址错误:${threadUrl}`); } const docu = yield (0, lib_1.getData)(threadUrl); const topthreadStatus = docu.querySelector('#topthread_status'); if (!topthreadStatus) { return alert('未找到帖子的自动有空元素,请检查帖子'); } const titleCont = docu.querySelector('.title-cont'); if (!titleCont) { return alert('未找到帖子标题'); } const title = ((_f = (_e = titleCont.querySelector('.z')) === null || _e === void 0 ? void 0 : _e.textContent) !== null && _f !== void 0 ? _f : '') + ((_h = (_g = titleCont.querySelector('h1')) === null || _g === void 0 ? void 0 : _g.textContent) !== null && _h !== void 0 ? _h : ''); if (!title) { return alert('未找到帖子标题'); } setData([ ...data, { status: commonType_1.Status.online, runStatus: commonType_1.RunStatus.NotRunning, runTime: { startTime: Number(startTime), endTime: Number(endTime) }, title, url: threadUrl, cycle: '55', times: 0, nextClickTime: 0, retry: 0, delete: '', }, ]); }); const saveData = (0, react_1.useCallback)(() => { user.freeData = data; if (token && token.length === 36) { user.token !== token ? (user.token = token) : null; } else { new lib_1.MessageBox('没有输入令牌 or 令牌无效', 1000); } GM_setValue(user.username, user); }, [data, token, user]); const setNextClickTime = (t, skip) => { setData((old) => old.map((row) => { if (row.url === t.url) { return Object.assign(Object.assign({}, row), { times: skip ? row.times : row.times + 1, nextClickTime: t.nextClickTime, retry: t.retry }); } return row; })); }; const triggerNextClick = (t) => { const onThread = data.find((onlineThread) => onlineThread.status === 'online' && t.url === onlineThread.url); if (!onThread) { return; } // 点击时间校验,防止点击时间错乱,用于解决从休眠状态唤醒时重复调用 const diff = Math.abs(t.nextClickTime - new Date().getTime()); // 时间精度过高,误差等于网络超时时间+浏览器时间误差,设置误差600秒 if (diff < 600000 && t.retry < 10) { // 添加任务,在此处开始闭包,递归调用 pool.all([() => (0, lib_1.autofillCaptcha)(onThread, user, setNextClickTime, saveStatusData, triggerNextClick)]); } else if (t.retry >= 10) { saveStatusData(onThread.url, commonType_1.RunStatus.Error); new lib_1.MessageBox(`帖子ID:${(0, tools_1.getTid)(onThread.url)},连续重试次数过多:${onThread.retry}次,自动现在有空已停止运行!`, 'none', 'LOG_POP_GM'); } else { // 重置点击时间到下一个周期 onThread.nextClickTime = new Date().getTime() + 60000 * Number(onThread.cycle); // 添加任务,在此处开始闭包,递归调用 pool.all([() => (0, lib_1.autofillCaptcha)(onThread, user, setNextClickTime, saveStatusData, triggerNextClick)]); new lib_1.MessageBox(`帖子ID:${(0, tools_1.getTid)(onThread.url)},已错过点击时间,重置点击时间到下一个点击周期!预设点击时间:${new Date(t.nextClickTime).toLocaleString()},实际时间:${new Date().toLocaleString()}`); } }; const saveStatusData = (url, runStatus) => { setData((old) => old.map((row) => { if (row.url === url) { return Object.assign(Object.assign({}, row), { runStatus }); } return row; })); }; const start = () => __awaiter(void 0, void 0, void 0, function* () { if (!token) { return alert('请输入令牌'); } const onThreads = data.filter((t) => t.status === commonType_1.Status.online); if (!onThreads.length) { return alert('请将需要执行的帖子‘启用状态’设为已启用'); } setRunning(true); const promises = onThreads.map((t) => () => (0, lib_1.autofillCaptcha)(Object.assign(Object.assign({}, t), { retry: 0 }), user, setNextClickTime, saveStatusData, triggerNextClick)); pool.all(promises); }); (0, react_1.useEffect)(() => { // only on update if (isInitialMount.current) { isInitialMount.current = false; } else { saveData(); if (running && data.every((t) => t.runStatus === commonType_1.RunStatus.NotRunning || t.runStatus === commonType_1.RunStatus.Error)) { setRunning(false); } } }, [data, running, saveData]); const setRunTime = () => { const startTimeNum = Number(startTime); const endTimeNum = Number(endTime); if (startTimeNum > 23 || startTimeNum < 0 || endTimeNum > 23 || endTimeNum < 0 || startTimeNum === endTimeNum) { return alert('时间必须大于等于0点,小于等于23点'); } setData(data.map((d) => (Object.assign(Object.assign({}, d), { runTime: { startTime: startTimeNum, endTime: endTimeNum } })))); }; return (react_1.default.createElement(components_1.Modal, { isShow: true, width: "w-full", height: "max-h-[95%]", header: react_1.default.createElement(react_1.default.Fragment, null, "\u81EA\u52A8\u70B9\u51FB\u73B0\u5728\u6709\u7A7A\u7BA1\u7406\u9875\u9762"), footer: react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(components_1.Button, { text: '开始执行', onClick: start, disabled: running }), react_1.default.createElement(components_1.Button, { title: "\u4E0D\u4F7F\u7528\u65F6\u8BF7\u505C\u6B62\u8FD0\u884C\uFF0C\u4FEE\u6539\u8BBE\u7F6E\u540E\u9700\u8981\u505C\u6B62\u91CD\u65B0\u8FD0\u884C", text: '停止自动现在有空', onClick: () => { location.reload(); } }), react_1.default.createElement(components_1.Button, { title: "\u505C\u6B62\u8FD0\u884C\u81EA\u52A8\u73B0\u5728\u6709\u7A7A\u540E\u53EF\u5173\u95ED", text: '关闭页面', onClick: onClose, disabled: running })), onClose: () => { if (running) { alert('停止运行自动现在有空后可关闭'); } else { onClose(); } } }, react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("span", { className: "text-red-500" }, "\u76EE\u524D\u672C\u9875\u9762\u4EC5\u652F\u6301\u7BA1\u7406\u4E00\u4E2AJKF\u8D26\u53F7\u7684\u591A\u4E2A\u5E16\u5B50\uFF0C\u591A\u4E2A\u8D26\u53F7\u8BF7", react_1.default.createElement("a", { className: "text-blue-500 border-b", target: "_blank", href: "https://iknow.fun/2023/06/23/chrome-tong-shi-deng-lu-duo-ge-zhang-hao-wang-zhan-duo-kai-jiao-cheng/", rel: "noreferrer" }, "\u591A\u5F00\u6D4F\u89C8\u5668"), "\u3002"), react_1.default.createElement("div", { className: "flex items-end" }, react_1.default.createElement("div", { className: "w-64 pr-4" }, react_1.default.createElement(components_1.Input, { autoComplete: "off", label: "\u8F93\u5165\u4EE4\u724C\uFF1A", type: "password", onChange: (e) => setToken(e.target.value), placeholder: "\u8BF7\u8F93\u5165\u4EE4\u724C", value: token })), react_1.default.createElement("span", null, "\u8FD8\u6CA1\u6709\u4EE4\u724C\uFF1F"), react_1.default.createElement(components_1.Button, { title: "https://jkf.iknow.fun", text: '获取令牌', onClick: () => window.open('https://jkf.iknow.fun') })), react_1.default.createElement("div", { className: "flex items-end" }, react_1.default.createElement("div", { className: "w-64" }, react_1.default.createElement(components_1.Input, { label: "\u5E16\u5B50\u94FE\u63A5\uFF1A", onChange: (e) => setThreadUrl(e.target.value), placeholder: "\u8BF7\u8F93\u5165\u5E16\u5B50\u94FE\u63A5", value: threadUrl })), react_1.default.createElement("div", { className: "ml-4" }, react_1.default.createElement(components_1.Button, { text: '添加', onClick: addThread }))), react_1.default.createElement("div", { className: "flex items-end justify-between w-80 mt-2" }, react_1.default.createElement("span", { title: "\u8BBE\u7F6E\u81EA\u52A8\u70B9\u51FB\u4EC5\u5728\u8BE5\u65F6\u95F4\u6BB5\u5185\u8FD0\u884C\uFF0C\u91CD\u65B0\u8FD0\u884C\u540E\u751F\u6548", className: "cursor-help" }, "\u8FD0\u884C\u65F6\u95F4\u6BB5\uFF1A"), react_1.default.createElement("div", { className: "w-8" }, react_1.default.createElement(components_1.Input, { type: "number", min: 0, max: 23, onChange: (e) => setStartTime(e.target.value), placeholder: "0", value: startTime })), react_1.default.createElement("span", null, "\u70B9 ~ "), react_1.default.createElement("div", { className: "w-8" }, react_1.default.createElement(components_1.Input, { type: "number", min: 0, max: 23, onChange: (e) => setEndTime(e.target.value), placeholder: "23", value: endTime })), react_1.default.createElement("span", { className: "pl-2" }, ":59\u5206"), react_1.default.createElement(components_1.Button, { text: '保存', title: "\u91CD\u65B0\u8FD0\u884C\u540E\u751F\u6548", onClick: setRunTime })), react_1.default.createElement("div", { className: "overflow-auto" }, data.length ? (react_1.default.createElement(components_1.ReactTableCard, { searchBar: false, title: '帖子管理', data: data.map((t) => ({ status: t.status, runStatus: t.runStatus, runTime: t.runTime, title: t.title, url: t.url, cycle: t.cycle, times: t.times, nextClickTime: t.nextClickTime, retry: t.retry, delete: '', })), updateMyData: updateMyData, deleteData: deleteData })) : (''))))); }; exports.AutoClickManage = AutoClickManage; /***/ }), /***/ 818: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Home = void 0; const components_1 = __webpack_require__(740); const lib_1 = __webpack_require__(915); const autoPost_1 = __webpack_require__(342); const reCaptcha_1 = __webpack_require__(960); const react_1 = __importStar(__webpack_require__(995)); const react_copy_to_clipboard_1 = __webpack_require__(950); const AutoClickManage_1 = __webpack_require__(699); const Home = ({ user, setShowHome, counter, setCounter }) => { const mask = (0, react_1.useRef)(null); const [replyValue, setReplyValue] = (0, react_1.useState)(''); const [pageValue, setPageValue] = (0, react_1.useState)(''); const [showModal, setShowModal] = (0, react_1.useState)(false); const [showCaptcha, setShowCaptcha] = (0, react_1.useState)(false); const [recapchaToken, setRecapchaToken] = (0, react_1.useState)(''); (0, react_1.useEffect)(() => { GM_addValueChangeListener('CaptchaValue', (name, oldValue, newValue) => __awaiter(void 0, void 0, void 0, function* () { if (newValue) { setRecapchaToken(newValue); } })); }, []); return (react_1.default.createElement("div", { ref: mask, className: "fixed top-0 w-screen h-screen flex flex-col justify-center", onClick: (e) => { if (mask.current && mask.current === e.target) { setShowHome(); } } }, react_1.default.createElement("div", { className: "h-fit w-72 p-2 m-2 bg-gray-50 shadow-md rounded-md flex flex-col border" }, react_1.default.createElement("h3", { className: "text-sm text-center font-bold border-b" }, "JKForum Helper"), react_1.default.createElement(components_1.Panel, { title: "\u901A\u7528\u8BBE\u7F6E" }, react_1.default.createElement(components_1.Toggle, { label: '自动感谢', onClick: () => { (0, lib_1.swThk)(user); }, checked: user.autoThkSw }), react_1.default.createElement(components_1.Toggle, { label: '自动购买', onClick: () => { (0, lib_1.swPay)(user); }, checked: user.autoPaySw }), react_1.default.createElement(components_1.Toggle, { label: '加载原图', onClick: () => { (0, lib_1.swRePic)(user); }, checked: user.autoRePicSw }), react_1.default.createElement(components_1.Toggle, { title: '在不刷新网页的情况下,定时检测是否需要执行每日任务', label: '定时每日任务', onClick: () => { (0, lib_1.swDailyTask)(user); }, checked: user.autoDailyTask })), react_1.default.createElement(components_1.Panel, { title: "\u6279\u5904\u7406" }, react_1.default.createElement(components_1.TextArea, { label: '输入回复:', placeholder: '中文分号 ;分隔每条回帖内容,可输入论坛的富文本格式', onChange: setReplyValue, value: replyValue, rows: 2 }), react_1.default.createElement(components_1.Input, { label: '输入页码:', placeholder: '板块号-起始页-终止页', onChange: (e) => setPageValue(e.target.value), value: pageValue }), react_1.default.createElement(components_1.Button, { text: '添加当前页', onClick: () => { (0, lib_1.addOnePage)(user, replyValue); } }), react_1.default.createElement(components_1.Button, { text: '添加页码页', onClick: () => { (0, lib_1.addPageBatch)(user, pageValue, replyValue); } }), react_1.default.createElement(components_1.Button, { text: '获取快速回复', onClick: () => { (0, lib_1.setFastReply)(user); } }), react_1.default.createElement(components_1.Button, { text: '重置回帖数据', onClick: () => { (0, lib_1.resetReplyData)(user); } }), react_1.default.createElement(components_1.Button, { text: '一键回帖', disabled: !!counter.replyBtn, onClick: () => { (0, lib_1.replyOrThk)(counter, user, "reply" /* REPLY */, setCounter); } }), react_1.default.createElement(components_1.Button, { text: '一键感谢', disabled: !!counter.thkBtn, onClick: () => { (0, lib_1.replyOrThk)(counter, user, "thk" /* THANK */, setCounter); } })), react_1.default.createElement(components_1.Panel, { title: "\u9AD8\u7EA7\u529F\u80FD" }, react_1.default.createElement(components_1.Button, { text: '定时签到', disabled: !!counter.signBtn, onClick: () => { (0, lib_1.timeControl)(counter, setCounter, user); } }), react_1.default.createElement(components_1.Button, { text: '下载图片', disabled: !!counter.downloadBtn, onClick: () => { (0, lib_1.downloadImgs)(user, counter, setCounter); } }), react_1.default.createElement(components_1.Button, { text: '自动发文', onClick: () => { (0, autoPost_1.autoPost)(user); } }), react_1.default.createElement(components_1.Button, { text: '现在有空', onClick: () => { setShowModal(true); } }), react_1.default.createElement(components_1.Button, { text: '屏蔽图片', onClick: () => { (0, lib_1.noDisplayPic)(); } }), react_1.default.createElement(components_1.Button, { title: "\u670D\u52A1\u5668\u6258\u7BA1\u767B\u5F55\u8D26\u53F7\u65F6\u4F7F\u7528", text: '获取验证码', onClick: () => { setShowCaptcha(true); (0, reCaptcha_1.reCaptcha)(); } }), react_1.default.createElement(components_1.Button, { text: '检查更新', onClick: () => { (0, lib_1.checkUpdate)(user); } })), react_1.default.createElement("br", null), react_1.default.createElement(components_1.Button, { text: 'close', onClick: setShowHome }), react_1.default.createElement(components_1.Modal, { isShow: showCaptcha, header: react_1.default.createElement("div", { className: "flex w-80" }, "\u670D\u52A1\u5668\u6258\u7BA1\u767B\u5F55\u8D26\u53F7\u65F6\u4F7F\u7528"), footer: react_1.default.createElement("div", { className: "flex justify-evenly w-full" }, react_1.default.createElement(components_1.Button, { text: '刷新验证码', onClick: () => { setRecapchaToken(''); grecaptcha.reset(); } }), react_1.default.createElement(react_copy_to_clipboard_1.CopyToClipboard, { text: recapchaToken, onCopy: () => new lib_1.MessageBox('复制验证码成功') }, react_1.default.createElement(components_1.Button, { disabled: !recapchaToken, text: '复制验证码', onClick: () => '' }))), onClose: function () { setShowCaptcha(false); } }, react_1.default.createElement("div", { className: "w-40 h-20", id: "reCaptcha" })), showModal ? react_1.default.createElement(AutoClickManage_1.AutoClickManage, { user: user, onClose: () => setShowModal(false) }) : ''))); }; exports.Home = Home; /***/ }), /***/ 950: /***/ ((module) => { "use strict"; module.exports = CopyToClipboard; /***/ }), /***/ 583: /***/ ((module) => { "use strict"; module.exports = JSZip; /***/ }), /***/ 995: /***/ ((module) => { "use strict"; module.exports = React; /***/ }), /***/ 533: /***/ ((module) => { "use strict"; module.exports = ReactDOM; /***/ }), /***/ 282: /***/ ((module) => { "use strict"; module.exports = ReactTable; /***/ }), /***/ 581: /***/ ((module) => { "use strict"; module.exports = saveAs; /***/ }), /***/ 419: /***/ ((module) => { "use strict"; module.exports = JSON.parse('{"name":"JKForum 助手","name:en":"JKForum Helper","name:zh-TW":"JKForum 助手","name:ja":"JKForum 助手","name:ko":"JKForum 조수","namespace":"https://github.com/Eished/jkforum_helper","version":"0.9.3","description":"JKF 捷克论坛助手:自动签到、定时签到、自动感谢、自动加载原图、自动播放图片、自动支付购买主题贴、自动完成投票任务,优化浏览体验,一键批量回帖/感谢,一键打包下载帖子图片,自动识别验证码,自动现在有空,自动点击置顶广告,自动发文","description:en":"JKF JKForum Helper: Auto-sign-in, timed sign-in, auto-thank you, auto-load original image, auto-play image, auto-pay to buy theme post, auto-complete voting task, optimize browsing experience, one-click bulk reply/thank you, one-click package to download post image,Skip mobile verification code when logging in","description:zh-TW":"JKF 捷克論壇助手:自動簽到、定時簽到、自動感謝、自動加載原圖、自動播放圖片、自動支付購買主題貼、自動完成投票任務,優化瀏覽體驗,一鍵批量回帖/感謝,一鍵打包下載帖子圖片,自動識別驗證碼,自動現在有空,自動點擊置頂廣告,自動發文","description:ja":"JKF チェコ語フォーラム助手:自動チェックイン、時限式チェックイン、オートサンキュー、オリジナル画像の自動読み込み、画像の自動再生、トピック投稿の自動支払い、ポールタスクの自動完了、ブラウジングエクスペリエンスの最適化、ワンクリックでの一括返信/サンキュー、ワンクリックでの投稿画像のパッケージダウンロード,ログイン時にモバイル認証コードをスキップ","description:ko":"JKF 체코 포럼 조수: 자동 로그인, 정기 로그인, 자동 감사, 원본 사진 자동로드, 테마 스티커 구매 자동 결제, 투표 작업 자동 완료, 최적화 된 브라우징 경험, 원 클릭 일괄 회신 / 감사, 원 클릭 포스트 사진의 패키지 다운로드 클릭다운로드하십시오,로그인 시 모바일 인증 코드 건너뛰기","author":"Eished","copyright":"Eished","license":"MIT","match":["*://*.jkforum.net/*"],"run-at":"document-idle","supportURL":"https://github.com/Eished/jkforum_helper/issues","homepage":"https://github.com/Eished/jkforum_helper","grant":["GM_getValue","GM_setValue","GM_deleteValue","GM_info","GM_xmlhttpRequest","GM_openInTab","GM_registerMenuCommand","GM_addElement","GM_addStyle","GM_notification","GM_addValueChangeListener"],"connect":["mymypic.net","jkf.iknow.fun","cdn.jsdelivr.net","github.com","greasyfork.org","jkf.hare200.com"],"require":["https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js","https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js","https://cdn.jsdelivr.net/npm/[email protected]/dist/react-table.production.min.js","https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js","https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js","https://cdn.jsdelivr.net/npm/[email protected]/build/react-copy-to-clipboard.min.js"],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDExNi4xNjQ2NTUsIDIwMjEvMDEvMjYtMTU6NDE6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YzYwNmI3NGQtODA4Zi03YjQ3LWI4NGYtYjNlZmJiMTM4NDIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkM3MzFDMzYyRUE5MzExRUJCOTU4RkY3NUMxOTY5MDdGIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkM3MzFDMzYxRUE5MzExRUJCOTU4RkY3NUMxOTY5MDdGIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMS4yIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA2MWY1NjgyLTk5OTctNDU0OS04NjIzLWZhNzY0MmVjMTM5MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpjNjA2Yjc0ZC04MDhmLTdiNDctYjg0Zi1iM2VmYmIxMzg0MjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5urL1nAAAJJUlEQVR42uxba2wU1xX+ZnZ2vYvX4BpDCYVA6xgKkR0wlYlJnyK1iiweVlqgGFpKK6qWAuYtQgitoYANGCTqRnJIQbQ/sJoAKsESMkrTitSQpuJhUBwVHCC21QeCgh17vevd6Tkzs+uZfXgftsevHOvT7twd35lz7rnnfufcGUGWZQxnETHMZdgbQLpy5UpfX0MgjCAkExwabBpEDT4NbkIHoZ3QRviUv/Msbff0/o1ZLBbl5npL0gkZhCkavkj4gtaeqhnArilu6aYfr2YEF6GV8EgS8J/ffh9NaSlo8PlQLwr4iNBAaBUT1YCMKtkdPTJAGuF5wrcIeYQvE0b3hQs5k4CmUmAkm9Kj3Dz/NRJuEP5CWrxDfnSVPn2KRnJsBoDNCSneKUPIJywjvEj4vBnzVCClPqXJMZL9olObVgIm0udEUqTAR8p4fbjmlfGmRcApyYI7QjRDyGo3sQZBGgP8hPAB4TyhyCzlu1VAU5CngVXCDLuEPaT4NZcHx9weTAtEoB6uAvMItYTXCc8N2HCuGYNG3+mw4ceiiL9T4PxVp5fijpCYAThYHSZUE2YOmnVN8wwyRLLDildpavyZvGFqJCOI3QS4twnFg3aB1zwiyYrnaVq82+6mQC3EZoCRhD8Rvj0kmI6sxIdxkoi3yRNmBBtBDENaThBeGFJ0TzUCe/UfPZ30KUQ2wFpC4ZDkvGQEmxXPUEwoV/I/IdQAvK7uHurc3ybhh+QFXwvnAVu1+T90hUaelkf+eEX2dTE7aKRmxaBRxBqd4EQUotJWES92+pBlFVDnN8ACwqiouTOZTxC6ruyjzCRSQYUzLb10d264/+HrWK1WtLe3h5xXd5dSRXcC2R+N/nMTlIAokgG+S65Q5//tnI5cRsThw4fl+vr6APLz8yOeW1VVZTh36tSp3fa9evVqw/l37tyRCwsLld9S7JCby8h+vyNUQn52fPR7DQciRmo/b0DuqMAV7xspgqRlcF+JxYKTJ08GKRI4Tk1NjXjulClTDOc6HI6I52ZnZ+PIkSOGc86cOYNz586FH8kE3d8iGr5PpxXhaW7KjjWxcbuNfuf1eiOe29HRETIFwondbseJEycMyt+6dQsrV65EZ2dnxOwwEWmlW5K7Eignfc1mD5jRg5DSY9m/fz9mzuxKNVpbW1FUVIQnT57E3EdBFiGHlIsSF6wUYlJHqLUnQV0VstgA0/pL+fnz52P9+vWGtjVr1uD69etx9fP1TOBnC7QCWjRxacU3dcgzJa10ZbqMHz8elZWVhraKigqcPHky7r5cHq2C2B73v07kGDCuPwzAyo8b13Xp2tpabNq0ydR7oFiSzgb4nNnKb9iwAQUFBYHjBw8eYPny5SGBs88NQMyXDZBsjrXVSTdr1izs27fP8NuqVavQ0NBgvhsKcLAB7GZcy+PxKMzu+PHjSEpKCrTv3r074nrf56mBDLuoywf6VHh527FjB7KysgJtZ8+exa5du/otpSAyZJFgwvZYW1sb5s2bh23bthnajx07ht7YnLVJmh97oydC8BmrP5IZJEiSJOzdu1dhfXopKSlBTU1NCMOMV07WAu9/Av+eQUR5heJuzjNQN+A0C5hiAJvNhrS0tJD2nJwcrF27FocOHepR/x/+S0U0+dELdE1LV21AgMm7w1evXg2ZBjt37sSkSZNMub4YZrdI0pr63AtaWlqUBOfGjRtYuHAh5syZo7SPGjUKpaWlWLp0acJ9pzsJKYi6JzjSrjtHUL9KZo3+unXrFOVZNm/ejEuXLikFFpYlS5Yoy+OFCxcS6vsX36T5/T2NDndb0IG676xvM8bFvhOmuvrvnALrpby8PCRIxuzapAWvZ9EQnEbzAiRGj53GYBZrPSBY9OTHP/cfPnwYOJ4+fTo2btyYKKHpesSiOwRNEZ8PPlG3KESVsWPHGo4fP36csEc0Nzdjz549hrbt27cjIyPDPCZIE0KMPnMQCFZc5vILV2saGxt7dAOc/t68eTNw7HQ6cfDgQTOzQRcbIKbSS2FhIdLT0wPH9+7dU9ATYQLEAVEvixYtUgolJuUCrWyA/3Y3V1nmzp2LsrIyQ9v58+d7zOBYOPKfPn3a0MbEKDnZlCT1IRvA4MdMWfnJsaqqKpw6dQqXL1/GxYsXMWbMmMA5XKs/evRor90FkyPOF/ySmZmJrVu3muEBzWyAfwbT09zcXCxevFhZn2fPnh3yj8XFxbh9+3av3Qj3FUyHt2zZYiir95E0sAHq9MvctGmRa6T379/HihUrQmp54STYhYN3ioLlwIEDhpjCZXLOFm22JPj6gqmo/PdDZoJcguVyooNTU87Z8/LyMGHCBCUeuFwu3L17V2Fu1dXVePToUUz98wjqgyb3EY0qM0XW1wvYaDa6B5+rl0tlgsIBmMTU+VPif0DdIBmQkkIE8aMS4Kl0lbZlvEy++6Dr95e/A/x6OWIri2sGoFX8Y8GW8qykMcF3B7IBgqVkAS1drV3HeV+Kh85pLNaH92wi2v3JEK9D6wa85to2Z9E3ghJ5j4Z4qDPpzLmBv5v3CDcHiwcouzttOnjim/+dXjRJImqgsyNPg3IMB5EVD3iN4msrZKMj/YGLNkNaeRp9jxeNlD5X6OsB+pn083jS48GmPPMJCn4bJAv+F3jOOOi0y7yED1XXd3fiN0lWvKmvC4Qrih4hlA01/V0evGWVUCxEeVI0kJ8QXh0Kbs+D3e7G78ntl1lEYn9ybAZg4YcmXyI0DVblabnroJHfRm7/AzKAO1zVONq+ABOkXEJlnKtt/wY7WXH5Ggp4X3VYUaZUgyOUzGPZGGkm/FQzxHHC44GotEJvucjnwTu01C20WZBPI/9BgEFGkHj2Ba4RVhF+yZUrqA9Vs1FG9JfCrJjyvpAX9aR8NTVXWS14PzDicuxdJSqTob4xxg8f50B9bS69t/V10DA1lwKp6ltjrsAbY8DfCH8lP75Omrjj0oaNY7VDGD26V990486ehvrgFYOfQH9KMwo/iut/edKmeZ+oux2vFmfcGsNvIfDGwb9tEhqX5eITZxI+5ioO6dlEo+zWvzOYyC57ksMJgZ/PMVEsOuX9O9P+LUufxkL9RjCo1OJS3T3W1wJjEZFIgfDZ2+PDXP4vwABKHSZ0zSd04wAAAABJRU5ErkJggg=="}'); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __webpack_require__(629); /******/ /******/ })() ;