Sleazy Fork is available in English.

海角社区免费版

可以免费观看海角社区钻石和金币付费帖子、vip帖子,包括视频、图片、音频。

  1. // ==UserScript==
  2. // @name 海角社区免费版
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.2
  5. // @description 可以免费观看海角社区钻石和金币付费帖子、vip帖子,包括视频、图片、音频。
  6. // @author JamToday
  7. // @match https://*.haijiao.com/*
  8. // @include *://hj*.*/*
  9. // @include *://*.hj*.*/*
  10. // @include *://*.hai*.*/*
  11. // @include *://hai*.*/*
  12. // @include *://hj*/*
  13. // @include *://*.hj*/*
  14. // @include */post/details/*
  15. // @match *://*/post/details*
  16. // @exclude *://hjai*/*
  17. // @exclude *://haijiao.ai/*
  18. // @exclude *://haijiao.pro/*
  19. // @exclude *://*.kittymao.xyz/*
  20. // @exclude https://hjfb.org/*
  21. // @exclude *://tool.liumingye.cn/*
  22. // @icon https://www.hjadbf.top/images/common/project/favicon.ico
  23. // @grant none
  24. // @run-at document-start
  25. // ==/UserScript==
  26. (function () {
  27. let kitty_StatusColor = {
  28. success: "#67C23A",
  29. warning: "#E6A23C",
  30. info: "#909399",
  31. danger: "#F56C6C",
  32. 200: "#67C23A",
  33. 300: "#E6A23C",
  34. 400: "#909399",
  35. 500: "#F56C6C",
  36. };
  37. let kitty_config = {
  38. name: "海角社区免费版",
  39. id: "hjfree",
  40. version: "0.1.2",
  41. homePageName: "kitty猫",
  42. homePageUrl: "www.kittymao.xyz",
  43. update: 3,
  44. logListMaxLength: 19,
  45. logItemLength: 20,
  46. updateUrl: "https://sleazyfork.org/zh-CN/scripts/440819-cao",
  47. requestHostList: ["https://baixiaodu.uk/api"],
  48. };
  49. let kitty_isrun = {
  50. getNewVersion: false,
  51. };
  52. let kitty_tabIndex = 0;
  53. let kitty_logListTarget = [];
  54. let kitty_logList = new Proxy(kitty_logListTarget, {
  55. set: function (target, property, value) {
  56. if (property === "length") {
  57. console.log("Cannot change the length of the array.");
  58. return true;
  59. } else {
  60. target[property] = value;
  61. let appendDiv = document.createElement("div");
  62. appendDiv.innerHTML = value;
  63. let kitty_logListDiv =
  64. document.getElementsByClassName("kitty_logList")[0];
  65. kitty_logListDiv.appendChild(appendDiv);
  66. return true;
  67. }
  68. },
  69. });
  70. function kitty_setCookie(cname, cvalue, exdays) {
  71. var d = new Date();
  72. d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
  73. var expires = "expires=" + d.toGMTString();
  74. document.cookie = cname + "=" + cvalue + "; " + expires;
  75. }
  76. function kitty_insertStyle() {
  77. let style = document.createElement("style");
  78. style.innerHTML = `
  79. /* 整体-start */
  80. #kitty_vipPanel {
  81. width: 310px;
  82. height: 500px;
  83. box-shadow: 0 0 0 1px rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 9%);
  84. border-left: 1px solid transparent;
  85. border-right: none;
  86. border-top: 1px solid transparent;
  87. border-bottom: 1px solid transparent;
  88. background-color: #FFFFFF;
  89. position: fixed;
  90. left: 6px;
  91. bottom: 6px;
  92. z-index: 99999;
  93. font-size: 16px;
  94. --script-panel-main-color: #4178b0;
  95. }
  96. #kitty_vipPanel a {
  97. text-decoration: underline;
  98. }
  99. .kitty_panelMain {
  100. font-size: 0.85em;
  101. }
  102. .kitty_hiddenPanel {
  103. left: -310px !important;
  104. }
  105. /* 整体-end */
  106. /* panelHead-start */
  107. .kitty_panelHead {
  108. display: flex;
  109. border-bottom: 1px solid #ececec;
  110. }
  111. .kitty_panelHead>div {
  112. color: #444;
  113. padding: 0 10px;
  114. height: 40px;
  115. line-height: 40px;
  116. box-sizing: border-box;
  117. user-select: none;
  118. text-align: center;
  119. width: 76px;
  120. font-size: 1em;
  121. }
  122. .kitty_panelHead>div:not(.kitty_headDivActive):hover {
  123. border-bottom: 3px solid #ccc;
  124. cursor: pointer;
  125. }
  126. .kitty_headDivActive {
  127. border-bottom: 3px solid var(--script-panel-main-color);
  128. color: #444;
  129. font-weight: bold;
  130. }
  131. /* panelHead-end */
  132. /* 界面显示按钮 */
  133. .kitty_showPanelBtn, .kitty_jiexiBtn {
  134. position: absolute;
  135. left: 320px;
  136. top: 150px;
  137. width: 50px;
  138. height: 50px;
  139. line-height: 50px;
  140. color: var(--script-panel-main-color);
  141. user-select: none;
  142. background-color: #FFFFFF;
  143. position: absolute;
  144. bottom: 20px;
  145. display: none;
  146. cursor: pointer;
  147. border-radius: 50px;
  148. text-align: center;
  149. box-shadow:0 0 0 1px rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 9%);
  150. }
  151. .kitty_jiexiBtn {
  152. top: 85px;
  153. }
  154. /* 身体 */
  155. .kitty_panelBody {
  156. padding: 0 10px;
  157. }
  158. .kitty_panelBody p {
  159. margin: 10px 0;
  160. }
  161. /* 输入框-start */
  162. .kitty_searchInput {
  163. width: 98%;
  164. border-radius: 24px;
  165. box-shadow: 0 0 0 1px rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 9%);
  166. height: 40px;
  167. border-left: 1px solid transparent;
  168. border-right: none;
  169. border-top: 1px solid transparent;
  170. border-bottom: 1px solid transparent;
  171. overflow: hidden;
  172. margin: 0 auto;
  173. margin-top: 40px;
  174. margin-bottom: 50px;
  175. display: flex;
  176. }
  177. .kitty_searchInput:hover {
  178. border-top-left-radius: 24px;
  179. box-shadow: 0 0 0 1px rgb(0 0 0 / 10%), 0 2px 4px 1px rgb(0 0 0 / 18%);
  180. border-left: 1px solid transparent;
  181. border-right: none;
  182. border-top: 1px solid transparent;
  183. border-bottom: 1px solid transparent;
  184. }
  185. .kitty_searchInput input {
  186. height: 100%;
  187. border: 0;
  188. outline: 0;
  189. padding: 0 10px;
  190. color: black;
  191. width: 100%;
  192. }
  193. /* 输入框-end */
  194. /* go按钮-start */
  195. .kitty_goToVipBtn {
  196. color: #FFFFFF;
  197. font-weight: bold;
  198. background-color: var(--script-panel-main-color);
  199. height: 100px;
  200. width: 100px;
  201. border-radius: 50px;
  202. text-align: center;
  203. line-height: 100px;
  204. margin: 20px auto;
  205. box-shadow: 0 0 0 1px rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 9%);
  206. user-select: none;
  207. }
  208. .kitty_goToVipBtn:hover {
  209. cursor: pointer;
  210. box-shadow: 0 0 0 0 rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 18%);
  211. -webkit-box-shadow: 0 0 0 0 rgb(0 0 0 / 5%), 0 2px 4px 1px rgb(0 0 0 / 18%);
  212. -moz-box-shadow: 0 0 0 0 rgba(0,0,0,.05),0 2px 4px 1px rgba(0,0,0,.18);
  213. }
  214. /* 动画 */
  215. @keyframes kitty_float {
  216. 0% {
  217. transform: translateY(0px);
  218. }
  219. 5% {
  220. transform: translateY(-10px);
  221. }
  222. 10%,100% {
  223. transform: translateY(0px);
  224. }
  225. }
  226. .kitty_navy {
  227. position: relative;
  228. }
  229. .kitty_navy span {
  230. position: relative;
  231. display: inline-block;
  232. color: white;
  233. animation: kitty_float 9s ease-in-out infinite;
  234. animation-delay: 2s;
  235. font-size: 1.5em;
  236. }
  237. /* go按钮-end */
  238. .kitty_logOutput {
  239. color: #71777d;
  240. font-size: 0.9em;
  241. margin-top: 10px;
  242. }
  243. .kitty_logOutput div {
  244. margin: 0;
  245. padding: 0;
  246. line-height: 1.5;
  247. }
  248. .kitty_downloadText {
  249. font-size: 20px;
  250. font-weight: bold;
  251. }
  252. .kitty_downloadText a {
  253. cursor:pointer;
  254. }
  255. `;
  256. document.querySelector("head").appendChild(style);
  257. }
  258. function kitty_createPanel() {
  259. let panel = document.createElement("div");
  260. panel.setAttribute("id", "kitty_vipPanel");
  261. panel.innerHTML = `
  262. <div class="kitty_showPanelBtn">显示</div>
  263. <div class="kitty_jiexiBtn">解析</div>
  264. <div class="kitty_panelMain">
  265. <div class="kitty_panelHead">
  266. <div class="kitty_headDivActive">运行日志</div>
  267. <div>重要说明</div>
  268. <div>使用指南</div>
  269. </div>
  270. <div class="kitty_panelBody kitty_panelBody_0">
  271. <div class="kitty_logOutput">
  272. <div>脚本--><span class="kitty_scriptName"></span>-<span class="kitty_version"></span>-<span class="kitty_update"></span></div>
  273. <div>主页--><a class="kitty_homepage" target="_blank" href="">主页地址</a></div>
  274. <div>邮箱-->JamJamToday@protonmail.com</div>
  275. <div>操作--><span style="color: red;cursor:pointer;" class="kitty_hiddenPanelBtn">点此隐藏此脚本操作界面&lt;&lt;</span></div>
  276. <div class="kitty_logList">
  277. </div>
  278. </div>
  279. </div>
  280. <div class="kitty_panelBody kitty_panelBody_1" style="display:none;">
  281. <p>+ 本脚本完全免费</p>
  282. <p>+ 本脚本无恶意代码放心使用</p>
  283. <p>+ 更多脚本可看 <a target="_blank" href="https://docs.kittymao.xyz">www.kittymao.xyz</a></p>
  284. <p>+ 脚本仅支持正版海角</p>
  285. <p>+ 如果脚本在非正版海角网站运行, 请关闭即可</p>
  286. </div>
  287. <div class="kitty_panelBody kitty_panelBody_2" style="display:none;">
  288. <p>+ 使用方法线路1: <a target="_blank" href="https://www.kittymao.xyz">www.kittymao.xyz</a></p>
  289. </div>
  290. </div>
  291. `;
  292. document.body.appendChild(panel);
  293. let ishidden = localStorage.getItem("kitty_isHiddenPanel");
  294. if (ishidden) {
  295. ishidden = JSON.parse(ishidden);
  296. if (ishidden) {
  297. kitty_hiddenPanel();
  298. } else {
  299. kitty_showPanel();
  300. }
  301. }
  302. }
  303. function kitty_eventBind() {
  304. let tabs = document.querySelectorAll(".kitty_panelHead>div");
  305. for (let i = 0; i < tabs.length; i++) {
  306. tabs[i].addEventListener("click", function () {
  307. for (let ii = 0; ii < tabs.length; ii++) {
  308. tabs[ii].className = "";
  309. }
  310. tabs[i].className = "kitty_headDivActive";
  311. kitty_changeTab(i);
  312. });
  313. }
  314. document
  315. .querySelector(".kitty_hiddenPanelBtn")
  316. .addEventListener("click", function () {
  317. kitty_hiddenPanel();
  318. });
  319. document
  320. .querySelector(".kitty_showPanelBtn")
  321. .addEventListener("click", function () {
  322. kitty_showPanel();
  323. });
  324. document
  325. .querySelector(".kitty_jiexiBtn")
  326. .addEventListener("click", function () {
  327. if (location.href.includes("post/details?pid")) {
  328. if (kitty_isLogin()) {
  329. document.querySelector(".kitty_jiexiBtn").innerHTML = "稍等";
  330. } else {
  331. document.querySelector(".kitty_jiexiBtn").innerHTML = "暂无";
  332. kitty_checkLogin();
  333. kitty_showPanel();
  334. }
  335. } else {
  336. document.querySelector(".kitty_jiexiBtn").innerHTML = "暂无";
  337. }
  338. });
  339. }
  340. function kitty_changeTab(index) {
  341. kitty_tabIndex = index;
  342. let panelBodys = document.querySelectorAll(".kitty_panelBody");
  343. if (!panelBodys[kitty_tabIndex]) {
  344. return;
  345. }
  346. for (let i = 0; i < panelBodys.length; i++) {
  347. panelBodys[i].style.display = "none";
  348. }
  349. panelBodys[kitty_tabIndex].style.display = "block";
  350. }
  351. function kitty_hiddenPanel() {
  352. document.querySelector("#kitty_vipPanel").className = "kitty_hiddenPanel";
  353. document.querySelector(".kitty_showPanelBtn").style.display = "block";
  354. document.querySelector(".kitty_jiexiBtn").style.display = "block";
  355. localStorage.setItem("kitty_isHiddenPanel", JSON.stringify(true));
  356. }
  357. function kitty_showPanel() {
  358. document.querySelector("#kitty_vipPanel").className = "";
  359. document.querySelector(".kitty_showPanelBtn").style.display = "none";
  360. document.querySelector(".kitty_jiexiBtn").style.display = "none";
  361. localStorage.setItem("kitty_isHiddenPanel", JSON.stringify(false));
  362. }
  363. function kitty_getSuccessHost() {
  364. let successHost = localStorage.getItem("kitty_requestSuccessHost");
  365. if (successHost) {
  366. let findIndex = kitty_config.requestHostList.indexOf(successHost);
  367. if (findIndex != -1) {
  368. kitty_config.requestHostList.splice(findIndex, 1);
  369. kitty_config.requestHostList.unshift(successHost);
  370. }
  371. }
  372. }
  373. function kitty_getHost(index) {
  374. return kitty_config.requestHostList[index];
  375. }
  376. function kitty_getStatusTypeText(type) {
  377. let typeText = "提示";
  378. switch (type) {
  379. case "success":
  380. typeText = "成功";
  381. break;
  382. case "warning":
  383. typeText = "警告";
  384. break;
  385. case "info":
  386. typeText = "信息";
  387. break;
  388. case "danger":
  389. typeText = "失败";
  390. break;
  391. case "200":
  392. typeText = "成功";
  393. break;
  394. case "300":
  395. typeText = "警告";
  396. break;
  397. case "400":
  398. typeText = "信息";
  399. break;
  400. case "500":
  401. typeText = "失败";
  402. break;
  403. }
  404. return typeText;
  405. }
  406. function kitty_logListPush(item, type, isDom) {
  407. if (kitty_logList.length >= kitty_config.logListMaxLength) {
  408. kitty_logListShift();
  409. }
  410. let stringLength = item.length;
  411. let start = 0;
  412. let end = kitty_config.logItemLength - 1;
  413. let headLine = true;
  414. let typeText = `${kitty_getStatusTypeText(type)}-->`;
  415. let styleColor = "";
  416. if (type) {
  417. styleColor = type ? `color: ${kitty_StatusColor[type]}` : "";
  418. }
  419. if (isDom) {
  420. let pushStr = `<span style="${styleColor}">${typeText}${item}</span>`;
  421. kitty_logList.push(pushStr);
  422. } else {
  423. while (stringLength >= 0) {
  424. let pushStr = `<span style="${styleColor}">${
  425. headLine ? typeText : '<span style="opacity: 0;">续行--</span>&gt;'
  426. }${item.substring(start, end)}</span>`;
  427. kitty_logList.push(pushStr);
  428. start = end;
  429. end += end;
  430. stringLength = stringLength - kitty_config.logItemLength;
  431. headLine = false;
  432. }
  433. }
  434. // kitty_showLogList();
  435. }
  436. function kitty_logListShift() {
  437. kitty_logListTarget.shift();
  438. let kitty_logListChild0 =
  439. document.querySelectorAll(".kitty_logList div")[0];
  440. kitty_logListChild0.remove();
  441. // kitty_showLogList();
  442. }
  443. function kitty_setConfig() {
  444. document.getElementsByClassName("kitty_scriptName")[0].innerHTML =
  445. kitty_config.name;
  446. document.getElementsByClassName(
  447. "kitty_version"
  448. )[0].innerHTML = `v${kitty_config.version}`;
  449. let homepage = document.getElementsByClassName("kitty_homepage")[0];
  450. homepage.innerHTML =
  451. kitty_config.homePageName + `(${kitty_config.homePageUrl})`;
  452. homepage.href = "https://" + kitty_config.homePageUrl;
  453. if (kitty_config.update === 1) {
  454. let versionSpan = document.getElementsByClassName("kitty_update")[0];
  455. versionSpan.innerHTML = `已最新`;
  456. versionSpan.style = `color: ${kitty_StatusColor.success};`;
  457. } else if (kitty_config.update === 2) {
  458. let versionSpan = document.getElementsByClassName("kitty_update")[0];
  459. versionSpan.innerHTML = `<span class="kitty_toNewVersion" style="user-select: none;cursor: pointer;">点此更新</span>`;
  460. versionSpan.style = `color: ${kitty_StatusColor.warning};`;
  461. document
  462. .querySelector(".kitty_toNewVersion")
  463. .addEventListener("click", function () {
  464. window.open(kitty_config.updateUrl);
  465. });
  466. } else {
  467. let versionSpan = document.getElementsByClassName("kitty_update")[0];
  468. versionSpan.innerHTML = `<span class="kitty_checkVersion" style="user-select: none;cursor: pointer;">检查更新</span>`;
  469. versionSpan.style = `color: ${kitty_StatusColor.warning};`;
  470. document
  471. .querySelector(".kitty_checkVersion")
  472. .addEventListener("click", function () {
  473. kitty_getNewVersion(0, false);
  474. });
  475. }
  476. }
  477. function kitty_getNewVersion(index, change) {
  478. if (kitty_isrun.getNewVersion && !change) {
  479. return;
  480. }
  481. let host = kitty_getHost(index);
  482. if (!change) {
  483. kitty_logListPush("检查版本号中请耐心等待...", "info");
  484. }
  485. kitty_isrun.getNewVersion = true;
  486. let url = `${host}/getVersion`;
  487. fetch(url, {
  488. method: "post",
  489. headers: {
  490. "Content-Type": "application/json",
  491. },
  492. body: JSON.stringify({
  493. nickname: "hjfree",
  494. }),
  495. })
  496. .then((res) => res.json())
  497. .then((res) => {
  498. localStorage.setItem("kitty_requestSuccessHost", host);
  499. try {
  500. let data = res.data;
  501. if (data.version === kitty_config.version) {
  502. kitty_config.update = 1;
  503. kitty_logListPush("已是最新版", "success");
  504. } else {
  505. kitty_config.update = 2;
  506. kitty_config.updateUrl = data.updateUrl;
  507. kitty_logListPush("不是最新版,可能无法使用", "warning");
  508. }
  509. kitty_setConfig();
  510. } catch (e) {
  511. kitty_logListPush("失败,返回值处理有问题", "danger");
  512. console.log(e);
  513. }
  514. kitty_isrun.getNewVersion = false;
  515. })
  516. .catch((e) => {
  517. if (e.toString().includes("JSON")) {
  518. kitty_logListPush("JSON解析失败,请联系作者", "danger");
  519. kitty_isrun.getNewVersion = false;
  520. } else {
  521. console.log(e);
  522. index++;
  523. let getHost = kitty_getHost(index);
  524. if (getHost) {
  525. kitty_logListPush("请求失败,切换线路中请耐心等待...", "warning");
  526. kitty_getNewVersion(index, true);
  527. } else {
  528. kitty_logListPush("请求失败,请联系作者", "danger");
  529. kitty_isrun.getPermission = false;
  530. }
  531. }
  532. });
  533. }
  534. function kitty_vipPanelInit() {
  535. kitty_insertStyle();
  536. kitty_createPanel();
  537. kitty_getSuccessHost();
  538. kitty_eventBind();
  539. kitty_setConfig();
  540. }
  541. // ------------------------------------------
  542. // ------------------------------------------
  543. // ------------------------------------------
  544. let kitty_icons = {
  545. toTop:
  546. "data:image/png;base64,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",
  547. close:
  548. "data:image/png;base64,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",
  549. };
  550. let kitty_utils = {
  551. getCookie: function (name) {
  552. const cookies = document.cookie.split(";"); // 将 document.cookie 拆分为多个 Cookie 字符串
  553. for (const cookie of cookies) {
  554. const [cookieName, cookieValue] = cookie.split("=");
  555. const trimmedCookieName = cookieName.trim(); // 去除空格
  556. if (trimmedCookieName === name) {
  557. return decodeURIComponent(cookieValue); // 解码 Cookie 值
  558. }
  559. }
  560. return null; // 没有找到匹配的 Cookie
  561. },
  562. hjApiDecode: function (data) {
  563. let res;
  564. try {
  565. res = JSON.parse(atob(atob(atob(data))));
  566. } catch (e) {
  567. console.log("ab error");
  568. return "";
  569. }
  570. return res;
  571. },
  572. hjApiEecode: function (data) {
  573. return btoa(btoa(btoa(JSON.stringify(data))));
  574. },
  575. getElement: function (selector) {
  576. return new Promise((success, reject) => {
  577. let ele;
  578. function querySelectorAll_() {
  579. ele = document.querySelectorAll(selector);
  580. if (ele.length != 0) {
  581. success(ele);
  582. return true;
  583. } else {
  584. return false;
  585. }
  586. }
  587. if (!querySelectorAll_()) {
  588. let count = 1;
  589. let interval = setInterval(() => {
  590. if (count > 75) {
  591. reject("未获取元素: ", selector);
  592. clearInterval(interval);
  593. }
  594. if (!querySelectorAll_()) {
  595. count++;
  596. } else {
  597. success(ele);
  598. clearInterval(interval);
  599. }
  600. }, 50);
  601. }
  602. });
  603. },
  604. isMobileDevice: function () {
  605. return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
  606. navigator.userAgent
  607. );
  608. },
  609. };
  610. let isMobileDevice = kitty_utils.isMobileDevice();
  611. function kitty_hjPicEdcoder() {
  612. var e = "ABCD*EFGHIJKLMNOPQRSTUVWX#YZabcdefghijklmnopqrstuvwxyz1234567890",
  613. t =
  614. ((this.encode = function (i) {
  615. var a,
  616. n,
  617. o,
  618. r,
  619. s,
  620. c,
  621. l = "",
  622. d = 0;
  623. for (i = t(i); d < i.length; )
  624. (o = (a = i.charCodeAt(d++)) >> 2),
  625. (r = ((3 & a) << 4) | ((a = i.charCodeAt(d++)) >> 4)),
  626. (s = ((15 & a) << 2) | ((n = i.charCodeAt(d++)) >> 6)),
  627. (c = 63 & n),
  628. isNaN(a) ? (s = c = 64) : isNaN(n) && (c = 64),
  629. (l = l + e.charAt(o) + e.charAt(r) + e.charAt(s) + e.charAt(c));
  630. return l;
  631. }),
  632. (this.decode = function (t) {
  633. var a,
  634. n,
  635. o,
  636. r,
  637. s,
  638. c,
  639. l = "",
  640. d = 0;
  641. for (t = t.replace(/[^A-Za-z0-9\*\#]/g, ""); d < t.length; )
  642. (o = e.indexOf(t.charAt(d++))),
  643. (a =
  644. ((15 & (r = e.indexOf(t.charAt(d++)))) << 4) |
  645. ((s = e.indexOf(t.charAt(d++))) >> 2)),
  646. (n = ((3 & s) << 6) | (c = e.indexOf(t.charAt(d++)))),
  647. (l += String.fromCharCode((o << 2) | (r >> 4))),
  648. 64 != s && (l += String.fromCharCode(a)),
  649. 64 != c && (l += String.fromCharCode(n));
  650. return i(l);
  651. }),
  652. function (e) {
  653. e = e.replace(/\r\n/g, "\n");
  654. for (var t = "", i = 0; i < e.length; i++) {
  655. var a = e.charCodeAt(i);
  656. a < 128
  657. ? (t += String.fromCharCode(a))
  658. : (t =
  659. 127 < a && a < 2048
  660. ? (t += String.fromCharCode((a >> 6) | 192)) +
  661. String.fromCharCode((63 & a) | 128)
  662. : (t =
  663. (t += String.fromCharCode((a >> 12) | 224)) +
  664. String.fromCharCode(((a >> 6) & 63) | 128)) +
  665. String.fromCharCode((63 & a) | 128));
  666. }
  667. return t;
  668. }),
  669. i = function (e) {
  670. for (var t, i, a = "", n = 0, o = 0; n < e.length; )
  671. (t = e.charCodeAt(n)) < 128
  672. ? ((a += String.fromCharCode(t)), n++)
  673. : 191 < t && t < 224
  674. ? ((o = e.charCodeAt(n + 1)),
  675. (a += String.fromCharCode(((31 & t) << 6) | (63 & o))),
  676. (n += 2))
  677. : ((o = e.charCodeAt(n + 1)),
  678. (i = e.charCodeAt(n + 2)),
  679. (a += String.fromCharCode(
  680. ((15 & t) << 12) | ((63 & o) << 6) | (63 & i)
  681. )),
  682. (n += 3));
  683. return a;
  684. };
  685. }
  686. let kitty_topicData = null
  687. function kitty_coverAddContent(innerhtml) {
  688. kitty_utils.getElement(".kitty_coverInnerBox").then((ele) => {
  689. let element = ele[0];
  690. let p = document.createElement("p");
  691. p.innerHTML = innerhtml;
  692. element.append(p);
  693. });
  694. }
  695. // 请求拦截
  696. function kitty_xhrIntercept() {
  697. let xhrOpen = XMLHttpRequest.prototype.open;
  698. XMLHttpRequest.prototype.open = function (method, url, async) {
  699. if (location.href.includes("post/details?pid")) {
  700. if (url.includes("hjstore/images")) {
  701. kitty_cacheImgs(method, url, this);
  702. }
  703. const locationParams = new URLSearchParams(location.search);
  704. const pid = locationParams.get("pid");
  705. if (url.includes("api/topic/" + pid)) {
  706. let kitty_topicDataTarget = {
  707. hasVideo: false,
  708. hasAudio: false,
  709. hasPic: false,
  710. saleType: 0, // 0:不出售 1:金币 2:钻石
  711. vipLimit: 0, // 0:不需要vip 1:需要vip1级 2:需要vip2级 3:...
  712. picsList: [],
  713. audsList: [],
  714. videoData: null,
  715. isFree: false,
  716. topicId: 0,
  717. imageInserted: [],
  718. catchedImgs: null,
  719. wholeM3u8Url: null,
  720. wholeM3u8UrlType: "",
  721. picDomList: [],
  722. topicDataSetOver: false,
  723. createTime: "",
  724. isH5: isMobileDevice,
  725. runHref: "",
  726. codeList: null,
  727. };
  728. kitty_topicData = new Proxy(kitty_topicDataTarget, {
  729. get: (target, key, proxy) => {
  730. return target[key];
  731. },
  732. set: (target, key, value, proxy) => {
  733. if (target[key] !== value) {
  734. target[key] = value;
  735. if (key == "topicDataSetOver") {
  736. kitty_topicDataSetOver();
  737. }
  738. if (key == "wholeM3u8Url") {
  739. kitty_insertVideoDom();
  740. }
  741. }
  742. return true;
  743. },
  744. });
  745. }
  746. let onreadystatechange_ = this.onreadystatechange;
  747. this.onreadystatechange = function () {
  748. if (this.readyState == 4 && this.status == 200) {
  749. kitty_xhrResponseProcess(method, url, this);
  750. }
  751. if (onreadystatechange_) {
  752. onreadystatechange_();
  753. }
  754. };
  755. if (isMobileDevice) {
  756. // 手机端
  757. let onload_ = this.onload;
  758. this.onload = function () {
  759. kitty_xhrResponseProcess(method, url, this);
  760. if (onload_) {
  761. onload_();
  762. }
  763. };
  764. }
  765. }
  766. return xhrOpen.call(this, method, url, async);
  767. };
  768. }
  769. // 请求前处理
  770. function kitty_cacheImgs(method, url, xhr) {
  771. if (url.includes("hjstore/images")) {
  772. if (kitty_topicData.hasPic) {
  773. if (!kitty_topicData.catchedImgs) {
  774. kitty_topicData.catchedImgs = [];
  775. }
  776. let find = kitty_topicData.catchedImgs.find((item) => {
  777. return item.url == url;
  778. });
  779. if (!find) {
  780. kitty_topicData.catchedImgs.push({
  781. url: url,
  782. data: null,
  783. });
  784. }
  785. }
  786. }
  787. }
  788. // 请求后返回值处理
  789. function kitty_xhrResponseProcess(method, url, xhr) {
  790. const locationParams = new URLSearchParams(location.search);
  791. const pid = locationParams.get("pid");
  792. if (url.includes("api/topic/" + pid)) {
  793. let responseText = JSON.parse(xhr.responseText);
  794. let decodeData = kitty_utils.hjApiDecode(responseText.data);
  795. let newData = kitty_utils.hjApiEecode(kitty_setTopicData(decodeData));
  796. responseText.data = newData;
  797. let jsonRes = JSON.stringify(responseText);
  798. Object.defineProperty(xhr, "responseText", {
  799. get: () => {
  800. return jsonRes;
  801. },
  802. });
  803. Object.defineProperty(xhr, "response", {
  804. get: () => {
  805. return jsonRes;
  806. },
  807. });
  808. }
  809. if (url.includes("hjstore/images")) {
  810. let findCatchedImg = kitty_topicData.catchedImgs.find((item) => {
  811. return item.url == url;
  812. });
  813. if (findCatchedImg) {
  814. if (!findCatchedImg.data) {
  815. findCatchedImg.data = new kitty_hjPicEdcoder().decode(
  816. xhr.responseText
  817. );
  818. let findImgDom = kitty_topicData.picDomList.find((item) => {
  819. return item.dataset.imgUrl == url;
  820. });
  821. if (findImgDom) {
  822. findImgDom.src = findCatchedImg.data;
  823. }
  824. }
  825. }
  826. }
  827. }
  828. // /api/topic/id 接口返回值处理
  829. function kitty_setTopicData(data) {
  830. const locationParams = new URLSearchParams(location.search);
  831. const pid = locationParams.get("pid");
  832. kitty_topicData.topicId = pid;
  833. if (data.sale) {
  834. // 付费类型
  835. kitty_topicData.saleType = data.sale.money_type;
  836. }
  837. let hasAudio = false;
  838. let hasVideo = false;
  839. let hasPic = false;
  840. // 附件处理
  841. data.attachments.forEach((item) => {
  842. if (item.category == "images") {
  843. hasPic = true;
  844. kitty_topicData.picsList.push(item.remoteUrl);
  845. } else if (item.category == "video") {
  846. hasVideo = true;
  847. kitty_topicData.videoData = item;
  848. } else if (item.category == "audio") {
  849. hasAudio = true;
  850. kitty_topicData.audsList.push(item.remoteUrl);
  851. }
  852. });
  853. if (hasPic) {
  854. kitty_topicData.hasPic = true;
  855. }
  856. if (hasVideo) {
  857. kitty_topicData.hasVideo = true;
  858. }
  859. if (hasAudio) {
  860. kitty_topicData.hasAudio = true;
  861. }
  862. if (data.node) {
  863. kitty_topicData.vipLimit = data.node.vipLimit;
  864. // 去除viplimit弹框
  865. data.node.vipLimit = 0;
  866. }
  867. // 是否是免费
  868. if (!data.sale && kitty_topicData.vipLimit == 0) {
  869. kitty_topicData.isFree = true;
  870. }
  871. kitty_topicData.createTime = data.createTime;
  872. kitty_topicData.topicDataSetOver = true;
  873. //delete data.content
  874. return data;
  875. }
  876. // 如果是vip内容
  877. function kitty_topicViplimit() {
  878. if (kitty_topicData.vipLimit > 0) {
  879. if (kitty_topicData.hasPic) {
  880. let count = 0;
  881. let interval = setInterval(() => {
  882. if (count >= kitty_topicData.picsList.length) {
  883. return clearInterval(interval);
  884. }
  885. let item = kitty_topicData.picsList[count];
  886. let x = new XMLHttpRequest();
  887. x.open("get", item);
  888. x.send();
  889. count++;
  890. }, 500);
  891. }
  892. }
  893. }
  894. // 插入图片
  895. function kitty_insertPayImgsDom(url) {
  896. kitty_utils.getElement(".kitty_coverInnerBox").then((ele) => {
  897. let element = ele[0];
  898. kitty_topicData.picsList.forEach((url, index) => {
  899. if (!kitty_topicData.imageInserted.includes(url)) {
  900. let p = document.createElement("p");
  901. let img = document.createElement("img");
  902. img.className = "kitty_topicImg";
  903. img.src = "/images/common/project/loading.gif";
  904. img.title = "点击查看大图";
  905. img.dataset.imgUrl = url;
  906. img.addEventListener("click", function () {
  907. img.classList.toggle("imgwidth100");
  908. });
  909. p.appendChild(img);
  910. element.appendChild(p);
  911. kitty_topicData.imageInserted.push(url);
  912. kitty_topicData.picDomList.push(img);
  913. }
  914. });
  915. });
  916. }
  917. function kitty_getVideoUrl() {
  918. if (kitty_topicData.isFree) {
  919. return;
  920. }
  921. if (kitty_topicData.hasVideo) {
  922. kitty_coverAddContent("正在获取视频信息,请稍后...");
  923. fetch("https://baixiaodu.uk/api/hj/findu8", {
  924. method: "post",
  925. headers: {
  926. "Content-Type": "application/json",
  927. },
  928. body: JSON.stringify({
  929. pid: parseInt(kitty_topicData.topicId),
  930. }),
  931. })
  932. .then((res) => res.json())
  933. .then((res) => {
  934. if (res.success) {
  935. kitty_topicData.wholeM3u8UrlType = res.data.type;
  936. kitty_topicData.wholeM3u8Url = res.data.url;
  937. } else {
  938. kitty_logListPush(res.message, "warning");
  939. kitty_coverAddContent(res.message);
  940. kitty_showPanel();
  941. }
  942. });
  943. }
  944. }
  945. // 插入视频
  946. function kitty_insertVideoDom() {
  947. if (kitty_topicData.wholeM3u8UrlType == "page") {
  948. kitty_coverAddContent(
  949. `视频需至haijiao.ai观看: <a target='_blank' href="${kitty_topicData.wholeM3u8Url}">点此观看</a>`
  950. );
  951. return;
  952. }
  953. kitty_coverAddContent(
  954. `请点击观看视频: <a target='_blank' href="https://file.kittymao.xyz/file/other/m3u8Player.html?url=${kitty_topicData.wholeM3u8Url}">点此播放</a>`
  955. );
  956. }
  957. // 插入音频
  958. function kitty_insertAudioDom() {
  959. kitty_topicData.audsList.forEach((item) => {
  960. let audio = document.createElement("audio");
  961. audio.controls = true;
  962. let source = document.createElement("source");
  963. source.type = "audio/mpeg";
  964. source.src = item;
  965. audio.append(source);
  966. kitty_utils.getElement(".kitty_coverInnerBox").then((res) => {
  967. res[0].append(audio);
  968. });
  969. });
  970. }
  971. function KittyCover() {
  972. this.createCover = function () {
  973. let topicType = `${kitty_topicData.isFree ? "免费" : ""}${
  974. kitty_topicData.vipLimit > 0 ? "vip" : ""
  975. }${kitty_topicData.saleType == 1 ? "金币" : ""}${
  976. kitty_topicData.saleType == 2 ? "钻石" : ""
  977. }`;
  978. let coverDiv = document.querySelector(".kitty_coverBox")
  979. let cover = coverDiv?coverDiv:document.createElement("div");
  980. cover.className = "kitty_coverBox kitty_coverBoxHidden";
  981. cover.innerHTML = `<div class="kitty_coverInnerBox">
  982. <div class="kitty_operateCover">
  983. <img class="kitty_closeCover" src="${kitty_icons.close}"></img>
  984. <img class="kitty_toTop" src="${kitty_icons.toTop}"></img>
  985. <img class="kitty_toBottom" src="${kitty_icons.toTop}"></img>
  986. </div>
  987. <h2>海角社区脚本</h2>
  988. <p>这个帖是${topicType}帖,脚本已经获取${topicType}内容,包含${
  989. kitty_topicData.hasAudio ? "音频 " : ""
  990. }${kitty_topicData.hasPic ? "图片 " : ""}${
  991. kitty_topicData.hasVideo ? "视频 " : ""
  992. }</p>
  993. <p>点击图片可放大, 再次点击可缩小</p>
  994. </div>`;
  995. if (!coverDiv) {
  996. document.body.append(cover);
  997. }
  998. kitty_utils.getElement(".kitty_closeCover").then((res) => {
  999. res[0].addEventListener("click", this.hiddenCover);
  1000. });
  1001. kitty_utils.getElement(".kitty_toTop").then((res) => {
  1002. res[0].addEventListener("click", function () {
  1003. kitty_utils.getElement(".kitty_coverInnerBox").then((box) => {
  1004. box[0].scrollTop = 0;
  1005. });
  1006. });
  1007. });
  1008. kitty_utils.getElement(".kitty_toBottom").then((res) => {
  1009. res[0].addEventListener("click", function () {
  1010. kitty_utils.getElement(".kitty_coverInnerBox").then((box) => {
  1011. box[0].scrollTop = box[0].scrollHeight;
  1012. });
  1013. });
  1014. });
  1015. kitty_utils.getElement("head").then((res) => {
  1016. let style = document.createElement("style");
  1017. style.innerHTML = `
  1018. .kitty_coverInnerBox img.imgwidth100 {
  1019. width: 100%;
  1020. }
  1021. .kitty_coverBoxHidden {
  1022. display:none;
  1023. }.kitty_coverBoxShow {
  1024. display:block;
  1025. }
  1026. .kitty_coverBox {
  1027. width: 100vw;
  1028. height: 100vh;
  1029. position: fixed;
  1030. left: 0;
  1031. top: 0;
  1032. background: rgba(0,0,0, 0.5);
  1033. z-index: 99999;
  1034. }
  1035. .kitty_coverInnerBox {
  1036. position: relative;
  1037. margin: 0 auto;
  1038. width: ${isMobileDevice ? "100%" : "50%"};
  1039. min-width: 300px;
  1040. height: 100vh;
  1041. overflow-y: scroll;
  1042. text-align:center;
  1043. background-color: white;
  1044. padding-bottom: 100px;
  1045. }
  1046. .kitty_coverInnerBox p {
  1047. padding: 10px;
  1048. margin: 10px;
  1049. font-size: 16px;
  1050. }
  1051. .kitty_closeCover {
  1052. margin-bottom: 100px;
  1053. }
  1054. .kitty_operateCover {
  1055. position: sticky;
  1056. left: 100%;
  1057. width: 50px;
  1058. top: 20px;
  1059. height: 30px;
  1060. }
  1061. .kitty_coverInnerBox img {
  1062. cursor: pointer;
  1063. width: 250px;
  1064. }
  1065. .kitty_coverInnerBox .kitty_operateCover img {
  1066. width: 30px;
  1067. display: block;
  1068. }
  1069. .kitty_toBottom {
  1070. transform: rotate(180deg);
  1071. margin-top: 20px;
  1072. }
  1073. `;
  1074. res[0].append(style);
  1075. });
  1076. };
  1077. this.hiddenCover = function () {
  1078. kitty_utils.getElement(".kitty_coverBox").then((kitty_coverBox) => {
  1079. kitty_coverBox[0].classList.add("kitty_coverBoxHidden");
  1080. let audios = kitty_coverBox[0].querySelectorAll("audio");
  1081. audios.forEach((audio) => {
  1082. audio.pause();
  1083. });
  1084. let videos = kitty_coverBox[0].querySelectorAll("video");
  1085. videos.forEach((video) => {
  1086. video.pause();
  1087. });
  1088. });
  1089. };
  1090. this.showCover = function () {
  1091. kitty_utils.getElement(".kitty_coverBox").then((kitty_coverBox) => {
  1092. kitty_coverBox[0].classList.remove("kitty_coverBoxHidden");
  1093. });
  1094. };
  1095. }
  1096. function kitty_topicDataSetOver() {
  1097. let cover = new KittyCover();
  1098. cover.createCover();
  1099. kitty_logListPush(
  1100. `${
  1101. kitty_topicData.isFree
  1102. ? "<span class='kitty_contentGetOver'>这个帖子是免费的</span>"
  1103. : "<span class='kitty_contentGetOver' style='cursor:pointer;'>帖子内容获取完毕, 请点此查看</span>"
  1104. }`,
  1105. "success",
  1106. true
  1107. );
  1108. if (kitty_topicData.isFree) {
  1109. document.querySelector(".kitty_jiexiBtn").innerHTML = "免费";
  1110. } else {
  1111. document.querySelector(".kitty_jiexiBtn").innerHTML = "解析";
  1112. }
  1113. document
  1114. .querySelector(".kitty_jiexiBtn")
  1115. .addEventListener("click", function () {
  1116. if (!location.href.includes("post/details?pid")) {
  1117. document.querySelector(".kitty_jiexiBtn").innerHTML = "暂无";
  1118. return;
  1119. }
  1120. if (kitty_topicData.isFree) {
  1121. document.querySelector(".kitty_jiexiBtn").innerHTML = "免费";
  1122. } else {
  1123. document.querySelector(".kitty_jiexiBtn").innerHTML = "解析";
  1124. cover.showCover();
  1125. }
  1126. });
  1127. kitty_utils.getElement(".kitty_contentGetOver").then((ele) => {
  1128. ele[0].addEventListener("click", function () {
  1129. if (!location.href.includes("post/details?pid")) {
  1130. kitty_logListPush("没有帖子...", "warning");
  1131. return;
  1132. }
  1133. cover.showCover();
  1134. kitty_hiddenPanel();
  1135. });
  1136. });
  1137. if (kitty_topicData.vipLimit) {
  1138. kitty_topicViplimit();
  1139. }
  1140. if (kitty_topicData.hasPic) {
  1141. kitty_insertPayImgsDom();
  1142. }
  1143. if (kitty_topicData.hasAudio) {
  1144. kitty_insertAudioDom();
  1145. }
  1146. if (kitty_topicData.hasVideo) {
  1147. // 发送请求到kittymao
  1148. kitty_getVideoUrl();
  1149. } else {
  1150. kitty_coverAddContent(`<span style='color:red;'>这个帖子没有视频</span>`);
  1151. }
  1152. //cover.showCover();
  1153. }
  1154. function kitty_main() {
  1155. kitty_xhrIntercept();
  1156. }
  1157. function kitty_checkLogin() {
  1158. if (!kitty_isLogin()) {
  1159. let interval = setInterval(() => {
  1160. kitty_logListPush("没有登录海角账号,可能无法解析", "warning");
  1161. if (kitty_isLogin()) {
  1162. clearInterval(interval);
  1163. location.reload();
  1164. }
  1165. }, 1000);
  1166. return false;
  1167. } else {
  1168. kitty_logListPush("脚本运行成功,请尝试观看帖子", "success");
  1169. return true;
  1170. }
  1171. }
  1172. function kitty_isLogin() {
  1173. if (kitty_utils.getCookie("uid") && kitty_utils.getCookie("token")) {
  1174. return true;
  1175. } else {
  1176. return false;
  1177. }
  1178. }
  1179. function kitty_copyTextToClipboard(text) {
  1180. const textArea = document.createElement("textarea");
  1181. textArea.value = text;
  1182. document.body.appendChild(textArea);
  1183. textArea.select();
  1184. document.execCommand("copy");
  1185. document.body.removeChild(textArea);
  1186. console.log("文本已复制到剪贴板");
  1187. }
  1188. function kitty_isRun() {
  1189. let run = false;
  1190. if (
  1191. document.querySelector("#kitty_vipPanel") ||
  1192. document.querySelector("#vipPanel")
  1193. ) {
  1194. run = true;
  1195. }
  1196. if (!run) {
  1197. console.log("panelInit");
  1198. kitty_vipPanelInit();
  1199. if (kitty_checkLogin()) {
  1200. console.log("login");
  1201. kitty_main();
  1202. } else {
  1203. kitty_showPanel();
  1204. }
  1205. }
  1206. }
  1207. kitty_isRun();
  1208. })();