Greasy Fork is available in English.

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

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

  1. // ==UserScript==
  2. // @name qk文章资源共享|CSDN|知乎|专栏|会员文章|盐选|文件下载|CSDN积分
  3. // @namespace https://zsh5.qktk.online/
  4. // @version 0.1.3-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 csdnimg.cn
  12. // @connect csdn.net
  13. // @connect qktk.online
  14. // @support https://scriptcat.org/zh-CN/script-show-page/2474/issue
  15. // @supportUrl https://scriptcat.org/zh-CN/script-show-page/2474/issue
  16. // @antifeature payment
  17. // @license MIT
  18. // @require https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js
  19. // @require https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jszip/3.7.1/jszip.min.js
  20. // @grant GM_addStyle
  21. // @grant unsafeWindow
  22. // @grant GM_xmlhttpRequest
  23. // @grant GM_getValue
  24. // @grant GM_setValue
  25. // @grant GM_deleteValue
  26. // @grant GM_info
  27. // ==/UserScript==
  28.  
  29. var __defProp = Object.defineProperty;
  30. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  31. var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  32. (function() {
  33. "use strict";
  34. GM_addStyle(`@font-face {
  35. font-family: "qkfont"; /* Project id 4739727 */
  36. src: url('data:font/woff2;base64,d09GMgABAAAAAAVUAAsAAAAACqAAAAUIAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDMgqILIc0ATYCJAMUCwwABCAFhGcHShtYCRHVo/eQ/Uwo2/TQbDHm7sISRhMGYUn52yijvmfi4b/9/rfPzNz7zQRpYquT8BDFQoFIwhMp0VhdNKomQnnD/+Z6iwJtMKthVrLZPe4aLmrOmxnX0X/qBcDWnB0bG6FKsnbk0T8kpQe+9Y97VTMWJhibL1skxBvwZa3dMWnaB2osWA6Wxl6EvZ5XlPuQTWBGFj5zvkSg1bYAzOMRcWmg80JBQxUYxRYMBvXMuFAqKgDNeliZ4YRmX809sYC4AyrSLeZVwO385+Mvl+ADSZVBcJkTRHgxePJe+WszS/L/BvmddEDAnRMqZKxfWDSuzacvgFw613N369jfFYcBrZol6UfXx7sfJ7/y/zfU9lvztob/8MiSIogaBO52oh8OFg/OEivJ/FqvJPFrUknhH9/6WtwV7d6KfiCuAPEB6PMLQ6ckbwkClpLyAfreqIpzOyPt/n2ISrsbsiXYvY1h+sEDoUwunxwfR+5iAaLw+8gmhQ9Ohel7WFo7LSN7qE0SaZq0tCsMiISr20LOUtNMoaEZ+gR5nDpawqQTsN6CqHFk2izQU5pbVFUL3+kZ6j7ubQ9q75jqTZQGnpbwekhNIc6T0Sgm5EklSBq2BbZpfFKueeYBg7yJpVc5JVE2sbkXuUKLalSTNHZvZghI3rbzXPStm3e9d7ZkEwRRPQwGKYNhWgrO9Z90c9sEDDV3WHrKtuRrZ80gatoOnrnBvfC1U8AvXn6KivLPOV9W2yr2K/b1LfYT/Y0wwwqbD27NGgvr6jJOsVY/aeGs4K0bJhKv8Iotxp1TnZ1SXbDLAgWKT8edi4um851TcnPB/pe1TFeuK8eUa7qy1xVqhpsgAt6LYcpbVGaVZ1VOidDnGs9j2enUFTpqumqHV0u3GAqNcEPcyOjAUXPKgoLxbvue21y3uRGOJ1cxHJjOTPykg+EmrhEe4W7uHjfUVsoV9dt82/QV5SvdfU+Vy4/oH5HjwdteKh/NNly/b8tTo6dbWiNemajAR7RERL87qmgyf/RRrLmTqtIROhY8PUugRP/QwBCBfEOJgWFqEOg3hGhj31gU0Kb+YXHRJvRZRrobFBplYdIe3BVQ5icW+5UFzEWYYYVN35z5kK7EDa4vmpxPqjeFuo96pYtzLbMsVq+2yLLMvRlhhhU2V+Va3hy5gDjKYiWYzrYNhT75np75PoUfI8ywwibxR3NclFRwpcUm9trmB7VZ8n6ci3diGwuOCIz5V/BSOp+aV93TUtZCrjrh6kcQVHC1xQguixpr1RjjxjVaxqAFQONEPpmDUSgpIN+kMrr38haWrWzfyf+D9y/mKfv947dtAUNfZYbHyMY3y1YPxyy313eeDWj8L6Eb0VP+DUtjM0NYeagzm5DBiyRzvtfzw/j7JEoyNLcsGiRNxiBrNksu9FWotNmFWrMD0GpN+Olt+tSALIoAsGgxQOg2A0mnx5B1u0Au9AdQGfQBat3modVJhuLF2iyCIa4BWUIJfINZWEORL+WjvnDMioWhxg9DnLEGXd12e080GPZxSCxjnxIBBavhod4OlbLggl1QpHpKyQ1NQ2PfUgurq2tAllACvoFZWEMpcWr/vheOWbHAJP+SIQoTjQ46tZZBfroNa9kLmR/L2EvUJEDadKvBY7ckqrBtgRvfbkGRatMOTTdoiIi47vr0Xv0GW7aoFYOLnyJFjhJV1C7Xp8z+s7koy2R2xHgSykY8TqhcVQE=') format('woff2'),
  37. url('data:font/woff;base64,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') format('woff'),
  38. url('data:font/ttf;base64,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') format('truetype');
  39. }
  40.  
  41. .iconfont {
  42. font-family: "qkfont" !important;
  43. font-size: 16px;
  44. font-style: normal;
  45. -webkit-font-smoothing: antialiased;
  46. -moz-osx-font-smoothing: grayscale;
  47. }
  48.  
  49. .icon-shuaxin {
  50. font-size: 1em;
  51. margin-left: 4px;
  52. color: #2196f3;
  53. cursor: pointer;
  54. }
  55.  
  56. .icon-shuaxin:before {
  57. content: "\\ec08";
  58. }
  59.  
  60. .icon-loading:before {
  61. content: "\\e891";
  62. }
  63.  
  64. .icon-close:before {
  65. content: "\\e60f";
  66. }
  67.  
  68. .icon-help:before {
  69. content: "\\e8a6";
  70. }
  71.  
  72. .mb8,
  73. #remuneration,
  74. #asideWriteGuide,
  75. #asideAds,
  76. #asideNewNps,
  77. #recommendNps,
  78. #footerRightAds,
  79. #blogExtensionBox,
  80. #dmp_ad_58,
  81. .toolbar-btns .toolbar-btn:not(.toolbar-btn-login),
  82. .programmer1Box,
  83. #recommendAdBox,
  84. .passport-login-tip-container,
  85. .toolbar-advert,
  86. .hide-aside,
  87. .tool-active-list {
  88. display: none !important;
  89. }
  90.  
  91. .list-type-box {
  92. padding: 0px 4px;
  93. background: #21940d;
  94. border-radius: 2px;
  95. color: #fff;
  96. font-weight: 500;
  97. font-size: 12px;
  98. margin-right: 5px;
  99. }
  100.  
  101. #content_views,
  102. #content_views pre,
  103. #content_views pre code {
  104. -webkit-user-select: unset;
  105. user-select: unset;
  106. }
  107.  
  108. .logo-icon svg {
  109. width: 1em;
  110. height: 1em;
  111. vertical-align: text-bottom;
  112. }
  113.  
  114. .qk-openvippay {
  115. -ms-flex-negative: 0;
  116. flex-shrink: 0;
  117. width: 220px;
  118. height: 40px;
  119. border-radius: 20px;
  120. border: 1px solid #fc5531;
  121. display: inline-block;
  122. text-align: center;
  123. line-height: 38px;
  124. color: #fc5531;
  125. font-size: 16px;
  126. font-weight: 600;
  127. position: relative;
  128. background: #fff;
  129. cursor: pointer;
  130. }
  131.  
  132. @keyframes loading {
  133. form {
  134. transform: rotate(0deg);
  135. }
  136. to {
  137. transform: rotate(360deg);
  138. }
  139. }
  140.  
  141. .icon-loading {
  142. display: none;
  143. }
  144.  
  145. .btn-loading {
  146. position: relative;
  147. }
  148.  
  149. .btn-loading:before {
  150. content: '';
  151. position: absolute;
  152. top: 0;
  153. left: 0;
  154. right: 0;
  155. bottom: 0;
  156. background: rgba(0, 0, 0, 0.55);
  157. border-radius: 20px;
  158. }
  159.  
  160. .btn-loading .icon-loading {
  161. position: absolute;
  162. display: block;
  163. left: 50%;
  164. top: 0;
  165. color: #f2f2f2;
  166. animation: 0.6s loading linear infinite;
  167. }
  168.  
  169. .qk-zh-jump {
  170. display: block;
  171. height: 40px;
  172. background: #06f;
  173. color: white;
  174. padding: 0 20px;
  175. line-height: 40px;
  176. margin: 10px -20px;
  177. text-align: right;
  178. cursor: pointer;
  179. }
  180.  
  181. .qk-toast {
  182. position: fixed;
  183. left: 50%;
  184. top: 50%;
  185. transform: translate(-50%, -50%);
  186. max-width: 500px;
  187. padding: 6px 10px;
  188. font-size: 14px;
  189. background: rgba(0, 0, 0, 0.6);
  190. color: #fff;
  191. border-radius: 4px;
  192. box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  193. z-index: 999;
  194. }
  195.  
  196. .qk-toast.error {
  197. background: #f5222dd6;
  198. box-shadow: 0 0 10px #f5222d23;
  199. }
  200.  
  201. @media screen and (max-width: 1200px) {
  202. .blog_container_aside {
  203. display: none;
  204. }
  205. .nodata .container main {
  206. width: 100%;
  207. }
  208. }
  209. .qk-dialog-container .close {
  210. position: absolute;
  211. top: 6px;
  212. right: 8px;
  213. font-size: 20px;
  214. line-height: 1;
  215. cursor: pointer;
  216. color: #767676;
  217. z-index: 1;
  218. }
  219. .qk-dialog-container .log-info {
  220. position: absolute;
  221. bottom: 0px;
  222. right: 10px;
  223. font-size: 12px;
  224. color: #8e8e8e;
  225. }
  226. .qk-dialog-container .log-info a {
  227. color: initial;
  228. }
  229. .qk-dialog-container .login-form {
  230. position: absolute;
  231. width: 280px;
  232. padding: 24px;
  233. top: 8px;
  234. right: 18px;
  235. border: 1px solid rgba(204, 204, 204, 0.212);
  236. background-color: #f5f5f5;
  237. color: #1a1a1a;
  238. border-radius: 4px;
  239. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.18);
  240. }
  241. .qk-dialog-container .login-form .tb {
  242. margin-top: 14px;
  243. }
  244. .qk-dialog-container .login-form.btn-loading::before {
  245. border-radius: 4px;
  246. z-index: 1;
  247. }
  248. .qk-dialog-container .login-form.btn-loading .icon-loading {
  249. top: 50%;
  250. font-size: 24px;
  251. width: 1em;
  252. height: 1em;
  253. line-height: 1em;
  254. z-index: 1;
  255. }
  256. .qk-dialog-container h2 {
  257. font-size: 24px;
  258. margin: 0.83em 0;
  259. }
  260. .qk-dialog-container .notify {
  261. position: absolute;
  262. top: 0;
  263. left: 0;
  264. right: 0;
  265. padding: 8px 8px;
  266. padding-right: 32px;
  267. line-height: 16px;
  268. background-color: #4b4e7d;
  269. color: #fff;
  270. text-align: center;
  271. word-break: break-all;
  272. font-size: 14px;
  273. border-top-left-radius: 4px;
  274. border-top-right-radius: 4px;
  275. transition: all 0.25s;
  276. }
  277. .qk-dialog-container .notify.error {
  278. background-color: #f44336;
  279. }
  280. .qk-dialog-container .notify.success {
  281. background-color: #4caf50;
  282. }
  283. .qk-dialog-container .notify.info {
  284. background-color: #2196f3;
  285. }
  286. .qk-dialog-container .notify.warning {
  287. background-color: #ff9800;
  288. }
  289. .qk-dialog-container .row {
  290. display: flex;
  291. }
  292. .qk-dialog-container .action-btns {
  293. margin-top: 8px;
  294. }
  295. .qk-dialog-container .action-btns .jx {
  296. display: none;
  297. }
  298. .qk-dialog-container .tb .row {
  299. border-top: 1px solid #616161;
  300. border-bottom: 1px solid #616161;
  301. margin-top: -1px;
  302. }
  303. .qk-dialog-container .tb .row .label {
  304. width: 80px;
  305. flex-shrink: 0;
  306. padding: 8px 6px;
  307. background-color: #bdbdbd;
  308. }
  309. .qk-dialog-container .tb .row .value {
  310. padding: 8px 6px;
  311. }
  312. .qk-dialog-container button {
  313. border-radius: 4px;
  314. border: none;
  315. height: 32px;
  316. line-height: 30px;
  317. text-align: center;
  318. font-weight: 500;
  319. font-family: inherit;
  320. background-color: #3564bb;
  321. color: rgba(255, 255, 255, 0.87);
  322. cursor: pointer;
  323. transition: all 0.25s;
  324. }
  325. .qk-dialog-container button:disabled {
  326. opacity: 0.5;
  327. }
  328. .qk-dialog-container button.btn-loading::before {
  329. border-radius: 4px;
  330. }
  331. .qk-dialog-container button.btn-loading .icon-loading {
  332. top: 8px;
  333. width: 16px;
  334. height: 16px;
  335. margin-left: -16px;
  336. line-height: 16px;
  337. }
  338. .qk-dialog-container button:hover {
  339. background-color: #1f4996;
  340. }
  341. .qk-dialog-container .form-item {
  342. flex: 1;
  343. margin-bottom: 14px;
  344. }
  345. .qk-dialog-container .form-item button {
  346. width: 100%;
  347. letter-spacing: 1em;
  348. }
  349. .qk-dialog-container .input_wrapper {
  350. display: flex;
  351. height: 32px;
  352. border: 1px solid #d3d3d3;
  353. background-color: transparent;
  354. border-radius: 4px;
  355. }
  356. .qk-dialog-container .input_wrapper input {
  357. flex: 1;
  358. width: 100%;
  359. padding: 0 8px;
  360. color: inherit;
  361. border: none;
  362. outline: none;
  363. background-color: transparent;
  364. }
  365. .qk-dialog-container .code-send {
  366. width: 100px;
  367. margin-left: 8px;
  368. letter-spacing: 0;
  369. }
  370. .qk-dialog-container .hint {
  371. font-size: 12px;
  372. }
  373. .qk-dialog-container .hint.center {
  374. text-align: center;
  375. }
  376. .qk-dialog-container .hint .span-btn {
  377. margin-left: 0;
  378. }
  379. .qk-dialog-container .hint .temp {
  380. display: none;
  381. }
  382. .qk-dialog-container .desc {
  383. line-height: 1.2;
  384. text-align: left;
  385. color: #d20d0d;
  386. margin: 6px 0;
  387. }
  388. .qk-dialog-container .span-btn {
  389. color: #535bf2;
  390. border: 1px dashed #535bf2;
  391. border-radius: 4px;
  392. padding: 2px 4px;
  393. cursor: pointer;
  394. font-size: 12px;
  395. margin-left: 6px;
  396. }
  397. .qk-dialog-container .span-btn:hover {
  398. opacity: 0.7;
  399. }
  400. .qk-dialog-container .to-buy {
  401. display: none;
  402. }
  403. .spirit-qk-icon {
  404. position: fixed;
  405. right: -10px;
  406. top: 50px;
  407. width: 44px;
  408. height: 34px;
  409. display: flex;
  410. padding: 6px;
  411. align-items: center;
  412. box-sizing: border-box;
  413. background: linear-gradient(140.91deg, #6dc15e 12.61%, #1c7f0a 76.89%);
  414. border-top-left-radius: 17px;
  415. border-bottom-left-radius: 17px;
  416. cursor: pointer;
  417. transition: all 0.3s ease-in-out;
  418. color: white;
  419. opacity: 0.5;
  420. z-index: 9999;
  421. }
  422. .spirit-qk-icon svg {
  423. width: 24px;
  424. height: 24px;
  425. transition: all 0.3s ease-in-out;
  426. }
  427. .spirit-qk-icon:hover {
  428. opacity: 1;
  429. transform: translateX(-10px);
  430. }
  431. .spirit-qk-icon:hover svg {
  432. width: 28px;
  433. height: 28px;
  434. }
  435. .qk-dialog-container {
  436. position: fixed;
  437. top: 0;
  438. width: 100vw;
  439. z-index: 9998;
  440. }
  441. .qk-dialog-container .mask {
  442. position: fixed;
  443. top: 0;
  444. left: 0;
  445. right: 0;
  446. bottom: 0;
  447. background: rgba(0, 0, 0, 0.5);
  448. }
  449. .confirm-wrapper {
  450. position: fixed;
  451. top: 50%;
  452. left: 50%;
  453. transform: translate(-50%, -50%);
  454. width: 320px;
  455. background: #fff;
  456. border-radius: 4px;
  457. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  458. z-index: 9999;
  459. }
  460. .confirm-wrapper .confirm-box {
  461. padding: 20px;
  462. text-align: center;
  463. }
  464. .confirm-wrapper .confirm-box .confirm-title {
  465. font-size: 16px;
  466. font-weight: bold;
  467. margin-bottom: 20px;
  468. color: #333;
  469. }
  470. .confirm-wrapper .confirm-box .confirm-content {
  471. font-size: 14px;
  472. color: #666;
  473. line-height: 1.5;
  474. margin-bottom: 20px;
  475. }
  476. .confirm-wrapper .confirm-box .confirm-btn-wrapper {
  477. display: flex;
  478. justify-content: space-evenly;
  479. }
  480. .confirm-wrapper .confirm-box .confirm-btn-wrapper .confirm-btn {
  481. width: 100px;
  482. height: 32px;
  483. line-height: 30px;
  484. border-radius: 4px;
  485. border: 1px solid transparent;
  486. background-color: #3564bb;
  487. color: rgba(255, 255, 255, 0.87);
  488. cursor: pointer;
  489. }
  490. .confirm-wrapper .confirm-box .confirm-btn-wrapper .confirm-btn:hover {
  491. background: #1f4996;
  492. }
  493. .confirm-wrapper .confirm-box .confirm-btn-wrapper .confirm-btn.confirm-cancel {
  494. background: #9a9a9a;
  495. color: #333;
  496. border-color: #ccc;
  497. }
  498. .confirm-wrapper .confirm-box .confirm-btn-wrapper .confirm-btn.confirm-cancel:hover {
  499. background: #eee;
  500. color: #666;
  501. border-color: #666;
  502. }
  503. .qk-dialog-container .modal {
  504. position: fixed;
  505. left: 50%;
  506. top: 50%;
  507. transform: translate(-50%, -50%);
  508. min-height: 200px;
  509. background-color: white;
  510. border: 1px solid rgba(204, 204, 204, 0.4);
  511. border-radius: 4px;
  512. margin: auto;
  513. padding: 24px;
  514. display: flex;
  515. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  516. }
  517. .qk-dialog-container .modal .left {
  518. flex: 1;
  519. min-width: 250px;
  520. max-width: 300px;
  521. }
  522. .qk-dialog-container .modal .right {
  523. position: relative;
  524. max-width: 180px;
  525. margin-left: 30px;
  526. text-align: center;
  527. }
  528. .qk-dialog-container .modal .right::before {
  529. content: '';
  530. position: absolute;
  531. display: block;
  532. top: 0;
  533. bottom: 0;
  534. left: -15px;
  535. width: 0;
  536. border-left: 1px dashed #a8a8a854;
  537. }
  538. .qk-dialog-container .modal .right .title {
  539. margin: 12px;
  540. }
  541. .qk-dialog-container .modal .right .title i {
  542. color: #999;
  543. margin-left: 4px;
  544. cursor: pointer;
  545. }
  546. .qk-dialog-container .modal .right .title i:hover {
  547. color: #2196f3;
  548. }
  549. .qk-dialog-container .modal .right .goods-qr {
  550. height: 150px;
  551. display: block;
  552. line-height: 150px;
  553. background-color: #f5f5f5;
  554. border: 1px solid #e5e5e5;
  555. border-radius: 4px;
  556. opacity: 1;
  557. text-align: center;
  558. margin: 0 auto;
  559. }
  560. .qk-dialog-container .modal .tip {
  561. font-size: 12px;
  562. color: #999;
  563. word-break: break-all;
  564. }
  565. .agreement-root {
  566. position: fixed;
  567. top: 50%;
  568. left: 50%;
  569. width: 480px;
  570. max-width: 80%;
  571. padding: 45px 0;
  572. border-radius: 10px;
  573. background-image: url(https://static.hitv.com/pc/img/601d3ee.png), url(https://static.hitv.com/pc/img/21b00eb.png);
  574. background-position: 0 0, 100% 280px;
  575. background-repeat: no-repeat;
  576. background-color: #fff;
  577. box-shadow: 0 0 80px rgba(0, 0, 0, 0.25);
  578. opacity: 1;
  579. transform: translate(-50%, -50%);
  580. z-index: 99999;
  581. }
  582. .agreement-root .title {
  583. color: #222;
  584. font-weight: 700;
  585. font-size: 28px;
  586. text-align: center;
  587. }
  588. .agreement-root .content {
  589. width: 100%;
  590. max-height: 70vh;
  591. margin: 35px auto 40px;
  592. overflow-x: hidden;
  593. overflow-y: auto;
  594. }
  595. .agreement-root .content p {
  596. margin: 0 50px 5px;
  597. color: #777;
  598. font-weight: 400;
  599. font-size: 13px;
  600. line-height: 22px;
  601. word-break: break-all;
  602. text-align: justify;
  603. }
  604. .agreement-root .btns {
  605. display: flex;
  606. margin: 0 20px;
  607. justify-content: space-evenly;
  608. }
  609. .agreement-root .btns button {
  610. width: 100px;
  611. height: 45px;
  612. border: none;
  613. border-radius: 25px;
  614. outline: none;
  615. color: #fff;
  616. background: #c2c1c1;
  617. font-weight: 700;
  618. font-size: 15px;
  619. line-height: 45px;
  620. transition: all 0.3s;
  621. cursor: pointer;
  622. }
  623. .agreement-root .btns button:hover {
  624. opacity: 0.7;
  625. }
  626. .agreement-root .btns .agree {
  627. width: 130px;
  628. background: #ffa000;
  629. background: linear-gradient(90deg, #ff5f00, #ffa000);
  630. }
  631. /*$vite$:1*/`);
  632. const $ = window.jQuery || unsafeWindow.jQuery;
  633. const template$3 = '<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"><i class="iconfont icon-loading"></i><span class="text">登录</span></button></div><div class="hint center"><span class="text">还没有账号?</span><span class="to-register-btn span-btn">立即注册</span><span class="temp">或<span class="span-btn c_temp">先不登录</span>,直接使用<font color="red">[注:注册账号获得三次解锁文章权限]</font></span></div></form><i class="iconfont icon-loading"></i></div>';
  634. const infoHtm = '<div class="tb"><div class="row"><div class="label">邮箱账号</div><div class="value">{{ email||- }}<i class="iconfont icon-shuaxin"></i></div></div><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||0 }}<span class="span-btn to-active">添加</span></div></div><p class="hint desc">注意:*下载积分20分下载一次文件,当会员时间到期时解锁文章将消耗下载积分进行解锁(6积分一次,首次注册送18积分)*</p><div class="action-btns"><span class="span-btn jx">解锁全文</span><span class="span-btn to-active">续期</span><span class="span-btn to-local">下载到本地</span><!-- <span class="span-btn to-active" target="_blank">添加下载次数</span> --></div></div>';
  635. const template$2 = '<div class="qk-dialog-container"><div class="mask"></div><div class="dialog-body"></div></div>';
  636. class Dialog {
  637. constructor(opt = {}) {
  638. __publicField(this, "template", template$2);
  639. /** @type {JQuery<HTMLDivElement>} */
  640. __publicField(this, "$el");
  641. this.$el = $(this.template);
  642. opt.mask ? this.$el.find(".mask").show() : this.$el.find(".mask").hide();
  643. }
  644. append(dom) {
  645. this.$el.find(".dialog-body").append(dom);
  646. return this;
  647. }
  648. }
  649. let authPage;
  650. function getAuthPage() {
  651. if (authPage) return authPage;
  652. return new Promise((resolve, reject) => {
  653. const ifr = document.createElement("iframe");
  654. ifr.style.display = "none";
  655. ifr.src = "https://zsh5.qktk.online/auth.html";
  656. document.body.appendChild(ifr);
  657. authPage = ifr;
  658. ifr.onload = () => {
  659. resolve(ifr);
  660. };
  661. ifr.onerror = (error) => {
  662. reject(error);
  663. };
  664. });
  665. }
  666. function ifrEvent(key, data) {
  667. return new Promise(async (resolve, reject) => {
  668. const ifr = await getAuthPage();
  669. const ifrEventHandle = (e) => {
  670. if (e.data.type === key) {
  671. resolve(e.data);
  672. window.removeEventListener("message", ifrEventHandle, false);
  673. }
  674. };
  675. window.addEventListener("message", ifrEventHandle, false);
  676. setTimeout(() => {
  677. reject("timeout");
  678. window.removeEventListener("message", ifrEventHandle, false);
  679. }, 5e3);
  680. ifr.contentWindow.postMessage({
  681. type: key,
  682. ...data
  683. }, "*");
  684. });
  685. }
  686. const getH5Token = async () => {
  687. try {
  688. const data = await ifrEvent("getToken");
  689. return data.token;
  690. } catch (error) {
  691. }
  692. return "";
  693. };
  694. const setH5Token = async (token) => {
  695. if (!token) return false;
  696. try {
  697. await ifrEvent("setToken", { token });
  698. return true;
  699. } catch (error) {
  700. }
  701. return false;
  702. };
  703. const removeH5Token = async () => {
  704. try {
  705. await ifrEvent("removeToken");
  706. return true;
  707. } catch (error) {
  708. }
  709. return false;
  710. };
  711. const getH5DeviceId = async () => {
  712. try {
  713. const data = await ifrEvent("getDeviceId");
  714. return data.deviceId;
  715. } catch (error) {
  716. }
  717. return "";
  718. };
  719. const setH5DeviceId = async (deviceId2) => {
  720. try {
  721. await ifrEvent("setDeviceId", { deviceId: deviceId2 });
  722. return true;
  723. } catch (error) {
  724. }
  725. return false;
  726. };
  727. async function ajax(obj) {
  728. let success = obj.success;
  729. let error = obj.error;
  730. let p;
  731. if (!success) {
  732. p = new Promise((resolve, reject) => {
  733. success = resolve;
  734. error = reject;
  735. });
  736. }
  737. const headers = obj.headers || {};
  738. const token = await getToken();
  739. headers.deviceId = await deviceId();
  740. if (token) {
  741. headers.Authorization = token;
  742. }
  743. obj.headers = headers;
  744. obj.success = success;
  745. obj.error = error;
  746. {
  747. obj.responseType = obj.dataType || "json";
  748. delete obj.dataType;
  749. if (obj.method === "GET") {
  750. const u = new URL(obj.url);
  751. for (const [k, v] of Object.entries(obj.data || {})) {
  752. u.searchParams.append(k, v);
  753. }
  754. delete obj.data;
  755. obj.url = u.href;
  756. } else {
  757. obj.data = JSON.stringify(obj.data);
  758. obj.headers["Content-Type"] = "application/json";
  759. }
  760. obj.onerror = error;
  761. obj.onreadystatechange = (_a2) => {
  762. if (_a2.readyState === 4) {
  763. const { response, status } = _a2;
  764. if (status === 200) {
  765. if ((response == null ? void 0 : response.code) === 401) {
  766. LoginModal.instance.showLogin("登录失效,请重新登录");
  767. error(response);
  768. }
  769. success(response);
  770. } else {
  771. if (status === 401) {
  772. LoginModal.instance.showLogin("登录失效,请重新登录");
  773. }
  774. error(response);
  775. }
  776. }
  777. };
  778. }
  779. const _a = GM_xmlhttpRequest(obj);
  780. return p || _a;
  781. }
  782. const token_key = "token";
  783. async function getToken() {
  784. const token = GM_getValue(token_key);
  785. return token || await getH5Token();
  786. }
  787. function setToken(token) {
  788. setH5Token(token);
  789. return GM_setValue(token_key, token);
  790. }
  791. function removeToken() {
  792. removeH5Token();
  793. return GM_deleteValue(token_key);
  794. }
  795. function setStore(key, value, isQs = true) {
  796. return GM_setValue(key, value);
  797. }
  798. function getStore(key) {
  799. let val = GM_getValue(key);
  800. return val;
  801. }
  802. function removeStore(key) {
  803. return GM_deleteValue(key);
  804. }
  805. async function deviceId() {
  806. let id = getStore("deviceId");
  807. if (!id) {
  808. id = localStorage.getItem("qk_deviceId");
  809. }
  810. if (!id) {
  811. id = await getH5DeviceId();
  812. }
  813. if (!id) {
  814. id = "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(c) {
  815. const r = Math.random() * 16 | 0;
  816. const v = c === "x" ? r : r & 3 | 8;
  817. return v.toString(16);
  818. }).toUpperCase();
  819. setStore("deviceId", id);
  820. localStorage.setItem("qk_deviceId", id);
  821. setH5DeviceId(id);
  822. }
  823. return id;
  824. }
  825. const version2Obj = (version) => {
  826. if (!version) return {};
  827. const [v, build] = version.split("-");
  828. const [major, minor, patch] = v.split(".");
  829. const o = { major, minor, patch, build, v: Number(major + minor + patch) };
  830. return o;
  831. };
  832. function stringTemplate(template2, data) {
  833. return template2.replace(/\{\{(.+?)\}\}/g, (match, key) => {
  834. const [k, def = ""] = key.split("||");
  835. return data[k.trim()] || def.trim();
  836. });
  837. }
  838. async function imgUrl2File(url) {
  839. let fileName = url.split("/").pop();
  840. fileName = fileName.split("?")[0];
  841. let type = fileName.split(".").pop();
  842. const data = await ajax({
  843. url,
  844. method: "GET",
  845. dataType: "blob"
  846. });
  847. const file = new File([data], fileName, { type: "image/" + type });
  848. return file;
  849. }
  850. const base = "https://zsapi.qktk.online/v1/api";
  851. function login(data) {
  852. return ajax({
  853. url: `${base}/user/login`,
  854. method: "POST",
  855. data
  856. });
  857. }
  858. function register(data) {
  859. return ajax({
  860. url: `${base}/user/register`,
  861. method: "POST",
  862. data
  863. });
  864. }
  865. function userTemp(data) {
  866. return ajax({
  867. url: `${base}/user/temp_user`,
  868. method: "POST",
  869. data
  870. });
  871. }
  872. function getUserInfo() {
  873. return ajax({
  874. url: `${base}/user/me`,
  875. method: "GET"
  876. });
  877. }
  878. function sendVerifyCode(data) {
  879. return ajax({
  880. url: `${base}/user/send_verification_code`,
  881. method: "POST",
  882. data
  883. });
  884. }
  885. function useCardkey(data) {
  886. return ajax({
  887. url: `${base}/user/useCardkey`,
  888. method: "POST",
  889. data
  890. });
  891. }
  892. function getArticle(data) {
  893. return ajax({
  894. url: `${base}/client/query`,
  895. data: { ...data, type: "plugin" },
  896. method: "GET"
  897. });
  898. }
  899. function getResourceAuth(data) {
  900. return ajax({
  901. url: `${base}/client/resource/auth`,
  902. data: { ...data },
  903. method: "GET"
  904. });
  905. }
  906. function sourceGetUrl(data) {
  907. return ajax({
  908. url: `${base}/client/getUrl`,
  909. data: { ...data },
  910. method: "POST"
  911. });
  912. }
  913. function getConfig(data) {
  914. return ajax({
  915. url: `${base}/config/get`,
  916. data,
  917. method: "GET"
  918. });
  919. }
  920. 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>';
  921. const template$1 = '<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>';
  922. class Notify {
  923. constructor(options) {
  924. __publicField(this, "template", `
  925. <div class="notify"></div>
  926. `);
  927. /** @type {JQuery<HTMLDivElement>} */
  928. __publicField(this, "$el");
  929. this.options = options;
  930. this.$el = $(this.template);
  931. this.$el.hide();
  932. }
  933. success(msg, delay) {
  934. this.$el.html(msg).attr("class", "notify success");
  935. if (delay === 0) {
  936. this.msg = msg;
  937. this.longMsgType = "success";
  938. }
  939. this.show(delay);
  940. }
  941. error(msg, delay) {
  942. this.$el.html(msg).attr("class", "notify error");
  943. if (delay === 0) {
  944. this.msg = msg;
  945. this.longMsgType = "error";
  946. }
  947. this.show(delay);
  948. }
  949. info(msg, delay) {
  950. this.$el.html(msg).attr("class", "notify info");
  951. if (delay === 0) {
  952. this.msg = msg;
  953. this.longMsgType = "info";
  954. }
  955. this.show(delay);
  956. }
  957. warning(msg, delay) {
  958. this.$el.html(msg).attr("class", "notify warning");
  959. if (delay === 0) {
  960. this.msg = msg;
  961. this.longMsgType = "warning";
  962. }
  963. this.show(delay);
  964. }
  965. close() {
  966. this.msg = "";
  967. this.longMsgType = "";
  968. this.$el.html("");
  969. clearTimeout(this.__timer);
  970. this.$el.hide();
  971. }
  972. show(delay = 2e3) {
  973. this.$el.show();
  974. clearTimeout(this.__timer);
  975. delay && (this.__timer = setTimeout(() => {
  976. this.$el.fadeOut("slow", () => {
  977. var _a;
  978. if (this.msg) {
  979. (_a = this[this.longMsgType]) == null ? void 0 : _a.call(this, this.msg, 0);
  980. }
  981. });
  982. }, delay));
  983. }
  984. }
  985. class Toast {
  986. static show(text, duration = 2e3) {
  987. const toast = document.createElement("div");
  988. toast.classList.add("qk-toast");
  989. toast.innerText = text;
  990. document.body.appendChild(toast);
  991. setTimeout(() => {
  992. toast.remove();
  993. }, duration);
  994. }
  995. // static showError(text, duration = 2000) {
  996. // const toast = document.createElement('div')
  997. // toast.classList.add('qk-toast', 'error')
  998. // toast.innerText = text
  999. // document.body.appendChild(toast)
  1000. // setTimeout(() => {
  1001. // toast.remove()
  1002. // }, duration)
  1003. // }
  1004. // constructor() {
  1005. // this.toast = document.createElement('div')
  1006. // this.toast.classList.add('qk-toast')
  1007. // this.toast.innerText = '加载中...'
  1008. // document.body.appendChild(this.toast)
  1009. // }
  1010. }
  1011. class Confirm {
  1012. constructor(options) {
  1013. __publicField(this, "instance", null);
  1014. __publicField(this, "template", `<div class="confirm-wrapper">
  1015. <div class="confirm-box">
  1016. <div class="confirm-title">提示</div>
  1017. <div class="confirm-content"></div>
  1018. <div class="confirm-btn-wrapper">
  1019. <button class="confirm-btn confirm-cancel">取消</button>
  1020. <button class="confirm-btn confirm-ok">确定</button>
  1021. </div>
  1022. </div>`);
  1023. this.options = options;
  1024. this.$el = $(this.template);
  1025. (options == null ? void 0 : options.hideCancel) && this.$el.find(".confirm-cancel").hide();
  1026. this.$el.hide();
  1027. this.initEvent();
  1028. this.$el.appendTo("body");
  1029. }
  1030. initEvent() {
  1031. this.$el.find(".confirm-cancel").on("click", () => {
  1032. var _a;
  1033. this.$el.hide();
  1034. (_a = this.cancel) == null ? void 0 : _a.call(this);
  1035. });
  1036. this.$el.find(".confirm-ok").on("click", () => {
  1037. var _a;
  1038. this.$el.hide();
  1039. (_a = this.ok) == null ? void 0 : _a.call(this);
  1040. });
  1041. }
  1042. static show(content, options) {
  1043. return new Promise((resolve, reject) => {
  1044. const confirm = Confirm.instance || new Confirm(options);
  1045. Confirm.instance = confirm;
  1046. confirm.show(content);
  1047. confirm.cancel = reject;
  1048. confirm.ok = resolve;
  1049. });
  1050. }
  1051. show(content) {
  1052. this.$el.show().find(".confirm-content").html(content);
  1053. }
  1054. }
  1055. const _Active = class _Active {
  1056. constructor() {
  1057. __publicField(this, "tips", {
  1058. 30: '您购买的是月卡,店铺五星好评后截图发管理员(v:<font color="red">qk_admin</font>)送一次下载次数[限时活动]',
  1059. 90: '您购买的是季卡,店铺五星好评后截图发管理员(v:<font color="red">qk_admin</font>)送三次下载次数[限时活动]',
  1060. 365: '您购买的是年卡,本店铺限时活动赠送20次下载次数,请联系管理员领取(v:<font color="red">qk_admin</font>)'
  1061. });
  1062. __publicField(this, "template", template$1);
  1063. /** @type {JQuery<HTMLDivElement>} */
  1064. __publicField(this, "$el", null);
  1065. /** @type {Dialog} */
  1066. __publicField(this, "dialog", null);
  1067. /** @type {Notify} */
  1068. __publicField(this, "notify", null);
  1069. __publicField(this, "_insert", false);
  1070. if (_Active.instance) {
  1071. return _Active.instance;
  1072. }
  1073. this.$el = $(this.template);
  1074. this.$el.find("#convert").on("click", this.active.bind(this));
  1075. this.$el.find(".close").on("click", () => {
  1076. this.hide();
  1077. });
  1078. this.dialog = new Dialog();
  1079. this.dialog.append(this.$el);
  1080. this.notify = new Notify();
  1081. this.$el.append(this.notify.$el);
  1082. this.renderGoods();
  1083. this.renderTip();
  1084. }
  1085. renderGoods() {
  1086. const goodsQr = LoginModal.instance.getConfig("goodsQr");
  1087. const goodsUrl = LoginModal.instance.getConfig("goodsUrl");
  1088. const goodsTip = LoginModal.instance.getConfig("goodsTip");
  1089. if (!(goodsQr == null ? void 0 : goodsQr.value) && !(goodsUrl == null ? void 0 : goodsUrl.value)) {
  1090. this.$el.find(".right").hide();
  1091. }
  1092. if (goodsQr == null ? void 0 : goodsQr.value) {
  1093. this.$el.find(".goods-qr").attr("src", goodsQr.value);
  1094. }
  1095. if (goodsUrl == null ? void 0 : goodsUrl.value) {
  1096. this.$el.find(".goods-url").attr("href", goodsUrl.value);
  1097. }
  1098. if (goodsTip == null ? void 0 : goodsTip.value) {
  1099. this.$el.find(".right .tip").html(goodsTip.value);
  1100. }
  1101. const help = LoginModal.instance.getConfig("help");
  1102. if (help == null ? void 0 : help.value) {
  1103. this.$el.find(".right .icon-help").on("click", () => {
  1104. window.open(help.value);
  1105. });
  1106. } else {
  1107. this.$el.find(".right .icon-help").hide();
  1108. }
  1109. }
  1110. renderTip() {
  1111. const tip = LoginModal.instance.getConfig("activeTip");
  1112. this.$el.find(".left .tip").html((tip == null ? void 0 : tip.value) || "");
  1113. }
  1114. show() {
  1115. if (window !== top) return;
  1116. if (this._insert) {
  1117. this.dialog.$el.show();
  1118. return;
  1119. }
  1120. this.dialog.$el.appendTo(document.body);
  1121. this._insert = true;
  1122. this.dialog.$el.show();
  1123. }
  1124. hide() {
  1125. this.dialog.$el.hide();
  1126. }
  1127. async active() {
  1128. var _a;
  1129. const { $el } = this;
  1130. const key = $el.find("input[name=key]").val();
  1131. if (!key) {
  1132. return this.notify.warning("请输入激活码");
  1133. }
  1134. try {
  1135. const res = await useCardkey({ key });
  1136. if (res.success) {
  1137. this.notify.success(res.message);
  1138. (_a = LoginModal.instance) == null ? void 0 : _a.showInfo();
  1139. $el.find("input[name=key]").val("");
  1140. this.hide();
  1141. Toast.show("激活成功");
  1142. if (res.data >= 30) {
  1143. const tip = this.tips[res.data];
  1144. tip && Confirm.show(tip, { hideCancel: true });
  1145. }
  1146. } else {
  1147. this.notify.error(res.message, 3e3);
  1148. }
  1149. } catch (error) {
  1150. this.notify.error((error == null ? void 0 : error.message) || "激活失败!", 3e3);
  1151. }
  1152. }
  1153. };
  1154. /** @type {Active} */
  1155. __publicField(_Active, "instance", null);
  1156. __publicField(_Active, "show", () => {
  1157. if (!_Active.instance) {
  1158. _Active.instance = new _Active();
  1159. }
  1160. _Active.instance.show();
  1161. });
  1162. let Active = _Active;
  1163. const template = '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>{{ title }}</title>{{links}}<style type="text/css">body,h1,h2,h3,h4,h5,h6,ul,li,ol,dl,dt,dd,p,span,div,object,iframe,pre,a,abbr,cite,input,button,select,option {margin: 0;padding: 0;font-weight: normal;box-sizing: border-box;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;}ul,li,ol,dl,dd,dt,form {list-style: none;margin: 0;padding: 0;}body {background-color: #f5f6f7;line-height: 24px;font-size: 16px;font-family: "PingFang SC", "Microsoft YaHei", "SimHei", "Arial","SimSun";}img {border: 0;outline: none;}em,i {font-style: normal;}h1,h2,h3,h4,h5,h6 {font-family: "PingFang SC", "Microsoft YaHei", "SimHei", "Arial","SimSun";}#content_views {width: 1010px;margin: 2px auto;padding: 20px;background-color: white;border-radius: 4px;}#articleContentId.title-article {font-size: 28px;word-wrap: break-word;color: #222226;font-weight: 600;margin: 0;margin-bottom: 24px;word-break: break-all;}</style><style type="text/css">.hljs-ln {border-collapse: collapse;}.hljs-ln td {padding: 0;}.hljs-ln-n {text-align: right;padding-right: 8px;}.hljs-ln-n:before {content: attr(data-line-number);}</style></head><body><div id="content_views" class="{{contentClass}}">{{ content }}</div></body></html>';
  1164. const _CSDN = class _CSDN {
  1165. constructor() {
  1166. __publicField(this, "config", {
  1167. hideOBtn: false
  1168. });
  1169. __publicField(this, "$hideBox", $(".hide-article-box"));
  1170. __publicField(this, "loading", false);
  1171. __publicField(this, "dload", false);
  1172. this.exCopyAstrict();
  1173. this.normalMore();
  1174. this.loginModule();
  1175. this.createDetailBtn();
  1176. this.immersionRead();
  1177. this.createDownload();
  1178. }
  1179. exCopyAstrict() {
  1180. document.addEventListener(
  1181. "copy",
  1182. (e) => {
  1183. e.stopPropagation();
  1184. },
  1185. true
  1186. );
  1187. $(".hljs-button.signin").attr("data-title", "复制").removeClass("active").removeAttr("onClick");
  1188. $("#content_views").on("click", ".hljs-button.signin", function(e) {
  1189. navigator.clipboard.writeText(
  1190. $(this).parent()[0].innerText.replace(/[\u00A0]/gi, " ")
  1191. ).then((res) => {
  1192. $(this).attr("data-title", "复制成功");
  1193. setTimeout(() => {
  1194. $(this).attr("data-title", "复制");
  1195. }, 3e3);
  1196. });
  1197. });
  1198. }
  1199. immersionRead() {
  1200. setTimeout(() => {
  1201. if ($(".option-box.sidecolumn").length) return;
  1202. const hide_aside = +getStore("hide_aside") || 0;
  1203. const $btn = $(`<a class="option-box sidecolumn" style="display:flex">
  1204. <span class="hide">
  1205. <img src="https://csdnimg.cn/release/blogv2/dist/pc/img/iconHideSide.png" alt="" srcset="">
  1206. <span class="show-txt">隐藏<br>侧栏</span>
  1207. </span>
  1208. <span class="show" style="display:none">
  1209. <img src="https://csdnimg.cn/release/blogv2/dist/pc/img/iconShowSide.png" alt="" srcset="">
  1210. <span class="show-txt">显示<br>侧栏</span>
  1211. </span>
  1212. </a>`);
  1213. const $aside = $(".blog_container_aside");
  1214. const $right = $(".recommend-right");
  1215. const showBtn = (type) => {
  1216. if (type) {
  1217. $right.addClass("hide-aside");
  1218. $aside.addClass("hide-aside");
  1219. $btn.find(".show").show();
  1220. $btn.find(".hide").hide();
  1221. $btn.attr("data-type", "show");
  1222. } else {
  1223. $right.removeClass("hide-aside");
  1224. $aside.removeClass("hide-aside");
  1225. $btn.find(".show").hide();
  1226. $btn.find(".hide").show();
  1227. $btn.attr("data-type", "hide");
  1228. }
  1229. };
  1230. showBtn(hide_aside);
  1231. $btn.on("click", function() {
  1232. const type = this.dataset.type || "hide";
  1233. if (type === "hide") {
  1234. showBtn(1);
  1235. setStore("hide_aside", 1);
  1236. } else {
  1237. showBtn(0);
  1238. setStore("hide_aside", 0);
  1239. }
  1240. });
  1241. $(".csdn-side-toolbar .option-box").eq(0).before($btn);
  1242. }, 1e3);
  1243. }
  1244. normalMore() {
  1245. const btn = this.$hideBox.find(".btn-readmore");
  1246. if (btn.length) {
  1247. btn.removeClass("no-login").find(".follow-text").text("展开全文");
  1248. }
  1249. }
  1250. loginModule() {
  1251. const loginBtn = $(".toolbar-btns .toolbar-btn-login");
  1252. let btnClick = false;
  1253. loginBtn.on("click", () => btnClick = true);
  1254. const mutation = new MutationObserver((mon) => {
  1255. const lgm = mon.find(
  1256. (m) => $(m.addedNodes[0]).hasClass("passport-login-container")
  1257. );
  1258. if (lgm) {
  1259. const dom = $(lgm.addedNodes[0]);
  1260. if (!btnClick) dom.remove();
  1261. else dom.find("img").one("click", () => btnClick = false);
  1262. }
  1263. });
  1264. mutation.observe(document.body, { childList: true });
  1265. }
  1266. footerList() {
  1267. function fn() {
  1268. const list = $(".recommend-item-box");
  1269. list.each((i, el) => {
  1270. if ($(el).find(".list-type-box")[0]) return;
  1271. const url = $(el).attr("data-url") || "";
  1272. if (!url) return;
  1273. if (url.indexOf("blog.csdn.net") !== -1) {
  1274. $(el).prepend(`<div class="list-type-box">博</div>`);
  1275. } else if (url.indexOf("download.csdn.net") !== -1) {
  1276. $(el).prepend(`<div class="list-type-box">文</div>`);
  1277. } else if (url.indexOf("edu.csdn.net") !== -1) {
  1278. $(el).prepend(`<div class="list-type-box">育</div>`);
  1279. } else {
  1280. $(el).prepend(`<div class="list-type-box">其</div>`);
  1281. }
  1282. });
  1283. }
  1284. setTimeout(() => {
  1285. fn();
  1286. }, 5e3);
  1287. }
  1288. createDetailBtn() {
  1289. const $moreBtn = $(`<a class="openvippay" style="margin-top: 10px;">
  1290. <i class="logo-icon">${loginSvg}</i><span>解锁全文</span>
  1291. <i class="iconfont icon-loading"></i>
  1292. </a>`);
  1293. $moreBtn.on("click", csdnDetail);
  1294. const $vipMask = this.$hideBox.find(".vip-mask");
  1295. if ($vipMask.length) {
  1296. this.config.hideOBtn && $("#getVipUrl").hide();
  1297. this.$hideBox.find(".vip-mask").append($moreBtn);
  1298. _CSDN.csdnDetail = csdnDetail;
  1299. }
  1300. const $column = this.$hideBox.find(".column-mask");
  1301. if ($column.length) {
  1302. const group = document.querySelector(".column-group");
  1303. if (group) {
  1304. const btn = group.querySelector(
  1305. ".column-studyvip-free,.article-column-subscribe"
  1306. );
  1307. if (!btn) {
  1308. return;
  1309. }
  1310. }
  1311. const $div = $('<div class="vip-mask"></div>');
  1312. $column.after($div);
  1313. $div.append($moreBtn);
  1314. _CSDN.csdnDetail = csdnDetail;
  1315. this.config.hideOBtn && $column.hide();
  1316. }
  1317. }
  1318. async downloadAritcle() {
  1319. const $content = $("#content_views");
  1320. if (_CSDN.csdnDetail && !$content.hasClass("rendered")) {
  1321. LoginModal.instance.notify.error("请先解锁文章,再下载");
  1322. return;
  1323. }
  1324. const $title = $("#articleContentId");
  1325. const title = $title.text();
  1326. let html = $content.html();
  1327. const imgs = $content.find("img");
  1328. const imgsUrl = imgs.map((i, el) => {
  1329. const src = el.src;
  1330. return src;
  1331. });
  1332. if (this.dload) return Toast.show("正在处理下载中,请稍等");
  1333. if (!window.JSZip) return Toast.show("下载失败,请联系管理员");
  1334. this.dload = true;
  1335. const zip = new JSZip();
  1336. const folder = zip.folder("files");
  1337. await Promise.all(
  1338. imgsUrl.get().map(async (src) => {
  1339. const file = await imgUrl2File(src);
  1340. html = html.replace(src, "./files/" + file.name);
  1341. folder.file(file.name, file);
  1342. })
  1343. );
  1344. const styles = await this.loadStyleSheets(folder);
  1345. const links = styles.map((link) => `<link rel="stylesheet" href="${link}">`);
  1346. const htmlDom = $(`<div>${$title.get(0).outerHTML}${html}</div>`);
  1347. htmlDom.find(".hide-preCode-box").remove();
  1348. zip.file(
  1349. (articleId || title) + ".html",
  1350. stringTemplate(template, {
  1351. content: htmlDom.html(),
  1352. title,
  1353. contentClass: $content.get(0).className,
  1354. codeStyle: codeStyle || "atom-one-light",
  1355. links: links.join("\n")
  1356. })
  1357. );
  1358. const blob = await zip.generateAsync({ type: "blob" });
  1359. const url = URL.createObjectURL(blob);
  1360. const a = document.createElement("a");
  1361. a.href = url;
  1362. a.download = title + ".zip";
  1363. a.click();
  1364. URL.revokeObjectURL(url);
  1365. this.dload = false;
  1366. }
  1367. async loadStyleSheets(folder) {
  1368. var _a;
  1369. const sheets = document.styleSheets;
  1370. const styles = [];
  1371. for (let i = 0; i < sheets.length; i++) {
  1372. const element = sheets[i];
  1373. const cssname = (_a = element.href) == null ? void 0 : _a.split("/").pop();
  1374. if ([
  1375. "detail_enter",
  1376. "kdoc_html_views",
  1377. "ck_htmledit_views",
  1378. "markdown_views",
  1379. "style",
  1380. codeStyle || "-------"
  1381. ].some((name) => cssname == null ? void 0 : cssname.includes(name))) {
  1382. const namePath = "./files/" + cssname;
  1383. const css = await ajax({
  1384. url: element.href,
  1385. method: "GET",
  1386. dataType: "text"
  1387. });
  1388. folder.file(cssname, css);
  1389. styles.push(namePath);
  1390. }
  1391. }
  1392. return styles;
  1393. }
  1394. createDownload() {
  1395. var _a, _b;
  1396. const $downloadBtn = $(`<button type="button" class="el-button relative el-button--warning el-button--medium qk-download" >
  1397. <i class="logo-icon">${loginSvg}</i>
  1398. <i class="el-icon-loading"></i>
  1399. <span class="va-middle show">下载文件</span>
  1400. </button>`);
  1401. $downloadBtn.find(".el-icon-loading").hide();
  1402. const data = (_b = (_a = unsafeWindow == null ? void 0 : unsafeWindow.__INITIAL_STATE__) == null ? void 0 : _a.pageData) == null ? void 0 : _b.sourceInfo;
  1403. async function downloadClick() {
  1404. var _a2;
  1405. if (!LoginModal.instance.userData) {
  1406. LoginModal.instance.show();
  1407. LoginModal.instance.notify.warning("请先登录");
  1408. return;
  1409. }
  1410. try {
  1411. const params = {
  1412. fileId: data.sourceId,
  1413. type: data.fileType,
  1414. name: data.title,
  1415. /** @type {string} */
  1416. description: data.description.substr(0, 512),
  1417. title: data.title,
  1418. size: data.fileSize,
  1419. url: location.origin + location.pathname,
  1420. // path: '/files/' + dayjs().format('YYYY-MM-DD') + '/' + data.sourceId + '.' + data.fileType,
  1421. author: data.sourceAuthor,
  1422. // platform: PLATFORM_TYPE.CSDN,
  1423. price: data.sourcePrice,
  1424. score: data.sourceScore,
  1425. uploadTime: data.pubDate
  1426. };
  1427. $downloadBtn.attr("disabled", "disabled").addClass("is-loading").find(".el-icon-loading").show();
  1428. $downloadBtn.find(".logo-icon").hide();
  1429. const res = await sourceGetUrl(params);
  1430. (_a2 = LoginModal.instance) == null ? void 0 : _a2.showInfo();
  1431. if (res.success) {
  1432. const resData = res.data;
  1433. console.log(resData);
  1434. const a = document.createElement("a");
  1435. a.href = resData.url;
  1436. a.download = [data.title, data.fileType].join(".");
  1437. a.click();
  1438. Toast.show("搜寻成功,正在为您下载!");
  1439. } else if (res.code === 400) {
  1440. Active.show();
  1441. Active.instance.notify.warning(
  1442. "您的下载积分不足,请充值后再使用",
  1443. 5e3
  1444. );
  1445. } else {
  1446. Toast.show(res.message);
  1447. }
  1448. } catch (error) {
  1449. Toast.show("文件资源搜寻失败,后台已记录,正在扩大搜索范围");
  1450. } finally {
  1451. $downloadBtn.removeClass("is-loading").attr("disabled", false).find(".el-icon-loading").hide();
  1452. $downloadBtn.find(".logo-icon").show();
  1453. }
  1454. }
  1455. if (!data) return;
  1456. $downloadBtn.on("click", downloadClick)
  1457. if ((data == null ? void 0 : data.sourcePrice) === 0) {
  1458. $("#downloadBtn .el-button").first().before($downloadBtn);
  1459. $(".nav-bottom-wrap .el-button").first().before($downloadBtn.clone(true));
  1460. // $("#downloadBtn .el-button,.nav-bottom-wrap .el-button").find(".qk-download").on("click", downloadClick);
  1461. } else {
  1462. getResourceAuth({ url: location.origin + location.pathname }).then(
  1463. (res) => {
  1464. if (res.success) {
  1465. $("#downloadBtn .el-button").first().before($downloadBtn);
  1466. $(".nav-bottom-wrap .el-button").first().before($downloadBtn.clone(true));
  1467. }
  1468. }
  1469. );
  1470. }
  1471. }
  1472. };
  1473. /** @type CSDN */
  1474. __publicField(_CSDN, "instance", null);
  1475. let CSDN = _CSDN;
  1476. function markdown_line() {
  1477. $(".markdown_views pre").addClass("prettyprint"), $("pre.prettyprint code").each(function() {
  1478. var t = $(this).text().split("\n").length + ($(this).hasClass("hljs") ? 1 : 0), e = $("<ul/>").addClass("pre-numbering").hide();
  1479. $(this).addClass("has-numbering").parent().append(e);
  1480. for (var o = 1; o < t; o++) e.append($("<li/>").text(o));
  1481. e.fadeIn(1700);
  1482. }), $(".pre-numbering li").css("color", "#999"), setTimeout(function() {
  1483. $(".math").each(function(t, e) {
  1484. $(this).find("span").last().css("color", "#fff");
  1485. });
  1486. }), setTimeout(function() {
  1487. $(".toc a[target='_blank']").attr("target", ""), $("a.reversefootnote,a.footnote").attr("target", "");
  1488. }, 500);
  1489. }
  1490. function createMenu(dom) {
  1491. var _a, _b;
  1492. const menuBox = $(".toc-box");
  1493. const menu = dom.find(".toc ul");
  1494. const _menu = $((_a = menu[0]) == null ? void 0 : _a.outerHTML.replace(/ul|ul/g, "ol"));
  1495. _menu.find("li").each(function(i, el) {
  1496. if (el.querySelector("ul,ol")) {
  1497. el.classList.add("sub-box");
  1498. }
  1499. });
  1500. menuBox.html((_b = _menu[0]) == null ? void 0 : _b.outerHTML);
  1501. }
  1502. async function csdnDetail() {
  1503. var _a;
  1504. const $btn = $(this);
  1505. const $content = $("#content_views");
  1506. let refresh = false;
  1507. if (!LoginModal.instance.userData) {
  1508. LoginModal.instance.show();
  1509. LoginModal.instance.notify.warning("请先登录");
  1510. return;
  1511. }
  1512. if (LoginModal.instance.expirationTime <= 0) {
  1513. if (LoginModal.instance.userData.points < 6) {
  1514. Active.show();
  1515. Active.instance.notify.warning("您的使用时间已到,需要续期再使用", 5e3);
  1516. return;
  1517. } else {
  1518. await Confirm.show(
  1519. "您的文章解锁使用时间已到期,将使用下载积分解锁文章(6积分一次;20积分下载一次文件,当前积分:" + LoginModal.instance.userData.points + "),是否继续?"
  1520. );
  1521. refresh = true;
  1522. }
  1523. }
  1524. if (CSDN.instance.loading) {
  1525. return;
  1526. }
  1527. if ($content.hasClass("rendered")) {
  1528. LoginModal.instance.notify.success("已解锁全部内容");
  1529. Toast.show("已解锁全部内容");
  1530. return;
  1531. }
  1532. $btn.addClass("btn-loading");
  1533. CSDN.instance.loading = true;
  1534. try {
  1535. const res = await getArticle({
  1536. url: location.origin + location.pathname,
  1537. type: "plugin",
  1538. title: $("#articleContentId").text()
  1539. });
  1540. if (res.success) {
  1541. if (refresh) {
  1542. LoginModal.instance.showInfo();
  1543. }
  1544. $content.html(res.data);
  1545. (_a = document.querySelector("#article_content")) == null ? void 0 : _a.removeAttribute("style");
  1546. $content.addClass("rendered");
  1547. setTimeout(() => {
  1548. markdown_line();
  1549. createMenu($content);
  1550. $content.find("pre").each(function(t, e) {
  1551. var _a2;
  1552. e = $(e);
  1553. const code = e.find("code");
  1554. code.hasClass("hljs") && ((_a2 = hljs == null ? void 0 : hljs.lineNumbersBlock) == null ? void 0 : _a2.call(hljs, code[0])) || (hljs == null ? void 0 : hljs.highlightElement(code[0]));
  1555. code.append(
  1556. `<div class="hljs-button signin" data-title="复制"></div>`
  1557. ), code.height() > 340 ? (e.addClass("set-code-hide"), e.append(
  1558. '<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>'
  1559. )) : e.addClass("set-code-show");
  1560. });
  1561. $content.on("click", ".hide-preCode-bt", function() {
  1562. $(this).parents("pre").removeClass("set-code-hide").addClass("set-code-show"), $(this).parents(".hide-preCode-box").hide().remove(), $(window).resize().scroll();
  1563. });
  1564. $(".hide-article-box").hide();
  1565. });
  1566. } else {
  1567. Toast.show(res.message || "此文章查询失败,已添加记录,请稍后重试!");
  1568. }
  1569. } catch (error) {
  1570. Toast.show("网络连接失败,请稍后重试!");
  1571. } finally {
  1572. CSDN.instance.loading = false;
  1573. $btn.removeClass("btn-loading");
  1574. }
  1575. }
  1576. CSDN.instance = new CSDN();
  1577. const _LoginModal = class _LoginModal {
  1578. constructor() {
  1579. __publicField(this, "template", template$3);
  1580. __publicField(this, "logTp", `<div class="log-info">当前版本:{{ version }}</div>`);
  1581. __publicField(this, "status", 1);
  1582. __publicField(this, "time", 60);
  1583. /** 剩余使用时间毫秒 */
  1584. __publicField(this, "expirationTime", 0);
  1585. __publicField(this, "userData", null);
  1586. __publicField(this, "configList", []);
  1587. __publicField(this, "T", null);
  1588. /** @type {JQuery<HTMLDivElement>} */
  1589. __publicField(this, "$el", null);
  1590. /** @type {JQuery<HTMLDivElement>} */
  1591. __publicField(this, "$spirit");
  1592. /** @type {Notify} */
  1593. __publicField(this, "notify", null);
  1594. /** @type {Dialog} */
  1595. __publicField(this, "dialog", null);
  1596. __publicField(this, "configKeys", ["goodsQr", "goodsUrl", "goodsTip", "activeTip", "greeting", "ctemp", "version", "zh2h5", "help", "updateUrl"]);
  1597. __publicField(this, "_insert", false);
  1598. __publicField(this, "_isShow", true);
  1599. if (_LoginModal.instance) {
  1600. return _LoginModal.instance;
  1601. }
  1602. getConfig({ key: this.configKeys.join() }).then((res) => {
  1603. if (res.success) {
  1604. this.configList = res.data || [];
  1605. this.render2buy();
  1606. }
  1607. });
  1608. const dom = $(`${this.template}`);
  1609. const version = this.version();
  1610. if (version) {
  1611. this.logDom = $(stringTemplate(this.logTp, { version }));
  1612. dom.append(this.logDom);
  1613. }
  1614. this.$el = dom;
  1615. this.dialog = new Dialog();
  1616. this.dialog.append(dom);
  1617. this.notify = new Notify();
  1618. this.$el.append(this.notify.$el);
  1619. this.renderSpirit();
  1620. if (getToken()) {
  1621. this.showInfo(getStore("user"));
  1622. }
  1623. this.show();
  1624. this.initLoginEvents();
  1625. }
  1626. initLoginEvents() {
  1627. const { $el } = this;
  1628. const that = this;
  1629. $el.find(".close").on("click", function() {
  1630. that.hide();
  1631. });
  1632. $el.find(".to-register-btn").on("click", function() {
  1633. that.loginStatus($el);
  1634. });
  1635. $el.find(".code-send").on("click", function() {
  1636. const destination = $el.find("input[name=username]").val();
  1637. if (!destination) {
  1638. return that.notify.warning("请输入邮箱地址");
  1639. } else if (!that.verifyEmail(destination)) {
  1640. return that.notify.warning("请输入正确的邮箱地址");
  1641. }
  1642. $(this).attr("disabled", true);
  1643. that.sendCode(destination);
  1644. });
  1645. $el.find(".submit").on("click", async function(e) {
  1646. e.preventDefault();
  1647. $(this).attr("disabled", true).addClass("btn-loading");
  1648. await that.submit();
  1649. $(this).attr("disabled", false).removeClass("btn-loading");
  1650. });
  1651. $el.on("mouseenter", () => {
  1652. this.__closeTimer && clearTimeout(this.__closeTimer);
  1653. });
  1654. $el.on("mouseleave", this.downCountClose.bind(this));
  1655. // this.downCountClose();
  1656. if(this.userData) this.hide();
  1657. }
  1658. show() {
  1659. var _a;
  1660. if (window !== top) return;
  1661. this.downCountClose();
  1662. (_a = this.$spirit) == null ? void 0 : _a.hide();
  1663. this._isShow = true;
  1664. if (this._insert) {
  1665. this.dialog.$el.show();
  1666. return;
  1667. }
  1668. this.dialog.$el.appendTo(document.body);
  1669. this._insert = true;
  1670. this.dialog.$el.show();
  1671. }
  1672. showLogin(msg) {
  1673. var _a;
  1674. removeToken();
  1675. this.show();
  1676. this.$el.find("form").show();
  1677. this.userData = null;
  1678. removeStore("user");
  1679. (_a = this.$info) == null ? void 0 : _a.remove();
  1680. this.$info = null;
  1681. this.notify.close();
  1682. msg && this.notify.error(msg, 3e3);
  1683. }
  1684. hide() {
  1685. var _a, _b;
  1686. (_a = this.dialog.$el) == null ? void 0 : _a.hide();
  1687. (_b = this.$spirit) == null ? void 0 : _b.show();
  1688. this._isShow = false;
  1689. }
  1690. async showInfo(userData) {
  1691. try {
  1692. if (userData) {
  1693. this.renderInfo(userData);
  1694. if (Date.now() - (userData.saveTime || 0) < 3 * 60 * 60 * 1e3) {
  1695. return;
  1696. }
  1697. }
  1698. const { success, data, message, token } = await getUserInfo();
  1699. if (success) {
  1700. data.levelName = data.vipLevel > 1 ? "VIP用户" : "体验用户";
  1701. data.expirationDate = data.expirationDate;
  1702. data.saveTime = Date.now();
  1703. setStore("user", data);
  1704. setToken(token);
  1705. this.renderInfo(data);
  1706. } else {
  1707. this.notify.warning(message);
  1708. }
  1709. } catch (error) {
  1710. console.error(error);
  1711. this.showLogin((error == null ? void 0 : error.message) || "获取用户信息失败");
  1712. }
  1713. }
  1714. async renderInfo(data) {
  1715. var _a;
  1716. this.userData = data;
  1717. (_a = this.$info) == null ? void 0 : _a.remove();
  1718. const infoDom = $(stringTemplate(infoHtm, data));
  1719. this.$el.append(infoDom);
  1720. this.$info = infoDom;
  1721. this.$el.find("form").hide();
  1722. this.render2buy();
  1723. this.initInfoEvent();
  1724. const exDate = new Date(data.expirationDate).getTime();
  1725. const s = exDate - Date.now();
  1726. this.expirationTime = s;
  1727. if (!data.email) {
  1728. this.notify.warning("正在以游客身份使用,<span class='span-btn'>去登陆</span>", 0);
  1729. this.notify.$el.find(".span-btn").on("click", () => {
  1730. this.notify.info("请及时登录!", 3e3);
  1731. this.showLogin();
  1732. });
  1733. return;
  1734. } else if (s <= 0) {
  1735. this.notify.warning("您的会员已到期,请续费再使用!", 0);
  1736. } else if (s <= 3 * 864e5) {
  1737. this.notify.warning("您的会员即将到期,请及时续期!", 0);
  1738. } else {
  1739. this.notify.success("欢迎使用qk插件", 0);
  1740. }
  1741. this.renderGreeting();
  1742. }
  1743. loading() {
  1744. this.$el.addClass("btn-loading");
  1745. }
  1746. loadingEnd() {
  1747. this.$el.removeClass("btn-loading");
  1748. }
  1749. renderGreeting() {
  1750. var _a, _b;
  1751. const greeting = this.getConfig("greeting");
  1752. if ((greeting == null ? void 0 : greeting.value) && this.$info) {
  1753. let [t, v] = greeting == null ? void 0 : greeting.value.split("|");
  1754. v = v || t;
  1755. t = { 1: "info", 2: "warning", 3: "error" }[t] || "success";
  1756. (_b = (_a = this.notify)[t]) == null ? void 0 : _b.call(_a, v, 0);
  1757. }
  1758. }
  1759. render2buy() {
  1760. var _a, _b;
  1761. const urlConfig = this.getConfig("goodsUrl");
  1762. if (urlConfig == null ? void 0 : urlConfig.value) {
  1763. this.$el.find(".to-buy").attr("href", urlConfig.value).css("display", "inline-block");
  1764. } else {
  1765. this.$el.find(".to-buy").hide();
  1766. }
  1767. this.renderGreeting();
  1768. if (this.renderConfig) return;
  1769. const ctemp = this.getConfig("ctemp");
  1770. if (ctemp == null ? void 0 : ctemp.value) {
  1771. this.$el.find(".temp").show().find(".c_temp").on("click", async () => {
  1772. this.loading();
  1773. const res = await userTemp();
  1774. setToken(res.data);
  1775. this.showInfo();
  1776. this.loadingEnd();
  1777. });
  1778. this.$el.find(".hint").removeClass("center");
  1779. }
  1780. const version = this.version();
  1781. const lastVersion = (_a = this.getConfig("version")) == null ? void 0 : _a.value;
  1782. if (version2Obj(version).v < version2Obj(lastVersion).v) {
  1783. const updateUrl = (_b = this.getConfig("updateUrl")) == null ? void 0 : _b.value;
  1784. this.logDom.append(stringTemplate(`,<span>最新版本:<a target="_blank" href="{{updateUrl||javascript:;}}">{{ lastVersion }}</a></span>`, { updateUrl, lastVersion }));
  1785. }
  1786. if (this.configList.length) {
  1787. this.renderConfig = true;
  1788. }
  1789. }
  1790. getConfig(key) {
  1791. return this.configList.find((item) => item.key === key);
  1792. }
  1793. renderSpirit() {
  1794. this.$spirit = $(`<div class="spirit-qk-icon">${loginSvg}</div>`).appendTo(document.body).on("click", () => {
  1795. this.$spirit.hide();
  1796. this.show();
  1797. }).hide();
  1798. }
  1799. initInfoEvent() {
  1800. const { $el } = this;
  1801. CSDN.csdnDetail && $el.find(".jx").show().on("click", CSDN.csdnDetail);
  1802. $el.find(".to-active").on("click", () => {
  1803. Active.instance = new Active();
  1804. Active.instance.show();
  1805. });
  1806. if ($('#articleContentId')[0])
  1807. $el.find(".to-local").on("click", async () => {
  1808. this.loading();
  1809. try {
  1810. await CSDN.instance.downloadAritcle();
  1811. } catch (e) {}
  1812. this.loadingEnd();
  1813. });
  1814. else $el.find(".to-local").hide()
  1815. $el.find(".icon-shuaxin").on("click", async () => {
  1816. this.loading();
  1817. await this.showInfo();
  1818. this.loadingEnd();
  1819. });
  1820. }
  1821. downCountClose() {
  1822. if (!this._isShow) return;
  1823. let delay = this.userData ? 5e3 : 3e3;
  1824. this.__closeTimer = setTimeout(() => {
  1825. this.hide();
  1826. }, delay);
  1827. }
  1828. async submit() {
  1829. const data = this.$el.find("form").serializeArray();
  1830. const params = {};
  1831. let res;
  1832. try {
  1833. if (this.status) {
  1834. const keys = ["username", "password"];
  1835. data.forEach((item) => {
  1836. if (keys.includes(item.name)) {
  1837. params[item.name] = item.value;
  1838. }
  1839. });
  1840. params.type = "email";
  1841. if (!params.username) {
  1842. this.notify.warning("请输入邮箱地址", 3e3);
  1843. return;
  1844. } else if (!params.password) {
  1845. this.notify.warning("请输入密码", 3e3);
  1846. return;
  1847. }
  1848. res = await login(params);
  1849. } else {
  1850. data.forEach((item) => {
  1851. params[item.name] = item.value;
  1852. });
  1853. params.type = "email";
  1854. if (!params.username) {
  1855. this.notify.warning("请输入邮箱地址", 3e3);
  1856. return;
  1857. } else if (!params.password) {
  1858. this.notify.warning("请输入密码", 3e3);
  1859. return;
  1860. } else if (!params.code) {
  1861. this.notify.warning("请填写邮箱验证码", 3e3);
  1862. return;
  1863. } else if (!params.password_confirm) {
  1864. this.notify.warning("请再次输入密码", 3e3);
  1865. return;
  1866. } else if (params.password !== params.password_confirm) {
  1867. this.notify.warning("两次密码不一致", 3e3);
  1868. return;
  1869. }
  1870. res = await register(params);
  1871. }
  1872. if (res.success) {
  1873. this.status = 1;
  1874. setToken(res.data);
  1875. this.showInfo();
  1876. } else {
  1877. this.notify.warning(res.message, 3e3);
  1878. }
  1879. } catch (error) {
  1880. this.notify.error((error == null ? void 0 : error.message) || "登录失败", 3e3);
  1881. }
  1882. }
  1883. async sendCode(email) {
  1884. try {
  1885. const res = await sendVerifyCode({ destination: email, verificationType: "email" });
  1886. if (res.success) {
  1887. this.time = 60;
  1888. this.downCount(this.$el.find(".code-send"));
  1889. this.notify.success("验证码发送成功", 3e3);
  1890. } else {
  1891. this.notify.warning(res.message, 3e3);
  1892. }
  1893. } catch (error) {
  1894. this.$el.find(".code-send").attr("disabled", false);
  1895. this.notify.error((error == null ? void 0 : error.message) || "发送验证码失败", 3e3);
  1896. }
  1897. }
  1898. /**
  1899. * 倒计时
  1900. * @param {JQuery<HTMLElement>} dom
  1901. */
  1902. downCount(dom) {
  1903. dom.text(this.time + "秒后再获取");
  1904. this.T = setTimeout(() => {
  1905. this.time--;
  1906. if (this.time <= 0) {
  1907. dom.text("重新获取");
  1908. dom.attr("disabled", false);
  1909. clearTimeout(this.T);
  1910. } else {
  1911. this.downCount(dom);
  1912. }
  1913. }, 1e3);
  1914. }
  1915. /**
  1916. * 登录和注册ui切换
  1917. * @param {JQuery<HTMLElement>} dom
  1918. */
  1919. loginStatus(dom) {
  1920. if (this.status) {
  1921. dom.find("#confirmP,#code").show();
  1922. dom.find(".hint .text").text("已有账号?");
  1923. dom.find(".to-register-btn").text("立即登录");
  1924. dom.find("h2").text("用户注册");
  1925. dom.find(".submit .text").text("注册");
  1926. this.status = 0;
  1927. } else {
  1928. dom.find("#confirmP,#code").hide();
  1929. dom.find(".hint .text").text("还没账号?");
  1930. dom.find(".to-register-btn").text("立即注册");
  1931. dom.find("h2").text("用户登录");
  1932. dom.find(".submit .text").text("登录");
  1933. this.status = 1;
  1934. }
  1935. }
  1936. verifyEmail(val) {
  1937. return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(val);
  1938. }
  1939. version() {
  1940. var _a;
  1941. return (_a = GM_info == null ? void 0 : GM_info.script) == null ? void 0 : _a.version;
  1942. }
  1943. };
  1944. /** @type {LoginModal} */
  1945. __publicField(_LoginModal, "instance", null);
  1946. let LoginModal = _LoginModal;
  1947. const jumpTmp = `<a class="qk-zh-jump" target="_blank" href="{{href}}">点击继续阅读专栏下一篇 &gt;</a>`;
  1948. class ZhiHu {
  1949. constructor() {
  1950. __publicField(this, "config", {
  1951. hideOBtn: false
  1952. });
  1953. /** @type {JQuery<HTMLDivElement>} */
  1954. __publicField(this, "$content", null);
  1955. this.init();
  1956. }
  1957. init() {
  1958. const that = this;
  1959. this.ImgObs = new IntersectionObserver((entries) => {
  1960. if (entries[0].intersectionRatio <= 0) return;
  1961. const src = entries[0].target.dataset.actualsrc;
  1962. if (!src) return;
  1963. const img = entries[0].target;
  1964. entries[0].target.src = src;
  1965. this.ImgObs.unobserve(entries[0].target);
  1966. const dom = img.nextElementSibling;
  1967. if (dom == null ? void 0 : dom.classList.contains("richText-img-placeholder")) {
  1968. dom.remove();
  1969. }
  1970. });
  1971. const domOb = new MutationObserver((mon) => {
  1972. mon.find((m) => {
  1973. for (let i = 0; i < m.addedNodes.length; i++) {
  1974. const $el = $(m.addedNodes[i]);
  1975. const PaidAnswerFooter2 = $el.hasClass("KfeCollection-PaidAnswerFooter") ? $el : $el.find(".KfeCollection-PaidAnswerFooter");
  1976. if (PaidAnswerFooter2.length) {
  1977. that.generateMoreBtn(PaidAnswerFooter2);
  1978. return;
  1979. }
  1980. }
  1981. });
  1982. });
  1983. domOb.observe(document.body, {
  1984. subtree: true,
  1985. childList: true
  1986. });
  1987. const PaidAnswerFooter = $(".KfeCollection-PaidAnswerFooter");
  1988. if (PaidAnswerFooter.length) {
  1989. that.generateMoreBtn(PaidAnswerFooter);
  1990. }
  1991. }
  1992. /**
  1993. * 点击阅读全文的时候添加按钮
  1994. * @param {JQuery<HTMLDivElement>} dom
  1995. */
  1996. generateMoreBtn(PaidAnswerFooter) {
  1997. const $moreBtn = $(`<a class="qk-openvippay" style="margin-top: 10px;">
  1998. <i class="logo-icon">${loginSvg}</i><span>解锁全文</span>
  1999. <i class="iconfont icon-loading"></i>
  2000. </a>`);
  2001. PaidAnswerFooter.find(".KfeCollection-PurchaseBtn").append($moreBtn);
  2002. const contentItem = PaidAnswerFooter.closest(".ContentItem");
  2003. const oBtn = PaidAnswerFooter.find(".KfeCollection-PurchaseBtn-HybridLink");
  2004. this.config.hideOBtn && oBtn.parent().hide();
  2005. $moreBtn.on("click", () => {
  2006. this.$content = contentItem;
  2007. this.url = contentItem.children("meta[itemprop=url]").attr("content");
  2008. this.zhihuDetail($moreBtn, PaidAnswerFooter);
  2009. });
  2010. }
  2011. is2Web() {
  2012. const c = LoginModal.instance.getConfig("zh2h5");
  2013. return c == null ? void 0 : c.value;
  2014. }
  2015. async zhihuDetail($btn, footer) {
  2016. var _a, _b;
  2017. let refresh = false;
  2018. if (!LoginModal.instance.userData) {
  2019. LoginModal.instance.show();
  2020. LoginModal.instance.notify.warning("请先登录");
  2021. return;
  2022. }
  2023. if (LoginModal.instance.expirationTime <= 0) {
  2024. if (LoginModal.instance.userData.points < 6) {
  2025. Active.show();
  2026. Active.instance.notify.warning("您的使用时间已到,需要续期再使用", 5e3);
  2027. return;
  2028. } else {
  2029. await Confirm.show("您的文章解锁使用时间已到期,将使用下载积分解锁文章(6积分一次解锁文章;20积分下载一次文件,当前积分:" + LoginModal.instance.userData.points + "),是否继续?");
  2030. refresh = true;
  2031. }
  2032. }
  2033. if (this.loading) {
  2034. return;
  2035. }
  2036. const $article = this.$content.find(".RichText");
  2037. $btn.addClass("btn-loading");
  2038. this.loading = true;
  2039. let zop = this.$content.attr("data-zop");
  2040. try {
  2041. zop = JSON.parse(zop);
  2042. } catch (error) {
  2043. }
  2044. try {
  2045. const res = await getArticle({ url: this.url, type: "plugin", title: zop == null ? void 0 : zop.title });
  2046. if (res.success) {
  2047. if (refresh) {
  2048. LoginModal.instance.showInfo();
  2049. }
  2050. const div = document.createElement("div");
  2051. div.innerHTML = res.data.styles;
  2052. let fontname = (_b = (_a = res.data.styles) == null ? void 0 : _a.match(/font-family:([^;]+)/)) == null ? void 0 : _b[1];
  2053. $(div).insertBefore($article);
  2054. const _content = $(res.data.manuscript);
  2055. $article.replaceWith(_content);
  2056. let family = _content[0].style.fontFamily;
  2057. family = family || `${fontname},-apple-system,BlinkMacSystemFont, 'Helvetica Neue','PingFang SC','Microsoft YaHei', 'Source Han Sans SC','Noto Sans CJK SC','WenQuanYi Micro Hei', sans-serif`;
  2058. _content.css("font-family", family);
  2059. if (!_content.hasClass("css-ob6uua")) _content.addClass("css-ob6uua");
  2060. this.is2Web() && this.$content.find(".Copyright-TxtBottom").after(stringTemplate(jumpTmp, { href: "https://zsh5.qktk.online/#/read?a=n&cid=" + res.data.cid }));
  2061. this.imgLazyLoad(_content[0]);
  2062. footer.hide();
  2063. this.loading = false;
  2064. } else {
  2065. Toast.show(res.message || "此文章查询失败,已添加记录,请稍后重试!");
  2066. }
  2067. } catch (error) {
  2068. Toast.show("网络连接失败,请稍后重试!");
  2069. } finally {
  2070. $btn.removeClass("btn-loading");
  2071. this.loading = false;
  2072. }
  2073. }
  2074. imgLazyLoad(content) {
  2075. const imgs = content.querySelectorAll("img");
  2076. imgs.forEach((img, i) => {
  2077. this.ImgObs.observe(img);
  2078. });
  2079. }
  2080. }
  2081. __publicField(ZhiHu, "instance", null);
  2082. ZhiHu.instance = new ZhiHu();
  2083. getStore("agree");
  2084. if (window.top === window) {
  2085. LoginModal.instance = new LoginModal();
  2086. }
  2087. })();