qk文章资源共享|CSDN|知乎|专栏|会员文章|盐选|文件下载|CSDN积分

🐚🐚功能介绍🐚🐚:🔥csdn,去除广告🔥,🔥免登陆复制,查看全文🔥,控制登陆弹窗频次,文件下载,🔥解析csdn会员文章🔥,🔥超级会员文章🔥,知乎,🔥解析知乎盐选,专栏🔥

As of 2024-12-12. See the latest version.

  1. // ==UserScript==
  2. // @name qk文章资源共享|CSDN|知乎|专栏|会员文章|盐选|文件下载|CSDN积分
  3. // @namespace https://zsh5.qktk.online/
  4. // @version 0.0.4-beta
  5. // @icon data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMjAwMTA5MDQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIxMjgiIHZpZXdCb3g9IjAgMCAzODkgMzk1IiBzdHlsZT0iIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4NCjxnIGZpbGw9IiNGM0RCQzhGRiIgc3Ryb2tlPSIjRjNEQkM4RkYiPg0KPHBhdGggZD0iTSAxODIuNTAwIDQ0LjEwOSBDIDE2NS4zNTIgNDYuNTgwIDE0NC4xODUgNTUuNDMyIDEzMC4xNjQgNjUuOTk3IEMgMTExLjQwMiA4MC4xMzUgOTguMDk0IDEwMS4zNTAgOTIuNDYwIDEyNi4xMDQgQyA5MS4wNjUgMTMyLjIzNCA5MC42OTIgMTQxLjIxMiA5MC4yODMgMTc4LjU2NCBDIDg5Ljc5MyAyMjMuMjc4IDkwLjQ5OCAyNDEuMzU0IDkzLjExMyAyNTEuMTMxIEMgOTQuMjk0IDI1NS41NTAgOTQuMjEyIDI1NS45NjMgOTEuMDMxIDI2MS42MTUgQyA4MS4yMTkgMjc5LjA0NyA2OC44MzIgMjg5LjI4OCA1Mi4zNzMgMjkzLjU3NSBDIDQ1LjcwOSAyOTUuMzExIDQzLjU4OSAyOTYuOTI4IDQwLjc5MCAzMDIuNDEzIEMgMzcuOTkwIDMwNy45MDAgMzguNTYxIDMxOC4yNzcgNDEuOTM1IDMyMy4yMDAgQyA0Ni4wMTcgMzI5LjE1OCA1MC4zNjUgMzMxLjQyOSA1OC40NzMgMzMxLjgzOCBDIDY0LjE3NCAzMzIuMTI2IDY3LjA4NSAzMzEuNjkyIDcyLjgyNCAzMjkuNjk2IEMgODcuMDIyIDMyNC43NTggMTAzLjYyNSAzMTEuOTAzIDExMi4xNDcgMjk5LjI0OCBMIDExNS42NDYgMjk0LjA1MyAxMTkuNTczIDI5OC4xMjMgQyAxMzIuNTI2IDMxMS41NDcgMTUxLjg1NyAzMjEuNjExIDE3NC4wMDAgMzI2LjQ1NyBDIDE4NS43MzcgMzI5LjAyNiAyMDUuNjY5IDMyOS41NDkgMjE2LjkzNiAzMjcuNTgzIEMgMjIyLjEyNiAzMjYuNjc3IDIyNi44OTIgMzI1LjUwNCAyMjcuNTI4IDMyNC45NzcgQyAyMjguMTY0IDMyNC40NDkgMjI4LjkyMyAzMjQuMjU2IDIyOS4yMTUgMzI0LjU0OCBDIDIyOS41MDcgMzI0Ljg0MCAyMzIuNjIxIDMyMy45OTYgMjM2LjEzNiAzMjIuNjczIEMgMjUwLjg5MCAzMTcuMTIwIDI2My4zNjIgMzA5LjM5NiAyNzIuNDYwIDMwMC4xNzYgTCAyNzcuNDIwIDI5NS4xNTAgMjgwLjg4NiAzMDAuMzI1IEMgMjg4LjY3NSAzMTEuOTU1IDMwMi4xNTcgMzIyLjUxMSAzMTYuNTAwIDMyOC4yMTAgQyAzMjMuNDgzIDMzMC45ODQgMzI1LjcyOCAzMzEuMzk1IDMzNC4xNTUgMzMxLjQ0NCBDIDM0My40NTggMzMxLjQ5OCAzNDMuOTUyIDMzMS4zODggMzQ3LjY1NSAzMjguNDQyIEMgMzUyLjc3MyAzMjQuMzcyIDM1Ni4wMDAgMzE3Ljg5MiAzNTYuMDAwIDMxMS42ODkgQyAzNTYuMDAwIDMwMS45NjkgMzUwLjUzNiAyOTUuNTczIDMzOS4zMjUgMjkyLjE2NyBDIDMyNi45NzYgMjg4LjQxNyAzMTMuNjE5IDI3Ny41NTcgMzA2LjU4MCAyNjUuNTQ1IEwgMzAzLjgyMyAyNjAuODQyIDMwNS42NjIgMjUzLjY3MSBDIDMwNy4zNDcgMjQ3LjA5OCAzMDcuNDk5IDI0MS41MDAgMzA3LjQ4NyAxODYuNTAwIEwgMzA3LjQ3NCAxMjYuNTAwIDMwNC44MDUgMTE2Ljc5MiBDIDI5NC4wODggNzcuODA3IDI2MC44MzggNTAuMDkxIDIxNy41NjYgNDQuMDcyIEMgMjA4LjY2NSA0Mi44MzQgMTkxLjIxNiA0Mi44NTIgMTgyLjUwMCA0NC4xMDkgTSAyMTcuNDM0IDg0LjU5NCBDIDIzNy43NDMgODkuNTg2IDI1Mi44MzggMTA0LjQ4NSAyNTcuNDYzIDEyNC4xMDMgQyAyNTguNzA5IDEyOS4zOTAgMjU4Ljk3MyAxMzkuOTcyIDI1OC45ODUgMTg1LjA5MCBDIDI1OC45OTkgMjM1LjgyMCAyNTguODYzIDI0MC4yMTUgMjU3LjA2NSAyNDcuMjQ0IEMgMjUzLjY3NSAyNjAuNTAxIDI0Ni43NjMgMjcxLjI5NyAyMzYuNzM3IDI3OC45OTUgQyAyMzMuODU3IDI4MS4yMDcgMjMwLjkzOCAyODMuNDgwIDIzMC4yNTAgMjg0LjA0OCBDIDIyOS41NjMgMjg0LjYxNSAyMjkuMDAwIDI4NC44OTIgMjI5LjAwMCAyODQuNjY0IEMgMjI5LjAwMCAyODQuNDM1IDIyNS45NjMgMjg1LjM4MiAyMjIuMjUwIDI4Ni43NjcgQyAyMTIuOTkxIDI5MC4yMjMgMTk1LjY2OSAyOTEuMDE1IDE4NC4zMzkgMjg4LjUwMSBDIDE2Ny41MjcgMjg0Ljc3MSAxNTMuMzU1IDI3NC4zMDggMTQ2LjYwMiAyNjAuNjQxIEMgMTM5Ljc0OCAyNDYuNzcwIDEzOS41MDAgMjQ0LjA3MyAxMzkuNTAwIDE4My41MDAgQyAxMzkuNTAwIDEyMy41NzggMTM5LjUxNiAxMjMuNDA3IDE0Ni4zMzQgMTEwLjUxMyBDIDE1Mi4zMzkgOTkuMTU3IDE2Ny4yNjAgODcuNTQzIDE3OC41NzAgODUuNDIxIEMgMTgwLjQ1NyA4NS4wNjcgMTgyLjAwMCA4NC4zNTEgMTgyLjAwMCA4My44MzAgQyAxODIuMDAwIDgzLjMwOCAxODIuMzYxIDgzLjEwNSAxODIuODAyIDgzLjM3OCBDIDE4My4yNDMgODMuNjUwIDE4Ni43MzAgODMuNDk0IDE5MC41NTIgODMuMDMwIEMgMTk4Ljk0NCA4Mi4wMTMgMjA5LjQwNiA4Mi42MjEgMjE3LjQzNCA4NC41OTQgIi8+PC9nPg0KPC9zdmc+DQo=
  6. // @description 🐚🐚功能介绍🐚🐚:🔥csdn,去除广告🔥,🔥免登陆复制,查看全文🔥,控制登陆弹窗频次,文件下载,🔥解析csdn会员文章🔥,🔥超级会员文章🔥,知乎,🔥解析知乎盐选,专栏🔥
  7. // @author 佚名
  8. // @match *://*.blog.csdn.net/*
  9. // @match *://*.zhihu.com/*
  10. // @match *://download.csdn.net/*
  11. // @connect qktk.online
  12. // @support https://scriptcat.org/zh-CN/script-show-page/2474/issue
  13. // @supportUrl https://scriptcat.org/zh-CN/script-show-page/2474/issue
  14. // @antifeature membership
  15. // @license MIT
  16. // @require https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
  17. // @grant GM_addStyle
  18. // @grant unsafeWindow
  19. // @grant GM_xmlhttpRequest
  20. // @grant GM_getValue
  21. // @grant GM_setValue
  22. // @grant GM_deleteValue
  23. // ==/UserScript==
  24.  
  25. var __defProp = Object.defineProperty;
  26. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  27. var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  28. (function() {
  29. "use strict";
  30. GM_addStyle(`@font-face {
  31. font-family: "qkfont"; /* Project id 4739727 */
  32. src: url('data:font/woff2;base64,d09GMgABAAAAAATgAAsAAAAACegAAASRAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDHAqHHIYsATYCJAMQCwoABCAFhGcHQBusCMgOJQmdwADgCQFgBNVY2bO7T4iOQj6KHYER9zJELhqFi9BcPgrYiB/+Pe3NKM5vMpoOKpLWyaWZlR40+gx83Z/+2M/VicUtrumbl7KUPcT3Z6KYNo74Q4ImXhdJ4pYiRyiJBXYOgVqdfI1AvVWRNI8npucD01s8SgkW0xbMDuqxcUsi4gF9PaLM8EKtv1p6ahGPgA7ptuYHPMx/P/5bD32Sqiy408krCUJw+mPL55dalf8tQP6qsr8puHtCFTIWzywW1+YzF2iVrsXcUz82WNs2oDZMJfa67vHn+f//S9tVeWq5TRL8z4tqgacRmZuh7I5ZYzWJP+vVBH/mIzLSy9616ADiCADxCJiD45oluS7gNLecORTCMPepVw+09tObWvry+0qHwjKkINq2tW6lN7O5praoT7WepI+XOX1zRnrb8M6s9WazqF5gbVM1Hf1nZ+gH+HcD6f0D8E00E8lPBP2tLC4iGFAzOFxBX4t1PmdTzqbZ+WHWuUfRijwMuXT+fW4L58FRRupHWQNzQ4PW9+/X08jD8WIr99GjKKXmPHDngMr9ellIzR20bH1wScsmw/o7/RpxMGDUcLcPFL847e+/CQCntcspaGBbvnarvSG92Q6duyX9shtnbH9Zqemn66djp2vXO+hnWG1UZYgZ7edwzLaZbzV7a35GxHjJfBkrbs7rWWy5xPJovG/bCi5EViAQHjruQDvSMNj/wEvXm663wsGtqzSWNX008YsOJ9j6JQYm+AcE3rLsHTYZqgurW2Yy3BsQdkY2fGzZsWEkZsdrs+PZpusPbHsOn2+rTXxjaw6fUZOY8uG4yfjf4yNpDt4WpsfUaeD6+SsMbHRibAKz/sHAxiapiTF+WGNt7BNFkVE1OsmXrWK8KCzwN4xLdrStj2mKlIaLxeHSyD8RZlhh0//HfExT1ga/V1U+p62q4gKmgwvEZU7FjqtXOxY7ld2OMMMKmzPKnG6PXEKc7NgLYHaj+KEVQUEVofzPEWZYYZP8szkouc/gfZ1r7HPLD6tz0vt1PsNb28bgmMGY/jW80uIv1asesM3Y1te9Eatj1gyD63UQbsqwYRM2iA3BtgEEgMOWIh8gPXof5G1aC3/P3Xy7eGK23Cz8t37DRzPne73mX7LLrX8vq2P5M26spAAO/5fQa5TyAdpjC48sngNTvlwCCd3v39dPu5f78HWIRxNqddSQ1BiArNY4tTDnoUqDdahWawfqLUg4u0EHgpYodZjWDhBabYGk2TvIWl2iFuYjqNLtE1Rr9RfqnQqTyzWYDkEcifIoVAj5tVAiwJVY5KfybnNRUaWcRw41EZRUSbAOfTy9u31JqBIld3GEqkrkS1EYxEhcARPVu6FyOQ4JEpeiAspTTFFEqJcXNvYjngJcAeKQUDwUlBDEVwuSEMApYSk51f57uVAileR4SCEVSZFUbKbuIR+evAXUJI9SNO2ZTFapIuKLohYGwrTROAUocVsKJQ87OIgY30kKJUDxJN7QIoTyIjJM6vE8vk/x8i6BesFzS6TIUaJKzS2cJ5QoRToCOa5CtcWonAAAAAAA') format('woff2'),
  33. url('data:font/woff;base64,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') format('woff'),
  34. url('data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI8JEt2AAABjAAAAGBjbWFwuIgp+QAAAfwAAAGcZ2x5Zj1XHjUAAAOkAAADnGhlYWQqFkn4AAAA4AAAADZoaGVhB+ADhAAAALwAAAAkaG10eBAAAAAAAAHsAAAAEGxvY2ECpAFWAAADmAAAAAptYXhwARwAoQAAARgAAAAgbmFtZRCjPLAAAAdAAAACZ3Bvc3QM1qJOAAAJqAAAAEAAAQAAA4D/gABcBAAAAP//BAEAAQAAAAAAAAAAAAAAAAAAAAQAAQAAAAEAAPLGRaRfDzz1AAsEAAAAAADjewL9AAAAAON7Av0AAP+ABAEDgQAAAAgAAgAAAAAAAAABAAAABACVAA4AAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQEAAGQAAUAAAKJAswAAACPAokCzAAAAesAMgEIAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOYP6KYDgP+AAAAD3ACAAAAAAQAAAAAAAAAAAAAAAAACBAAAAAQAAAAEAAAABAAAAAAAAAUAAAADAAAALAAAAAQAAAFoAAEAAAAAAGIAAwABAAAALAADAAoAAAFoAAQANgAAAAgACAACAADmD+iR6Kb//wAA5g/okeim//8AAAAAAAAAAQAIAAgACAAAAAIAAQADAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAA0AAAAAAAAAAMAAOYPAADmDwAAAAIAAOiRAADokQAAAAEAAOimAADopgAAAAMAAAAAANYBVgHOAAAADgAA/4AEAAOBAAgAEQAaACMALAA1AD4ARwBQAFkAZwB2AIUAlAAAJTI2NCYiBhQWBxYyNjQmIgYUBxYyNjQmIgYUIxYyNjQmIgYUJxYyNjQmIgYUJxYyNjQmIgYUJxYyNjQmIgYUNxYyNjQmIgYUNxYyNjQmIgYUNxYyNjQmIgYUFx4BMzI2NCYjIgYHBhQXHgEyNjc2NCYnIgYHBhQXHgEyNjc2NCYjIgYHBhQXHgEyNjc2NCYnIgYHBhQDbQIEBAUDA4oECggICge1Bg8LCw8LwQcVDg4VDqkJGhISGhJwCx8WFh8WIQwlGRklGTUOKh0dKh2CES4hIS4huRMzJSU0JNAJGg0dKCgdDRoJFMIKHB0cChYrHw8cChaSCx4gHgsYLyIQHgsYSgwhIiAMGjMkESEMGXEEBgQEBgSZBAgLBwcLVgYMEAsLEAgPFg8PFlQJExsTExuWDBggFxcguA0bJhsbJrYPHyogICqNEiMxIyMxRhMnNiYmNhMKCys7KwsKFjtsCwwMCxdBLgENCxdBtgwNDQwaRjINDBlG5g0ODg0cSzYBDwwcSwACAAD/gAQBA4EAHABVAAAlBiIvAQcGIiY0PwEnJjQ2Mh8BNzYyFhQPARcWFBcOAS4BNz4BNTQnJicmIgcGBwYUFxYXFjMyNjc2HgEGBw4BIyInLgEnJjQ3PgE3NjIXHgEXFhUUBgLNBxUHnZ4HFA8Hnp4HDxQHnp0HFQ8InZ0I3gYUEQUFIyM/PWlr/GtpPT8/PWlrfk+TPggUDQIIRKNYaF9cjicoKCeOXF/QX1yOJygnxQcHoKAHDhUHoaEHFQ4HoKAHDhUHoaEHFVoJBQsUCTd8QX5raT0/Pz1pa/xraT0/NDAHAhEUBzY5KCeOXF/QX1yOJygoJ45cX2hIigAAAwAA/9UDqwMrABQAJABVAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYDFAYrASImPQE0NjsBMhYVEw4BDwEGHQEUBisBIiY9ATQ2PwE+AT0BNCYHIyIGHQEUBisBIiY9ATQ+ATsBMh4BFQIAdGNhODs7OGFj6GNhODs7OGFjSQ0JKgkNDQkqCQ17AS8mJQQMCSEIDR8YKQ4SHRRWExwNCSAJDSI4IVYhOCIDKzs4YWPoY2E4Ozs4YWPoY2E4O/1qCQwMCSsJDAwJASgoQAwOAQQhCQwMCSEaKggNBhkPGBQdARwUFQkNDQkVITkhITkhAAAAAAASAN4AAQAAAAAAAAATAAAAAQAAAAAAAQAIABMAAQAAAAAAAgAHABsAAQAAAAAAAwAIACIAAQAAAAAABAAIACoAAQAAAAAABQALADIAAQAAAAAABgAIAD0AAQAAAAAACgArAEUAAQAAAAAACwATAHAAAwABBAkAAAAmAIMAAwABBAkAAQAQAKkAAwABBAkAAgAOALkAAwABBAkAAwAQAMcAAwABBAkABAAQANcAAwABBAkABQAWAOcAAwABBAkABgAQAP0AAwABBAkACgBWAQ0AAwABBAkACwAmAWNDcmVhdGVkIGJ5IGljb25mb250aWNvbmZvbnRSZWd1bGFyaWNvbmZvbnRpY29uZm9udFZlcnNpb24gMS4waWNvbmZvbnRHZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuaHR0cDovL2ZvbnRlbGxvLmNvbQBDAHIAZQBhAHQAZQBkACAAYgB5ACAAaQBjAG8AbgBmAG8AbgB0AGkAYwBvAG4AZgBvAG4AdABSAGUAZwB1AGwAYQByAGkAYwBvAG4AZgBvAG4AdABpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG4AZgBvAG4AdABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAECAQMBBAEFAAdsb2FkaW5nBWNsb3NlBGhlbHAAAA==') format('truetype');
  35. }
  36.  
  37. .iconfont {
  38. font-family: "qkfont" !important;
  39. font-size: 16px;
  40. font-style: normal;
  41. -webkit-font-smoothing: antialiased;
  42. -moz-osx-font-smoothing: grayscale;
  43. }
  44.  
  45. .icon-loading:before {
  46. content: "\\e891";
  47. }
  48.  
  49. .icon-close:before {
  50. content: "\\e60f";
  51. }
  52.  
  53. .icon-help:before {
  54. content: "\\e8a6";
  55. }
  56.  
  57. .mb8,
  58. #remuneration,
  59. #asideWriteGuide,
  60. #asideAds,
  61. #asideNewNps,
  62. #recommendNps,
  63. #footerRightAds,
  64. #blogExtensionBox,
  65. #dmp_ad_58,
  66. .toolbar-btns .toolbar-btn:not(.toolbar-btn-login),
  67. .programmer1Box,
  68. #recommendAdBox,
  69. .passport-login-tip-container,
  70. .toolbar-advert,
  71. .hide-aside,
  72. .tool-active-list {
  73. display: none !important;
  74. }
  75.  
  76. .list-type-box {
  77. padding: 0px 4px;
  78. background: #21940d;
  79. border-radius: 2px;
  80. color: #fff;
  81. font-weight: 500;
  82. font-size: 12px;
  83. margin-right: 5px;
  84. }
  85.  
  86. #content_views pre,
  87. #content_views pre code {
  88. -webkit-user-select: unset;
  89. user-select: unset;
  90. }
  91.  
  92. .logo-icon svg {
  93. width: 1em;
  94. height: 1em;
  95. vertical-align: text-bottom;
  96. }
  97.  
  98. .qk-openvippay {
  99. -ms-flex-negative: 0;
  100. flex-shrink: 0;
  101. width: 220px;
  102. height: 40px;
  103. border-radius: 20px;
  104. border: 1px solid #fc5531;
  105. display: inline-block;
  106. text-align: center;
  107. line-height: 38px;
  108. color: #fc5531;
  109. font-size: 16px;
  110. font-weight: 600;
  111. position: relative;
  112. background: #fff;
  113. cursor: pointer;
  114. }
  115.  
  116. @keyframes loading {
  117. form {
  118. transform: rotate(0deg);
  119. }
  120. to {
  121. transform: rotate(360deg);
  122. }
  123. }
  124.  
  125. .icon-loading {
  126. display: none;
  127. }
  128.  
  129. .btn-loading {
  130. position: relative;
  131. }
  132.  
  133. .btn-loading:before {
  134. content: '';
  135. position: absolute;
  136. top: 0;
  137. left: 0;
  138. right: 0;
  139. bottom: 0;
  140. background: rgba(0, 0, 0, 0.55);
  141. border-radius: 20px;
  142. }
  143.  
  144. .btn-loading .icon-loading {
  145. position: absolute;
  146. display: block;
  147. left: 50%;
  148. top: 0;
  149. color: #f2f2f2;
  150. animation: 0.6s loading linear infinite;
  151. }
  152.  
  153. .qk-toast {
  154. position: fixed;
  155. left: 50%;
  156. top: 50%;
  157. transform: translate(-50%, -50%);
  158. max-width: 500px;
  159. padding: 6px 10px;
  160. font-size: 14px;
  161. background: rgba(0, 0, 0, 0.6);
  162. color: #fff;
  163. border-radius: 4px;
  164. box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  165. z-index: 999;
  166. }
  167.  
  168. .qk-toast.error {
  169. background: #f5222dd6;
  170. box-shadow: 0 0 10px #f5222d23;
  171. }
  172.  
  173. @media screen and (max-width: 1200px) {
  174. .blog_container_aside {
  175. display: none;
  176. }
  177. .nodata .container main {
  178. width: 100%;
  179. }
  180. }
  181. .qk-dialog-container .close {
  182. position: absolute;
  183. top: 6px;
  184. right: 8px;
  185. font-size: 20px;
  186. line-height: 1;
  187. cursor: pointer;
  188. color: #767676;
  189. z-index: 1;
  190. }
  191. .qk-dialog-container .login-form {
  192. position: absolute;
  193. width: 280px;
  194. padding: 24px;
  195. top: 8px;
  196. right: 18px;
  197. border: 1px solid rgba(204, 204, 204, 0.212);
  198. background-color: #f5f5f5;
  199. color: #1a1a1a;
  200. border-radius: 4px;
  201. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.18);
  202. }
  203. .qk-dialog-container .login-form .tb {
  204. margin-top: 14px;
  205. }
  206. .qk-dialog-container h2 {
  207. font-size: 24px;
  208. margin: 0.83em 0;
  209. }
  210. .qk-dialog-container .notify {
  211. position: absolute;
  212. top: 0;
  213. left: 0;
  214. right: 0;
  215. height: 32px;
  216. line-height: 32px;
  217. background-color: #4b4e7d;
  218. color: #fff;
  219. text-align: center;
  220. font-size: 14px;
  221. border-top-left-radius: 4px;
  222. border-top-right-radius: 4px;
  223. transition: all 0.25s;
  224. }
  225. .qk-dialog-container .notify.error {
  226. background-color: #f44336;
  227. }
  228. .qk-dialog-container .notify.success {
  229. background-color: #4caf50;
  230. }
  231. .qk-dialog-container .notify.info {
  232. background-color: #2196f3;
  233. }
  234. .qk-dialog-container .notify.warning {
  235. background-color: #ff9800;
  236. }
  237. .qk-dialog-container .row {
  238. display: flex;
  239. }
  240. .qk-dialog-container .action-btns {
  241. margin-top: 8px;
  242. }
  243. .qk-dialog-container .action-btns .jx {
  244. display: none;
  245. }
  246. .qk-dialog-container .tb .row {
  247. border-top: 1px solid #616161;
  248. border-bottom: 1px solid #616161;
  249. margin-top: -1px;
  250. }
  251. .qk-dialog-container .tb .row .label {
  252. width: 80px;
  253. flex-shrink: 0;
  254. padding: 8px 6px;
  255. background-color: #bdbdbd;
  256. }
  257. .qk-dialog-container .tb .row .value {
  258. padding: 8px 6px;
  259. }
  260. .qk-dialog-container button {
  261. border-radius: 4px;
  262. border: none;
  263. height: 32px;
  264. line-height: 30px;
  265. text-align: center;
  266. font-weight: 500;
  267. font-family: inherit;
  268. background-color: #3564bb;
  269. color: rgba(255, 255, 255, 0.87);
  270. cursor: pointer;
  271. transition: all 0.25s;
  272. }
  273. .qk-dialog-container button:disabled {
  274. opacity: 0.5;
  275. }
  276. .qk-dialog-container button:hover {
  277. background-color: #1f4996;
  278. }
  279. .qk-dialog-container .form-item {
  280. flex: 1;
  281. margin-bottom: 14px;
  282. }
  283. .qk-dialog-container .form-item button {
  284. width: 100%;
  285. letter-spacing: 1em;
  286. }
  287. .qk-dialog-container .input_wrapper {
  288. display: flex;
  289. height: 32px;
  290. border: 1px solid #d3d3d3;
  291. background-color: transparent;
  292. border-radius: 4px;
  293. }
  294. .qk-dialog-container .input_wrapper input {
  295. flex: 1;
  296. width: 100%;
  297. padding: 0 8px;
  298. color: inherit;
  299. border: none;
  300. outline: none;
  301. background-color: transparent;
  302. }
  303. .qk-dialog-container .code-send {
  304. width: 100px;
  305. margin-left: 8px;
  306. letter-spacing: 0;
  307. }
  308. .qk-dialog-container .hint {
  309. font-size: 12px;
  310. text-align: center;
  311. }
  312. .qk-dialog-container .hint .span-btn {
  313. margin-left: 0;
  314. }
  315. .qk-dialog-container .hint .temp {
  316. display: none;
  317. }
  318. .qk-dialog-container .span-btn {
  319. color: #535bf2;
  320. border: 1px dashed #535bf2;
  321. border-radius: 4px;
  322. padding: 2px 4px;
  323. cursor: pointer;
  324. font-size: 12px;
  325. margin-left: 6px;
  326. }
  327. .qk-dialog-container .span-btn:hover {
  328. opacity: 0.7;
  329. }
  330. .qk-dialog-container .to-buy {
  331. display: none;
  332. }
  333. .spirit-qk-icon {
  334. position: fixed;
  335. right: -10px;
  336. top: 50px;
  337. width: 44px;
  338. height: 34px;
  339. display: flex;
  340. padding: 6px;
  341. align-items: center;
  342. box-sizing: border-box;
  343. background: linear-gradient(140.91deg, #6dc15e 12.61%, #1c7f0a 76.89%);
  344. border-top-left-radius: 17px;
  345. border-bottom-left-radius: 17px;
  346. cursor: pointer;
  347. transition: all 0.3s ease-in-out;
  348. color: white;
  349. opacity: 0.5;
  350. z-index: 9999;
  351. }
  352. .spirit-qk-icon svg {
  353. width: 24px;
  354. height: 24px;
  355. transition: all 0.3s ease-in-out;
  356. }
  357. .spirit-qk-icon:hover {
  358. opacity: 1;
  359. transform: translateX(-10px);
  360. }
  361. .spirit-qk-icon:hover svg {
  362. width: 28px;
  363. height: 28px;
  364. }
  365. .qk-dialog-container {
  366. position: fixed;
  367. top: 0;
  368. width: 100vw;
  369. z-index: 9999;
  370. }
  371. .qk-dialog-container .mask {
  372. position: fixed;
  373. top: 0;
  374. left: 0;
  375. right: 0;
  376. bottom: 0;
  377. background: rgba(0, 0, 0, 0.5);
  378. }
  379. .qk-dialog-container .modal {
  380. position: fixed;
  381. left: 50%;
  382. top: 50%;
  383. transform: translate(-50%, -50%);
  384. min-height: 200px;
  385. background-color: white;
  386. border: 1px solid rgba(204, 204, 204, 0.4);
  387. border-radius: 4px;
  388. margin: auto;
  389. padding: 24px;
  390. display: flex;
  391. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  392. }
  393. .qk-dialog-container .modal .left {
  394. flex: 1;
  395. min-width: 250px;
  396. }
  397. .qk-dialog-container .modal .right {
  398. position: relative;
  399. margin-left: 30px;
  400. text-align: center;
  401. }
  402. .qk-dialog-container .modal .right::before {
  403. content: '';
  404. position: absolute;
  405. display: block;
  406. top: 0;
  407. bottom: 0;
  408. left: -15px;
  409. width: 0;
  410. border-left: 1px dashed #a8a8a854;
  411. }
  412. .qk-dialog-container .modal .right .title {
  413. margin: 12px;
  414. }
  415. .qk-dialog-container .modal .right .title i {
  416. color: #999;
  417. margin-left: 4px;
  418. }
  419. .qk-dialog-container .modal .right .goods-qr {
  420. height: 150px;
  421. display: block;
  422. line-height: 150px;
  423. background-color: #f5f5f5;
  424. border: 1px solid #e5e5e5;
  425. border-radius: 4px;
  426. opacity: 1;
  427. text-align: center;
  428. }
  429. .qk-dialog-container .modal .tip {
  430. font-size: 12px;
  431. color: #999;
  432. }
  433. .agreement-root {
  434. position: fixed;
  435. top: 50%;
  436. left: 50%;
  437. width: 480px;
  438. max-width: 80%;
  439. padding: 45px 0;
  440. border-radius: 10px;
  441. background-image: url(https://static.hitv.com/pc/img/601d3ee.png), url(https://static.hitv.com/pc/img/21b00eb.png);
  442. background-position: 0 0, 100% 280px;
  443. background-repeat: no-repeat;
  444. background-color: #fff;
  445. box-shadow: 0 0 80px rgba(0, 0, 0, 0.25);
  446. opacity: 1;
  447. transform: translate(-50%, -50%);
  448. z-index: 99999;
  449. }
  450. .title {
  451. color: #222;
  452. font-weight: 700;
  453. font-size: 28px;
  454. text-align: center;
  455. }
  456. .content {
  457. width: 100%;
  458. max-height: 70vh;
  459. margin: 35px auto 40px;
  460. overflow-x: hidden;
  461. overflow-y: auto;
  462. }
  463. .content p {
  464. margin: 0 50px 5px;
  465. color: #777;
  466. font-weight: 400;
  467. font-size: 13px;
  468. line-height: 22px;
  469. word-break: break-all;
  470. text-align: justify;
  471. }
  472. .btns {
  473. display: flex;
  474. margin: 0 20px;
  475. justify-content: space-evenly;
  476. }
  477. .btns button {
  478. width: 100px;
  479. height: 45px;
  480. border: none;
  481. border-radius: 25px;
  482. outline: none;
  483. color: #fff;
  484. background: #c2c1c1;
  485. font-weight: 700;
  486. font-size: 15px;
  487. line-height: 45px;
  488. transition: all 0.3s;
  489. cursor: pointer;
  490. }
  491. .btns button:hover {
  492. opacity: 0.7;
  493. }
  494. .btns .agree {
  495. width: 130px;
  496. background: #ffa000;
  497. background: linear-gradient(90deg, #ff5f00, #ffa000);
  498. }
  499. /*$vite$:1*/`);
  500. const $ = window.jQuery || unsafeWindow.jQuery;
  501. const template$2 = '<div class="login-form qk-user"><div class="close iconfont icon-close"></div><form><h2>用户登录</h2><div class="input_wrapper form-item"><input name="username" placeholder="请输入邮件地址" /></div><div id="code" class="row" style="display: none;"><div class="input_wrapper form-item"><input name="code" placeholder="请输入验证码" /></div><button type="button" class="code-send">获取验证码</button></div><div class="input_wrapper form-item"><input name="password" type="password" placeholder="请输入密码" /></div><div id="confirmP" class="input_wrapper form-item" style="display: none;"><input name="password_confirm" type="password" placeholder="请再次输入密码" /></div><div class="form-item"><button class="submit">登录</button></div><div class="hint"><span class="text">还没有账号?</span><span class="to-register-btn span-btn">立即注册</span><span class="temp">或<span class="span-btn c_temp">先不登录</span>,直接使用</span></div></form></div>';
  502. const infoHtm = '<div class="tb"><div class="row"><div class="label">会员类型</div><div class="value">{{ levelName }} <a class="span-btn to-buy" target="_blank">购买套餐</a></div></div><div class="row"><div class="label">到期时间</div><div class="value">{{ expirationDate }}</div></div><div class="row"><div class="label">下载次数</div><div class="value">{{ points }}<span class="span-btn to-active">添加</span></div></div><div class="action-btns"><span class="span-btn jx">解锁全文</span><!-- <span class="span-btn to-buy" target="_blank">购买套餐</span> --><!-- <span class="span-btn to-active" target="_blank">添加下载次数</span> --></div></div>';
  503. const template$1 = '<div class="qk-dialog-container"><div class="mask"></div><div class="dialog-body"></div></div>';
  504. class Dialog {
  505. constructor(opt = {}) {
  506. __publicField(this, "template", template$1);
  507. /** @type {JQuery<HTMLDivElement>} */
  508. __publicField(this, "$el");
  509. this.$el = $(this.template);
  510. opt.mask ? this.$el.find(".mask").show() : this.$el.find(".mask").hide();
  511. }
  512. append(dom) {
  513. this.$el.find(".dialog-body").append(dom);
  514. return this;
  515. }
  516. }
  517. function ajax(obj) {
  518. let success = obj.success;
  519. let error = obj.error;
  520. let p;
  521. if (!success) {
  522. p = new Promise((resolve, reject) => {
  523. success = resolve;
  524. error = reject;
  525. });
  526. }
  527. const headers = obj.headers || {};
  528. const token = getToken();
  529. headers.deviceId = deviceId();
  530. if (token) {
  531. headers.Authorization = token;
  532. }
  533. obj.headers = headers;
  534. obj.success = success;
  535. obj.error = error;
  536. {
  537. obj.responseType = obj.dataType || "json";
  538. if (obj.method === "GET") {
  539. const u = new URL(obj.url);
  540. for (const [k, v] of Object.entries(obj.data || {})) {
  541. u.searchParams.append(k, v);
  542. }
  543. delete obj.data;
  544. obj.url = u.href;
  545. } else {
  546. obj.data = JSON.stringify(obj.data);
  547. obj.headers["Content-Type"] = "application/json";
  548. }
  549. obj.onreadystatechange = (_a2) => {
  550. if (_a2.readyState === 4) {
  551. const { response, status } = _a2;
  552. if (status === 200) {
  553. success(response);
  554. } else {
  555. if (status === 401) {
  556. LoginModal.instance.showLogin("登录失效,请重新登录");
  557. }
  558. const err = new Error((response == null ? void 0 : response.message) || "网络错误");
  559. err.responseJSON = response;
  560. err.xhr = _a2;
  561. error(err);
  562. }
  563. }
  564. };
  565. }
  566. const _a = GM_xmlhttpRequest(obj);
  567. return p || _a;
  568. }
  569. const token_key = "token";
  570. function getToken() {
  571. return GM_getValue(token_key);
  572. }
  573. function setToken(token) {
  574. return GM_setValue(token_key, token);
  575. }
  576. function removeToken() {
  577. return GM_deleteValue(token_key);
  578. }
  579. function setStore(key, value, isQs = true) {
  580. return GM_setValue(key, value);
  581. }
  582. function getStore(key) {
  583. let val = GM_getValue(key);
  584. return val;
  585. }
  586. function removeStore(key) {
  587. return GM_deleteValue(key);
  588. }
  589. function deviceId() {
  590. let id = getStore("deviceId");
  591. if (!id) {
  592. id = "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(c) {
  593. const r = Math.random() * 16 | 0;
  594. const v = c === "x" ? r : r & 3 | 8;
  595. return v.toString(16);
  596. }).toUpperCase();
  597. setStore("deviceId", id);
  598. }
  599. return id;
  600. }
  601. function stringTemplate(template2, data) {
  602. return template2.replace(/\{\{(.+?)\}\}/g, (match, key) => data[key.trim()]);
  603. }
  604. const base = "https://zsapi.qktk.online/v1/api";
  605. function login(data) {
  606. return ajax({
  607. url: `${base}/user/login`,
  608. method: "POST",
  609. data
  610. });
  611. }
  612. function register(data) {
  613. return ajax({
  614. url: `${base}/user/register`,
  615. method: "POST",
  616. data
  617. });
  618. }
  619. function userTemp(data) {
  620. return ajax({
  621. url: `${base}/user/temp_user`,
  622. method: "POST",
  623. data
  624. });
  625. }
  626. function getUserInfo() {
  627. return ajax({
  628. url: `${base}/user/me`,
  629. method: "GET"
  630. });
  631. }
  632. function sendVerifyCode(data) {
  633. return ajax({
  634. url: `${base}/user/send_verification_code`,
  635. method: "POST",
  636. data
  637. });
  638. }
  639. function useCardkey(data) {
  640. return ajax({
  641. url: `${base}/user/useCardkey`,
  642. method: "POST",
  643. data
  644. });
  645. }
  646. function getArticle(data) {
  647. return ajax({
  648. url: `${base}/client/query`,
  649. data: { ...data, type: "plugin" },
  650. method: "GET"
  651. });
  652. }
  653. function getConfig(data) {
  654. return ajax({
  655. url: `${base}/config/get`,
  656. data,
  657. method: "GET"
  658. });
  659. }
  660. const loginSvg = '<?xml version="1.0" encoding="utf-8"?>\r\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">\r\n<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="389" height="395" viewBox="0 0 389 395" style="" preserveAspectRatio="xMidYMid meet">\r\n<g fill="currentColor" stroke="currentColor">\r\n<path d="M 182.500 44.109 C 165.352 46.580 144.185 55.432 130.164 65.997 C 111.402 80.135 98.094 101.350 92.460 126.104 C 91.065 132.234 90.692 141.212 90.283 178.564 C 89.793 223.278 90.498 241.354 93.113 251.131 C 94.294 255.550 94.212 255.963 91.031 261.615 C 81.219 279.047 68.832 289.288 52.373 293.575 C 45.709 295.311 43.589 296.928 40.790 302.413 C 37.990 307.900 38.561 318.277 41.935 323.200 C 46.017 329.158 50.365 331.429 58.473 331.838 C 64.174 332.126 67.085 331.692 72.824 329.696 C 87.022 324.758 103.625 311.903 112.147 299.248 L 115.646 294.053 119.573 298.123 C 132.526 311.547 151.857 321.611 174.000 326.457 C 185.737 329.026 205.669 329.549 216.936 327.583 C 222.126 326.677 226.892 325.504 227.528 324.977 C 228.164 324.449 228.923 324.256 229.215 324.548 C 229.507 324.840 232.621 323.996 236.136 322.673 C 250.890 317.120 263.362 309.396 272.460 300.176 L 277.420 295.150 280.886 300.325 C 288.675 311.955 302.157 322.511 316.500 328.210 C 323.483 330.984 325.728 331.395 334.155 331.444 C 343.458 331.498 343.952 331.388 347.655 328.442 C 352.773 324.372 356.000 317.892 356.000 311.689 C 356.000 301.969 350.536 295.573 339.325 292.167 C 326.976 288.417 313.619 277.557 306.580 265.545 L 303.823 260.842 305.662 253.671 C 307.347 247.098 307.499 241.500 307.487 186.500 L 307.474 126.500 304.805 116.792 C 294.088 77.807 260.838 50.091 217.566 44.072 C 208.665 42.834 191.216 42.852 182.500 44.109 M 217.434 84.594 C 237.743 89.586 252.838 104.485 257.463 124.103 C 258.709 129.390 258.973 139.972 258.985 185.090 C 258.999 235.820 258.863 240.215 257.065 247.244 C 253.675 260.501 246.763 271.297 236.737 278.995 C 233.857 281.207 230.938 283.480 230.250 284.048 C 229.563 284.615 229.000 284.892 229.000 284.664 C 229.000 284.435 225.963 285.382 222.250 286.767 C 212.991 290.223 195.669 291.015 184.339 288.501 C 167.527 284.771 153.355 274.308 146.602 260.641 C 139.748 246.770 139.500 244.073 139.500 183.500 C 139.500 123.578 139.516 123.407 146.334 110.513 C 152.339 99.157 167.260 87.543 178.570 85.421 C 180.457 85.067 182.000 84.351 182.000 83.830 C 182.000 83.308 182.361 83.105 182.802 83.378 C 183.243 83.650 186.730 83.494 190.552 83.030 C 198.944 82.013 209.406 82.621 217.434 84.594 "/></g>\r\n</svg>';
  661. const template = '<div class="modal"><div class="close iconfont icon-close"></div><div class="left"><h2>卡密兑换</h2><div class="input_wrapper form-item"><input name="key" placeholder="请输入激活码" /></div><div class="form-item"><button id="convert">兑换</button></div><div class="tip">这里加一些说明文字</div></div><div class="right"><p class="title">卡密获取<i class="iconfont icon-help" title="购买卡密"></i></p><a class="goods-url" target="_blank"><img src="" class="goods-qr" alt="点击去购买" title="点击去购买" /></a><div class="tip">请用淘宝App扫码购买</div></div></div>';
  662. class Notify {
  663. constructor(options) {
  664. __publicField(this, "template", `
  665. <div class="notify"></div>
  666. `);
  667. /** @type {JQuery<HTMLDivElement>} */
  668. __publicField(this, "$el");
  669. this.options = options;
  670. this.$el = $(this.template);
  671. this.$el.hide();
  672. }
  673. success(msg, delay) {
  674. this.$el.html(msg).attr("class", "notify success");
  675. if (delay === 0) {
  676. this.msg = msg;
  677. this.longMsgType = "success";
  678. }
  679. this.show(delay);
  680. }
  681. error(msg, delay) {
  682. this.$el.html(msg).attr("class", "notify error");
  683. if (delay === 0) {
  684. this.msg = msg;
  685. this.longMsgType = "error";
  686. }
  687. this.show(delay);
  688. }
  689. info(msg, delay) {
  690. this.$el.html(msg).attr("class", "notify info");
  691. if (delay === 0) {
  692. this.msg = msg;
  693. this.longMsgType = "info";
  694. }
  695. this.show(delay);
  696. }
  697. warning(msg, delay) {
  698. this.$el.html(msg).attr("class", "notify warning");
  699. if (delay === 0) {
  700. this.msg = msg;
  701. this.longMsgType = "warning";
  702. }
  703. this.show(delay);
  704. }
  705. close() {
  706. this.msg = "";
  707. this.longMsgType = "";
  708. this.$el.html("");
  709. clearTimeout(this.__timer);
  710. this.$el.hide();
  711. }
  712. show(delay = 2e3) {
  713. this.$el.show();
  714. clearTimeout(this.__timer);
  715. delay && (this.__timer = setTimeout(() => {
  716. this.$el.fadeOut("slow", () => {
  717. var _a;
  718. if (this.msg) {
  719. (_a = this[this.longMsgType]) == null ? void 0 : _a.call(this, this.msg, 0);
  720. }
  721. });
  722. }, delay));
  723. }
  724. }
  725. const _Active = class _Active {
  726. constructor() {
  727. __publicField(this, "template", template);
  728. /** @type {JQuery<HTMLDivElement>} */
  729. __publicField(this, "$el", null);
  730. /** @type {Dialog} */
  731. __publicField(this, "dialog", null);
  732. /** @type {Notify} */
  733. __publicField(this, "notify", null);
  734. __publicField(this, "_insert", false);
  735. if (_Active.instance) {
  736. return _Active.instance;
  737. }
  738. this.$el = $(this.template);
  739. this.$el.find("#convert").on("click", this.active.bind(this));
  740. this.$el.find(".close").on("click", () => {
  741. this.hide();
  742. });
  743. this.dialog = new Dialog();
  744. this.dialog.append(this.$el);
  745. this.notify = new Notify();
  746. this.$el.append(this.notify.$el);
  747. this.renderGoods();
  748. this.renderTip();
  749. }
  750. renderGoods() {
  751. const goodsQr = LoginModal.instance.getConfig("goodsQr");
  752. const goodsUrl = LoginModal.instance.getConfig("goodsUrl");
  753. const goodsTip = LoginModal.instance.getConfig("goodsTip");
  754. if (!goodsQr && !goodsUrl) {
  755. this.$el.find(".right").hide();
  756. }
  757. if (goodsQr) {
  758. this.$el.find(".goods-qr").attr("src", goodsQr.value);
  759. }
  760. if (goodsUrl) {
  761. this.$el.find(".goods-url").attr("href", goodsUrl.value);
  762. }
  763. if (goodsTip) {
  764. this.$el.find(".right .tip").html(goodsTip.value);
  765. }
  766. }
  767. renderTip() {
  768. const tip = LoginModal.instance.getConfig("activeTip");
  769. this.$el.find(".left .tip").html((tip == null ? void 0 : tip.value) || "");
  770. }
  771. show() {
  772. if (window !== top) return;
  773. if (this._insert) {
  774. this.dialog.$el.show();
  775. return;
  776. }
  777. this.dialog.$el.appendTo(document.body);
  778. this._insert = true;
  779. this.dialog.$el.show();
  780. }
  781. hide() {
  782. this.dialog.$el.hide();
  783. }
  784. async active() {
  785. var _a, _b;
  786. const { $el } = this;
  787. const key = $el.find("input[name=key]").val();
  788. if (!key) {
  789. return this.notify.warning("请输入激活码");
  790. }
  791. try {
  792. const res = await useCardkey({ key });
  793. this.notify.success(res.message);
  794. (_a = LoginModal.instance) == null ? void 0 : _a.showInfo();
  795. $el.find("input[name=key]").val("");
  796. this.hide();
  797. } catch (error) {
  798. this.notify.error(((_b = error.responseJSON) == null ? void 0 : _b.message) || "激活失败!", 3e3);
  799. }
  800. }
  801. };
  802. /** @type {Active} */
  803. __publicField(_Active, "instance", null);
  804. __publicField(_Active, "show", () => {
  805. if (!_Active.instance) {
  806. _Active.instance = new _Active();
  807. }
  808. _Active.instance.show();
  809. });
  810. let Active = _Active;
  811. class Toast {
  812. static show(text, duration = 2e3) {
  813. const toast = document.createElement("div");
  814. toast.classList.add("qk-toast");
  815. toast.innerText = text;
  816. document.body.appendChild(toast);
  817. setTimeout(() => {
  818. toast.remove();
  819. }, duration);
  820. }
  821. // static showError(text, duration = 2000) {
  822. // const toast = document.createElement('div')
  823. // toast.classList.add('qk-toast', 'error')
  824. // toast.innerText = text
  825. // document.body.appendChild(toast)
  826. // setTimeout(() => {
  827. // toast.remove()
  828. // }, duration)
  829. // }
  830. // constructor() {
  831. // this.toast = document.createElement('div')
  832. // this.toast.classList.add('qk-toast')
  833. // this.toast.innerText = '加载中...'
  834. // document.body.appendChild(this.toast)
  835. // }
  836. }
  837. const _CSDN = class _CSDN {
  838. constructor() {
  839. __publicField(this, "config", {
  840. hideOBtn: false
  841. });
  842. __publicField(this, "$hideBox", $(".hide-article-box"));
  843. __publicField(this, "loading", false);
  844. this.exCopyAstrict();
  845. this.normalMore();
  846. this.loginModule();
  847. this.createDetailBtn();
  848. this.immersionRead();
  849. }
  850. exCopyAstrict() {
  851. document.addEventListener("copy", (e) => {
  852. e.stopPropagation();
  853. }, true);
  854. $(".hljs-button.signin").attr("data-title", "复制").removeClass("active").removeAttr("onClick");
  855. $("#content_views").on("click", ".hljs-button.signin", function(e) {
  856. navigator.clipboard.writeText($(this).parent()[0].innerText.replace(/[\u00A0]/gi, " ")).then((res) => {
  857. $(this).attr("data-title", "复制成功");
  858. setTimeout(() => {
  859. $(this).attr("data-title", "复制");
  860. }, 3e3);
  861. });
  862. });
  863. }
  864. immersionRead() {
  865. setTimeout(() => {
  866. if ($(".option-box.sidecolumn").length) return;
  867. const hide_aside = +getStore("hide_aside") || 0;
  868. const $btn = $(`<a class="option-box sidecolumn" style="display:flex">
  869. <span class="hide">
  870. <img src="https://csdnimg.cn/release/blogv2/dist/pc/img/iconHideSide.png" alt="" srcset="">
  871. <span class="show-txt">隐藏<br>侧栏</span>
  872. </span>
  873. <span class="show" style="display:none">
  874. <img src="https://csdnimg.cn/release/blogv2/dist/pc/img/iconShowSide.png" alt="" srcset="">
  875. <span class="show-txt">显示<br>侧栏</span>
  876. </span>
  877. </a>`);
  878. const $aside = $(".blog_container_aside");
  879. const $right = $(".recommend-right");
  880. const showBtn = (type) => {
  881. if (type) {
  882. $right.addClass("hide-aside");
  883. $aside.addClass("hide-aside");
  884. $btn.find(".show").show();
  885. $btn.find(".hide").hide();
  886. $btn.attr("data-type", "show");
  887. } else {
  888. $right.removeClass("hide-aside");
  889. $aside.removeClass("hide-aside");
  890. $btn.find(".show").hide();
  891. $btn.find(".hide").show();
  892. $btn.attr("data-type", "hide");
  893. }
  894. };
  895. showBtn(hide_aside);
  896. $btn.on("click", function() {
  897. const type = this.dataset.type || "hide";
  898. if (type === "hide") {
  899. showBtn(1);
  900. setStore("hide_aside", 1);
  901. } else {
  902. showBtn(0);
  903. setStore("hide_aside", 0);
  904. }
  905. });
  906. $(".csdn-side-toolbar .option-box").eq(0).before($btn);
  907. }, 1e3);
  908. }
  909. normalMore() {
  910. const btn = this.$hideBox.find(".btn-readmore");
  911. if (btn.length) {
  912. btn.removeClass("no-login").find(".follow-text").text("展开全文");
  913. }
  914. }
  915. loginModule() {
  916. const loginBtn = $(".toolbar-btns .toolbar-btn-login");
  917. let btnClick = false;
  918. loginBtn.on("click", () => btnClick = true);
  919. const mutation = new MutationObserver((mon) => {
  920. const lgm = mon.find((m) => $(m.addedNodes[0]).hasClass("passport-login-container"));
  921. if (lgm) {
  922. const dom = $(lgm.addedNodes[0]);
  923. if (!btnClick) dom.remove();
  924. else dom.find("img").one("click", () => btnClick = false);
  925. }
  926. });
  927. mutation.observe(document.body, { childList: true });
  928. }
  929. footerList() {
  930. function fn() {
  931. const list = $(".recommend-item-box");
  932. list.each((i, el) => {
  933. if ($(el).find(".list-type-box")[0]) return;
  934. const url = $(el).attr("data-url") || "";
  935. if (!url) return;
  936. if (url.indexOf("blog.csdn.net") !== -1) {
  937. $(el).prepend(`<div class="list-type-box">博</div>`);
  938. } else if (url.indexOf("download.csdn.net") !== -1) {
  939. $(el).prepend(`<div class="list-type-box">文</div>`);
  940. } else if (url.indexOf("edu.csdn.net") !== -1) {
  941. $(el).prepend(`<div class="list-type-box">育</div>`);
  942. } else {
  943. $(el).prepend(`<div class="list-type-box">其</div>`);
  944. }
  945. });
  946. }
  947. setTimeout(() => {
  948. fn();
  949. }, 5e3);
  950. }
  951. createDetailBtn() {
  952. const $moreBtn = $(`<a class="openvippay" style="margin-top: 10px;">
  953. <i class="logo-icon">${loginSvg}</i><span>解锁全文</span>
  954. <i class="iconfont icon-loading"></i>
  955. </a>`);
  956. $moreBtn.on("click", csdnDetail);
  957. const $vipMask = this.$hideBox.find(".vip-mask");
  958. if ($vipMask.length) {
  959. this.config.hideOBtn && $("#getVipUrl").hide();
  960. this.$hideBox.find(".vip-mask").append($moreBtn);
  961. _CSDN.csdnDetail = csdnDetail;
  962. }
  963. const $column = this.$hideBox.find(".column-mask");
  964. if ($column.length) {
  965. const group = document.querySelector(".column-group");
  966. if (group) {
  967. const btn = group.querySelector(".column-studyvip-free,.article-column-subscribe");
  968. if (!btn) {
  969. return;
  970. }
  971. }
  972. const $div = $('<div class="vip-mask"></div>');
  973. $column.after($div);
  974. $div.append($moreBtn);
  975. _CSDN.csdnDetail = csdnDetail;
  976. this.config.hideOBtn && $column.hide();
  977. }
  978. }
  979. createDownload() {
  980. const $downloadBtn = $(`<button type="button" disabled class="el-button relative el-button--warning el-button--medium" >
  981. <i class="logo-icon">${loginSvg}</i>
  982. <span class="va-middle show">直接下载</span>
  983. </button>`);
  984. $("#downloadBtn .el-button").first().before($downloadBtn);
  985. $downloadBtn.on("click", () => {
  986. });
  987. }
  988. };
  989. __publicField(_CSDN, "instance", null);
  990. let CSDN = _CSDN;
  991. function markdown_line() {
  992. $(".markdown_views pre").addClass("prettyprint"), $("pre.prettyprint code").each(function() {
  993. var t = $(this).text().split("\n").length + ($(this).hasClass("hljs") ? 1 : 0), e = $("<ul/>").addClass("pre-numbering").hide();
  994. $(this).addClass("has-numbering").parent().append(e);
  995. for (var o = 1; o < t; o++)
  996. e.append($("<li/>").text(o));
  997. e.fadeIn(1700);
  998. }), $(".pre-numbering li").css("color", "#999"), setTimeout(function() {
  999. $(".math").each(function(t, e) {
  1000. $(this).find("span").last().css("color", "#fff");
  1001. });
  1002. }), setTimeout(function() {
  1003. $(".toc a[target='_blank']").attr("target", ""), $("a.reversefootnote,a.footnote").attr("target", "");
  1004. }, 500);
  1005. }
  1006. function createMenu(dom) {
  1007. var _a, _b;
  1008. const menuBox = $(".toc-box");
  1009. const menu = dom.find(".toc ul");
  1010. const _menu = $((_a = menu[0]) == null ? void 0 : _a.outerHTML.replace(/ul|ul/g, "ol"));
  1011. _menu.find("li").each(function(i, el) {
  1012. if (el.querySelector("ul,ol")) {
  1013. el.classList.add("sub-box");
  1014. }
  1015. });
  1016. menuBox.html((_b = _menu[0]) == null ? void 0 : _b.outerHTML);
  1017. }
  1018. async function csdnDetail() {
  1019. var _a;
  1020. const $btn = $(this);
  1021. const $content = $("#content_views");
  1022. if (!LoginModal.instance.userData) {
  1023. LoginModal.instance.show();
  1024. LoginModal.instance.notify.warning("请先登录");
  1025. return;
  1026. }
  1027. if (LoginModal.instance.expirationTime <= 0) {
  1028. Active.show();
  1029. Active.instance.notify.warning("您的使用时间已到,需要续费再使用", 5e3);
  1030. return;
  1031. }
  1032. if (CSDN.instance.loading) {
  1033. return;
  1034. }
  1035. if ($content.hasClass("rendered")) {
  1036. LoginModal.instance.notify.success("已解锁全部内容");
  1037. Toast.show("已解锁全部内容");
  1038. return;
  1039. }
  1040. $btn.addClass("btn-loading");
  1041. CSDN.instance.loading = true;
  1042. try {
  1043. const res = await getArticle({ url: location.origin + location.pathname, type: "plugin" });
  1044. if (res.success) {
  1045. console.log("这里执行内容替换");
  1046. $content.html(res.data);
  1047. (_a = document.querySelector("#article_content")) == null ? void 0 : _a.removeAttribute("style");
  1048. $content.addClass("rendered");
  1049. setTimeout(() => {
  1050. markdown_line();
  1051. createMenu($content);
  1052. $content.find("pre").each(function(t, e) {
  1053. e = $(e), e.find("code").append(`<div class="hljs-button signin" data-title="复制"></div>`), e.find("code").height() > 340 ? (e.addClass("set-code-hide"), e.append('<div class="hide-preCode-box"><span class="hide-preCode-bt"><img class="look-more-preCode contentImg-no-view" src="' + blogStaticHost + "dist/pc/img/newCodeMore" + skinStatus + '.png" alt="" title=""></span></div>')) : e.addClass("set-code-show");
  1054. });
  1055. $content.on("click", ".hide-preCode-bt", function() {
  1056. $(this).parents("pre").removeClass("set-code-hide").addClass("set-code-show"), $(this).parents(".hide-preCode-box").hide().remove(), $(window).resize().scroll();
  1057. });
  1058. $(".hide-article-box").hide();
  1059. });
  1060. }
  1061. } catch (error) {
  1062. Toast.show("服务器内部错误,请稍后重试!");
  1063. console.log(error);
  1064. } finally {
  1065. CSDN.instance.loading = false;
  1066. $btn.removeClass("btn-loading");
  1067. }
  1068. }
  1069. CSDN.instance = new CSDN();
  1070. const _LoginModal = class _LoginModal {
  1071. constructor() {
  1072. __publicField(this, "template", template$2);
  1073. __publicField(this, "status", 1);
  1074. __publicField(this, "time", 60);
  1075. /** 剩余使用时间毫秒 */
  1076. __publicField(this, "expirationTime", 0);
  1077. __publicField(this, "userData", null);
  1078. __publicField(this, "configList", []);
  1079. __publicField(this, "T", null);
  1080. /** @type {JQuery<HTMLDivElement>} */
  1081. __publicField(this, "$el", null);
  1082. /** @type {JQuery<HTMLDivElement>} */
  1083. __publicField(this, "$spirit");
  1084. /** @type {Notify} */
  1085. __publicField(this, "notify", null);
  1086. /** @type {Dialog} */
  1087. __publicField(this, "dialog", null);
  1088. __publicField(this, "_insert", false);
  1089. __publicField(this, "_isShow", true);
  1090. if (_LoginModal.instance) {
  1091. return _LoginModal.instance;
  1092. }
  1093. getConfig({ key: "goodsQr,goodsUrl,goodsTip,activeTip,greeting,ctemp" }).then((res) => {
  1094. if (res.success) {
  1095. this.configList = res.data || [];
  1096. this.render2buy();
  1097. }
  1098. });
  1099. const dom = $(`${this.template}`);
  1100. this.$el = dom;
  1101. this.dialog = new Dialog();
  1102. this.dialog.append(dom);
  1103. this.notify = new Notify();
  1104. this.$el.append(this.notify.$el);
  1105. this.show();
  1106. this.renderSpirit();
  1107. this.initLoginEvents();
  1108. if (getToken()) {
  1109. this.showInfo(getStore("user"));
  1110. }
  1111. }
  1112. initLoginEvents() {
  1113. const { $el } = this;
  1114. const that = this;
  1115. $el.find(".close").on("click", function() {
  1116. that.hide();
  1117. });
  1118. $el.find(".to-register-btn").on("click", function() {
  1119. that.loginStatus($el);
  1120. });
  1121. $el.find(".code-send").on("click", function() {
  1122. const destination = $el.find("input[name=username]").val();
  1123. if (!destination) {
  1124. return that.notify.warning("请输入邮箱地址");
  1125. } else if (!that.verifyEmail(destination)) {
  1126. return that.notify.warning("请输入正确的邮箱地址");
  1127. }
  1128. $(this).attr("disabled", true);
  1129. that.sendCode(destination);
  1130. });
  1131. $el.find(".submit").on("click", function(e) {
  1132. that.submit();
  1133. e.preventDefault();
  1134. });
  1135. $el.on("mouseenter", () => {
  1136. this.__closeTimer && clearTimeout(this.__closeTimer);
  1137. });
  1138. $el.on("mouseleave", this.downCountClose.bind(this));
  1139. this.downCountClose();
  1140. }
  1141. show() {
  1142. var _a;
  1143. if (window !== top) return;
  1144. (_a = this.$spirit) == null ? void 0 : _a.hide();
  1145. this._isShow = true;
  1146. if (this._insert) {
  1147. this.dialog.$el.show();
  1148. return;
  1149. }
  1150. this.dialog.$el.appendTo(document.body);
  1151. this._insert = true;
  1152. this.dialog.$el.show();
  1153. }
  1154. showLogin(msg) {
  1155. var _a;
  1156. removeToken();
  1157. this.show();
  1158. this.$el.find("form").show();
  1159. this.userData = null;
  1160. removeStore("user");
  1161. (_a = this.$info) == null ? void 0 : _a.remove();
  1162. this.$info = null;
  1163. this.notify.close();
  1164. msg && this.notify.error(msg, 3e3);
  1165. }
  1166. hide() {
  1167. var _a, _b;
  1168. (_a = this.dialog.$el) == null ? void 0 : _a.hide();
  1169. (_b = this.$spirit) == null ? void 0 : _b.show();
  1170. this._isShow = false;
  1171. }
  1172. async showInfo(userData) {
  1173. var _a;
  1174. try {
  1175. if (userData) {
  1176. this.renderInfo(userData);
  1177. if (Date.now() - (userData.saveTime || 0) < 864e5) {
  1178. return;
  1179. }
  1180. }
  1181. const { success, data, message, token } = await getUserInfo();
  1182. if (success) {
  1183. data.levelName = data.vipLevel > 1 ? "VIP用户" : "体验用户";
  1184. data.points = Math.floor(data.points / 20);
  1185. data.saveTime = Date.now();
  1186. setStore("user", data);
  1187. setToken(token);
  1188. this.renderInfo(data);
  1189. } else {
  1190. this.notify.warning(message);
  1191. }
  1192. } catch (error) {
  1193. console.error(error);
  1194. this.showLogin(((_a = error.responseJSON) == null ? void 0 : _a.message) || "获取用户信息失败");
  1195. }
  1196. }
  1197. renderInfo(data) {
  1198. var _a;
  1199. this.userData = data;
  1200. (_a = this.$info) == null ? void 0 : _a.remove();
  1201. const infoDom = $(stringTemplate(infoHtm, data));
  1202. this.$el.append(infoDom);
  1203. this.$info = infoDom;
  1204. this.$el.find("form").hide();
  1205. this.render2buy();
  1206. this.initInfoEvent();
  1207. const exDate = new Date(data.expirationDate).getTime();
  1208. const s = exDate - Date.now();
  1209. this.expirationTime = s;
  1210. if (!data.email) {
  1211. this.notify.warning("正在以游客身份使用,<span class='span-btn'>去登陆</span>", 0);
  1212. this.notify.$el.find(".span-btn").on("click", () => {
  1213. this.notify.info("请及时登录!", 3e3);
  1214. this.showLogin();
  1215. });
  1216. return;
  1217. } else if (s <= 0) {
  1218. this.notify.info("您的会员已到期,请续费再使用!", 0);
  1219. } else if (s <= 3 * 864e5) {
  1220. this.notify.info("您的会员即将到期,请及时续期!", 0);
  1221. } else {
  1222. this.notify.success("欢迎使用qk插件", 0);
  1223. }
  1224. this.hide();
  1225. }
  1226. render2buy() {
  1227. if (this.renderConfig) return;
  1228. const urlConfig = this.getConfig("goodsUrl");
  1229. if (urlConfig == null ? void 0 : urlConfig.value) {
  1230. this.$el.find(".to-buy").attr("href", urlConfig.value).show();
  1231. } else {
  1232. this.$el.find(".to-buy").hide();
  1233. }
  1234. const greeting = this.getConfig("greeting");
  1235. if ((greeting == null ? void 0 : greeting.value) && this.$info && this.expirationTime > 3 * 864e5) {
  1236. this.notify.success(greeting == null ? void 0 : greeting.value, 0);
  1237. }
  1238. const ctemp = this.getConfig("ctemp");
  1239. if (ctemp == null ? void 0 : ctemp.value) {
  1240. this.$el.find(".temp").show().find(".c_temp").on("click", async () => {
  1241. const res = await userTemp();
  1242. setToken(res.data);
  1243. this.showInfo();
  1244. });
  1245. }
  1246. if (this.configList.length) {
  1247. this.renderConfig = true;
  1248. }
  1249. }
  1250. getConfig(key) {
  1251. return this.configList.find((item) => item.key === key);
  1252. }
  1253. renderSpirit() {
  1254. this.$spirit = $(`<div class="spirit-qk-icon">${loginSvg}</div>`).appendTo(document.body).on("click", () => {
  1255. this.$spirit.hide();
  1256. this.show();
  1257. }).hide();
  1258. }
  1259. initInfoEvent() {
  1260. const { $el } = this;
  1261. CSDN.csdnDetail && $el.find(".jx").show().on("click", CSDN.csdnDetail);
  1262. $el.find(".to-active").on("click", () => {
  1263. Active.instance = new Active();
  1264. Active.instance.show();
  1265. });
  1266. }
  1267. downCountClose() {
  1268. if (!this._isShow) return;
  1269. if (!this.userData) return;
  1270. this.__closeTimer = setTimeout(() => {
  1271. this.hide();
  1272. }, 3e3);
  1273. }
  1274. async submit() {
  1275. var _a;
  1276. const data = this.$el.find("form").serializeArray();
  1277. const params = {};
  1278. let res;
  1279. try {
  1280. if (this.status) {
  1281. const keys = ["username", "password"];
  1282. data.forEach((item) => {
  1283. if (keys.includes(item.name)) {
  1284. params[item.name] = item.value;
  1285. }
  1286. });
  1287. params.type = "email";
  1288. res = await login(params);
  1289. } else {
  1290. data.forEach((item) => {
  1291. params[item.name] = item.value;
  1292. });
  1293. params.type = "email";
  1294. res = await register(params);
  1295. }
  1296. if (res.success) {
  1297. this.status = 1;
  1298. setToken(res.data);
  1299. this.showInfo();
  1300. } else {
  1301. this.notify.warning(res.message, 3e3);
  1302. }
  1303. } catch (error) {
  1304. this.notify.error(((_a = error.responseJSON) == null ? void 0 : _a.message) || "登录失败", 3e3);
  1305. }
  1306. }
  1307. async sendCode(email) {
  1308. var _a;
  1309. try {
  1310. const res = await sendVerifyCode({ destination: email, verificationType: "email" });
  1311. if (res.success) {
  1312. this.time = 60;
  1313. this.downCount(this.$el.find(".code-send"));
  1314. this.notify.success("验证码发送成功", 3e3);
  1315. } else {
  1316. this.notify.warning(res.message, 3e3);
  1317. }
  1318. } catch (error) {
  1319. this.$el.find(".code-send").attr("disabled", false);
  1320. this.notify.error(((_a = error.responseJSON) == null ? void 0 : _a.message) || "发送验证码失败", 3e3);
  1321. }
  1322. }
  1323. /**
  1324. * 倒计时
  1325. * @param {JQuery<HTMLElement>} dom
  1326. */
  1327. downCount(dom) {
  1328. dom.text(this.time + "秒后再获取");
  1329. this.T = setTimeout(() => {
  1330. this.time--;
  1331. if (this.time <= 0) {
  1332. dom.text("重新获取");
  1333. dom.attr("disabled", false);
  1334. clearTimeout(this.T);
  1335. } else {
  1336. this.downCount(dom);
  1337. }
  1338. }, 1e3);
  1339. }
  1340. /**
  1341. * 登录和注册ui切换
  1342. * @param {JQuery<HTMLElement>} dom
  1343. */
  1344. loginStatus(dom) {
  1345. if (this.status) {
  1346. dom.find("#confirmP,#code").show();
  1347. dom.find(".hint .text").text("已有账号?");
  1348. dom.find(".to-register-btn").text("立即登录");
  1349. dom.find("h2").text("用户注册");
  1350. this.status = 0;
  1351. } else {
  1352. dom.find("#confirmP,#code").hide();
  1353. dom.find(".hint .text").text("还没账号?");
  1354. dom.find(".to-register-btn").text("立即注册");
  1355. dom.find("h2").text("用户登录");
  1356. this.status = 1;
  1357. }
  1358. }
  1359. verifyEmail(val) {
  1360. return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(val);
  1361. }
  1362. };
  1363. /** @type {LoginModal} */
  1364. __publicField(_LoginModal, "instance", null);
  1365. let LoginModal = _LoginModal;
  1366. class ZhiHu {
  1367. constructor() {
  1368. __publicField(this, "config", {
  1369. hideOBtn: false
  1370. });
  1371. this.init();
  1372. }
  1373. init() {
  1374. const that = this;
  1375. this.ImgObs = new IntersectionObserver((entries) => {
  1376. if (entries[0].intersectionRatio <= 0) return;
  1377. const src = entries[0].target.dataset.actualsrc;
  1378. if (!src) return;
  1379. const img = entries[0].target;
  1380. entries[0].target.src = src;
  1381. this.ImgObs.unobserve(entries[0].target);
  1382. const dom = img.nextElementSibling;
  1383. if (dom == null ? void 0 : dom.classList.contains("richText-img-placeholder")) {
  1384. dom.remove();
  1385. }
  1386. });
  1387. const domOb = new MutationObserver((mon) => {
  1388. mon.find((m) => {
  1389. for (let i = 0; i < m.addedNodes.length; i++) {
  1390. const $el = $(m.addedNodes[i]);
  1391. const PaidAnswerFooter2 = $el.hasClass("KfeCollection-PaidAnswerFooter") ? $el : $el.find(".KfeCollection-PaidAnswerFooter");
  1392. if (PaidAnswerFooter2.length) {
  1393. that.generateMoreBtn(PaidAnswerFooter2);
  1394. return;
  1395. }
  1396. }
  1397. });
  1398. });
  1399. domOb.observe(document.body, {
  1400. subtree: true,
  1401. childList: true
  1402. });
  1403. const PaidAnswerFooter = $(".KfeCollection-PaidAnswerFooter");
  1404. if (PaidAnswerFooter.length) {
  1405. that.generateMoreBtn(PaidAnswerFooter);
  1406. }
  1407. }
  1408. /**
  1409. * 点击阅读全文的时候添加按钮
  1410. * @param {JQuery<HTMLDivElement>} dom
  1411. */
  1412. generateMoreBtn(PaidAnswerFooter) {
  1413. const $moreBtn = $(`<a class="qk-openvippay" style="margin-top: 10px;">
  1414. <i class="logo-icon">${loginSvg}</i><span>解锁全文</span>
  1415. <i class="iconfont icon-loading"></i>
  1416. </a>`);
  1417. PaidAnswerFooter.find(".KfeCollection-PurchaseBtn").append($moreBtn);
  1418. const contentItem = PaidAnswerFooter.closest(".ContentItem");
  1419. const oBtn = PaidAnswerFooter.find(".KfeCollection-PurchaseBtn-HybridLink");
  1420. this.config.hideOBtn && oBtn.parent().hide();
  1421. $moreBtn.on("click", () => {
  1422. this.$content = contentItem;
  1423. this.url = contentItem.children("meta[itemprop=url]").attr("content");
  1424. this.zhihuDetail($moreBtn, PaidAnswerFooter);
  1425. });
  1426. }
  1427. async zhihuDetail($btn, footer) {
  1428. if (!LoginModal.instance.userData) {
  1429. LoginModal.instance.show();
  1430. LoginModal.instance.notify.warning("请先登录");
  1431. return;
  1432. }
  1433. if (LoginModal.instance.expirationTime <= 0) {
  1434. Active.show();
  1435. Active.instance.notify.warning("您的使用时间已到,请续费");
  1436. return;
  1437. }
  1438. if (this.loading) {
  1439. return;
  1440. }
  1441. const $article = this.$content.find(".RichText");
  1442. if (this.$content.hasClass("rendered")) {
  1443. LoginModal.instance.notify.success("已解锁全部内容");
  1444. return;
  1445. }
  1446. $btn.addClass("btn-loading");
  1447. this.loading = true;
  1448. try {
  1449. const res = await getArticle({ url: this.url, type: "plugin" });
  1450. if (res.success) {
  1451. const div = document.createElement("div");
  1452. div.innerHTML = res.data.styles;
  1453. let fontname = res.data.styles.match(/font-family:([^;]+)/)[1];
  1454. $(div).insertBefore($article);
  1455. const _content = $(res.data.manuscript);
  1456. $article.replaceWith(_content);
  1457. _content.css("font-family", `${fontname},-apple-system,BlinkMacSystemFont, 'Helvetica Neue','PingFang SC','Microsoft YaHei', 'Source Han Sans SC','Noto Sans CJK SC','WenQuanYi Micro Hei', sans-serif`);
  1458. this.imgLazyLoad(_content[0]);
  1459. footer.hide();
  1460. this.$content.addClass("rendered");
  1461. this.loading = false;
  1462. }
  1463. } catch (error) {
  1464. console.log(error);
  1465. Toast.show("服务器内部错误,请稍后重试!");
  1466. } finally {
  1467. $btn.removeClass("btn-loading");
  1468. this.loading = false;
  1469. }
  1470. }
  1471. imgLazyLoad(content) {
  1472. const imgs = content.querySelectorAll("img");
  1473. imgs.forEach((img, i) => {
  1474. this.ImgObs.observe(img);
  1475. });
  1476. }
  1477. }
  1478. __publicField(ZhiHu, "instance", null);
  1479. ZhiHu.instance = new ZhiHu();
  1480. const html = '<div class="agreement-root"><div class="title">QK脚本使用协议</div><div class="content"><p>欢迎使用qk脚本!请仔细阅读以下免责申明:</p><p>1.有能力的情况,请大家支持正版</p><p>2.解析的文章均来至互联网用户分享,我们尽力确保所提供资料的质量,但不能保证其绝对准确性和完整性。</p><p>3.使用本脚本所解析的任何资源即表示您同意自行承担风险。我们不对因使用这些资源而导致的任何损失或损害承担责任。</p><p>4.用户必须遵守所有相关法律法规,不得从事任何违法活动。对于违反本社区准则的行为,我们将采取适当措施处理。</p><p>5.本免责声明中的条款可能会随时更改;请经常回访以获取最新信息。</p><p>6.如果您有任何疑问或需要帮助,请联系:snphacker@vip.qq.com</p><p>7.点击我同意后,即已代表您已经充分了解相关问题,否则后果自负,特此声明!</p></div><div class="btns"><button class="close">不同意</button><button class="agree">我同意</button></div></div>';
  1481. class Protocol {
  1482. constructor(options) {
  1483. __publicField(this, "template", html);
  1484. __publicField(this, "$protocol", null);
  1485. this.options = options;
  1486. this.init();
  1487. }
  1488. init() {
  1489. this.render();
  1490. this.bindEvent();
  1491. }
  1492. render() {
  1493. const $protocol = $(this.template);
  1494. $("body").append($protocol);
  1495. this.$protocol = $protocol;
  1496. }
  1497. bindEvent() {
  1498. const $agree = this.$protocol.find(".agree");
  1499. const $close = this.$protocol.find(".close");
  1500. $agree.on("click", () => {
  1501. this.options.onAgree();
  1502. this.$protocol.remove();
  1503. });
  1504. $close.on("click", () => {
  1505. this.$protocol.remove();
  1506. });
  1507. $(document).on("click", (e) => {
  1508. let c = e.target;
  1509. while (c) {
  1510. if (c === this.$protocol[0]) {
  1511. return;
  1512. }
  1513. c = c.parentNode;
  1514. }
  1515. this.$protocol.remove();
  1516. });
  1517. }
  1518. }
  1519. const agree = getStore("agree");
  1520. if (agree) {
  1521. LoginModal.instance = new LoginModal();
  1522. } else {
  1523. Protocol.instance = new Protocol({
  1524. onAgree: () => {
  1525. setStore("agree", 1);
  1526. LoginModal.instance = new LoginModal();
  1527. }
  1528. });
  1529. }
  1530. })();