百度贴吧图片点击放大

直接在当前页面点击查看原图(包括签名档)。支持图片的多开、拖拽、垂直或水平滚动和缩放旋转

  1. // ==UserScript==
  2. // @name 百度贴吧图片点击放大
  3. // @namespace https://gf.qytechs.cn/users/51104
  4. // @version 1.7.3
  5. // @description 直接在当前页面点击查看原图(包括签名档)。支持图片的多开、拖拽、垂直或水平滚动和缩放旋转
  6. // @match *://tieba.baidu.com/p/*
  7. // @match *://tieba.baidu.com/f?*
  8. // @exclude *://tieba.baidu.com/f?*kw=*
  9. // @grant GM_addStyle
  10. // @grant GM_setValue
  11. // @grant GM_getValue
  12. // @grant GM_registerMenuCommand
  13. // @author lliwhx
  14. // @license MIT
  15. // @copyright Copyright © 2016-2022 lliwhx
  16. // ==/UserScript==
  17.  
  18. (function (win, doc) {
  19. 'use strict';
  20.  
  21. /* 贴子404不执行。(可修改) */
  22. if(doc.title==='贴吧404')return;
  23.  
  24. var iTarget,
  25. preferences,
  26. gallery,
  27. iMouse,
  28. debounce,
  29. docElement = doc.documentElement,
  30. docWidth = docElement.clientWidth - 5,
  31. docHeight = docElement.clientHeight - 5;
  32.  
  33. // 打开图片函数
  34. function open(e) {
  35. var i,
  36. tSrc,
  37. t = e.target;
  38.  
  39. /* className分别指向BDE_Image新图,j_user_sign签名档,d_content_img老图。只有鼠标左键点击以上图片且不是图册贴里的图片时才会放大图片。(可修改) */
  40. if (!e.button && ['BDE_Image', 'j_user_sign', 'd_content_img'].includes(t.className) && t.parentNode.nodeName !== 'A') {
  41. iTarget = t;
  42. i = doc.createElement('img');
  43. i.className = 'btzi-img';
  44.  
  45. // 如果原图加载失败,直接显示贴子里的压缩图片;图片损坏不加载
  46. i.onerror = function () {
  47. if (this.src !== t.src) {
  48. this.src = t.src;
  49. } else {
  50. t = null;
  51. tSrc = null;
  52. this.onerror = null;
  53. this.onload = null;
  54. }
  55. };
  56.  
  57. // 获取要加载图片的w宽和h高,计算图片的s大小以及x横y纵坐标
  58. i.onload = function () {
  59. var w = this.width,
  60. h = this.height,
  61. s = (!+preferences.size) && (docWidth - w < 0 || docHeight - h < 0) ? Math.min((docWidth - 5) / w,(docHeight - 5) / h) : 1, // 等比例缩小到最长边显示在窗口内或1原图显示
  62. x = docWidth - w * s - 5 > 0 ? (docWidth - w * s) / 2 : 5, // 判断图片w宽是否小于docWidth窗口宽,是则居中,不是则左上角。5表示预留5px位置不贴合
  63. y = docHeight - h * s - 5 > 0 ? (docHeight - h * s) / 2 : 5;
  64. this.iData = {
  65. width: w,
  66. height: h,
  67. x: x,
  68. y: y,
  69. scale: s,
  70. rotate: 0
  71. };
  72. transform(this, x, y, s, 0);
  73. t = null;
  74. x = null;
  75. y = null;
  76. s = null;
  77. tSrc = null;
  78. this.onerror = null;
  79. this.onload = null;
  80. gallery.appendChild(this); // 将加载好的图片插入到图片框架里显示
  81. };
  82.  
  83. /*
  84. 以下两句代码关系着放大后的图片是否是原图,匹配失败打开的则是贴子里被压缩的图片。
  85. 比如某图片直接右键打开是下面这个地址:
  86. http://abc.baidu.com/forum/xxx/sign=xxx/123.jpg?tbpicau=xxx
  87. 用原贴吧图片功能查到原图是下面这个地址:
  88. https://abc.baidu.com/forum/pic/item/123.jpg
  89. 我们需要获取到点击图片的abc和123的内容,然后补全成原图的地址。
  90. 需学习“正则表达式”。(可修改)
  91. */
  92. tSrc = /https?:\/\/(\w+)\.baidu\.com\/.+\/(\w+\.[a-zA-Z]{3,4}([^_]*_?))/.exec(t.src);
  93. if(tSrc && tSrc[3]){
  94. loadComment(i,tSrc[2],t);
  95. }else{
  96. i.src = tSrc ? `//${tSrc[1]}.baidu.com/forum/pic/item/${tSrc[2]}` : t.src;
  97. }
  98. }
  99. }
  100.  
  101. var tiebaTid = /\d+/.exec(location.pathname)[0];
  102.  
  103. function loadComment(i,tSrc,t){
  104. var xhttp = new XMLHttpRequest();
  105. xhttp.onreadystatechange = function() {
  106. if (this.readyState == 4 && this.status == 200) {
  107. i.src = JSON.parse(this.responseText)?.data?.img?.original?.waterurl || t.src;
  108. }
  109. };
  110. tSrc = /(\w+)/.exec(tSrc)[0];
  111. xhttp.open("GET", "https://tieba.baidu.com/photo/p?alt=jview&pic_id="+tSrc+"&tid="+tiebaTid, true);
  112. xhttp.send();
  113. }
  114. // 鼠标按下图片函数
  115. function down(e) {
  116. var t,
  117. data;
  118. if (!e.button) {
  119. t = e.target;
  120. data = t.iData;
  121. iTarget = t;
  122. iMouse = { // 获取鼠标按下时的xy坐标和相对图片的xy坐标
  123. clientX: e.clientX,
  124. clientY: e.clientY,
  125. offsetX: data.x - e.clientX,
  126. offsetY: data.y - e.clientY
  127. };
  128. t = null;
  129. data = null;
  130. e.preventDefault();
  131. e.stopPropagation();
  132. doc.addEventListener('mousemove', move); // 鼠标按下时给页面注册(不可用)鼠标移动和鼠标放开事件
  133. doc.addEventListener('mouseup', up);
  134. }
  135. }
  136.  
  137. // 鼠标移动图片函数
  138. function move(e) {
  139. var t = iTarget,
  140. data = t.iData,
  141. x = e.clientX + iMouse.offsetX,
  142. y = e.clientY + iMouse.offsetY;
  143. e.stopPropagation();
  144. transform(t, x, y, data.scale, data.rotate);
  145. t = null;
  146. x = null;
  147. y = null;
  148. data = null;
  149. }
  150.  
  151. // 固定图片位置函数
  152. function up(e) {
  153. var t,
  154. data,
  155. translate;
  156. if (iMouse.clientX === e.clientX && iMouse.clientY === e.clientY) { // 判断鼠标按下和松开的位置一致才能关闭图片
  157. iTarget = null;
  158. } else {
  159. t = iTarget;
  160. data = t.iData;
  161. translate = /translate\((-?\d+)px,\s?(-?\d+)px\)/.exec(t.getAttribute('style')); // 获取图片变化后的位置导入图片属性内
  162. data.x = translate[1] | 0; // 取整
  163. data.y = translate[2] | 0;
  164. t = null;
  165. data = null;
  166. translate = null;
  167. }
  168. iMouse = null;
  169. doc.removeEventListener('mousemove', move); // 鼠标松开后注销页面鼠标移动和鼠标放开事件
  170. doc.removeEventListener('mouseup', up);
  171. }
  172.  
  173. /* 图片关闭函数。(可修改) */
  174. function close(e) {
  175. var t = e.target;
  176. switch (preferences.closeWindow) {
  177. case 'btzi_gallery': // 关闭图片范围为图片时,点击图片关闭该图片
  178. if (!iTarget) {
  179. t.iData = null;
  180. t.remove();
  181. }
  182. break;
  183. case 'document': // 当关闭图片方式为页面时,点击要放大的图片以外的区域都会关闭所有图片
  184. if (!iTarget || (t !== iTarget && t !== docElement)) {
  185. if(doc.body.classList.contains('btzi-enabled') || t.id === 'btzi_settings_save')break; // 打开用户设置界面,不会关闭图片
  186. gallery.style.display = 'none';
  187. while (gallery.hasChildNodes()) { // 关闭所有图片
  188. gallery.firstChild.iData = null;
  189. gallery.firstChild.remove();
  190. }
  191. gallery.style.display = '';
  192. }
  193. break;
  194. }
  195. t=null;
  196. iTarget = null;
  197. }
  198.  
  199. // 鼠标滚轮函数
  200. function wheel(e) {
  201. var t = e.target,
  202. data = t.iData,
  203. x = data.x,
  204. y = data.y,
  205. s = data.scale,
  206. r = data.rotate,
  207. p = preferences,
  208. eKey = !e.altKey && !e.ctrlKey && !e.shiftKey,
  209. wKey = p.wheelKey,
  210. zKey = p.zoomKey,
  211. rKey = p.rotateKey,
  212. wDirection = p.wheelDirection,
  213. zDirection = p.zoomDirection,
  214. rDirection = p.rotateDirection,
  215. deltaXY = (e.deltaY || e.deltaX) > 0 ? 100 : -100, // 滚轮向下滚动时e.deltaY/e.deltaX返回正值,向上滚动时e.deltaY/e.deltaX返回负值。因使用组合键时浏览器变化的参数不一样,故判断e.deltaY/e.deltaX哪个发生了变化。图片移动设置为一次100px
  216. delta,
  217. tmp,
  218. z;
  219. e.preventDefault();
  220. e.stopPropagation();
  221. if (wKey === 'type' && eKey || wKey !== 'type' && e[wKey]) { // 图片滚轮移动判断
  222. tmp = docHeight - data.height * s; // 只要图片高大于窗口高,就上下移动。
  223. if (tmp < 0) {
  224. delta = r > 90 ? data.height * s : 0; // 图片翻转超过90度后,原本图片的左上角跑到了下方,要增加图片高度计算
  225. z = y - deltaXY * wDirection; // 图片y纵坐标移动后的新纵坐标。相对窗口左上角,往上移(图片到底)减小,往下移(图片到顶)增加
  226. if (z > 5 + delta) { // 到顶
  227. z = 5 + delta;
  228. } else if (z < tmp + delta) { // 到底
  229. z = tmp + delta;
  230. }
  231. data.y = z;
  232. transform(t, x, z, s, r);
  233. return;
  234. }
  235. tmp = docWidth - data.width * s; // 单单只有图片宽大于窗口宽,才左右移动
  236. if (tmp < 0) {
  237. delta = r % 270 ? data.width * s : 0;
  238. z = x - deltaXY * wDirection;
  239. if (z > 5 + delta) {
  240. z = 5 + delta;
  241. } else if (z < tmp + delta) {
  242. z = tmp + delta;
  243. }
  244. data.x = z;
  245. transform(t, z, y, s, r);
  246. return;
  247. }
  248. }
  249. if (zKey === 'type' && eKey || zKey !== 'type' && e[zKey]) { // 图片缩放判断
  250. delta = deltaXY * zDirection > 0 ? 0.1 : -0.1;
  251. z = s + delta;
  252. if ((z < 0.2 && s >= 0.1) || (s < 0.1 && z < 0)) { // 缩放过小不再进行缩放
  253. return;
  254. }
  255. tmp = z / s;
  256. data.x = e.clientX - (e.clientX - x) * tmp; // 计算以鼠标位置进行缩放。e.clientX - x为鼠标距离图片边的距离,* tmp为缩放后的距离,e.clientX - 计算得相对鼠标移动缩放后的图片边距
  257. data.y = e.clientY - (e.clientY - y) * tmp;
  258. data.scale = z;
  259. transform(t, data.x, data.y, z, r);
  260. return;
  261. }
  262. if (rKey === 'type' && eKey || rKey !== 'type' && e[rKey]) { // 图片旋转判断
  263. tmp = data.width; // 对图片内data.width宽data.height高属性进行调换,使旋转后的图片数据正常计算
  264. data.width = data.height;
  265. data.height = tmp;
  266. delta = deltaXY * rDirection > 0 ? 90 : 270; // 270比-90好计算
  267. z = (r + delta) % 360; // 取余。保证为0,90,180,270度
  268. tmp = 0.01745329 * delta;
  269. data.x = e.clientX - (e.clientX - x) * Math.cos(tmp) + (e.clientY - y) * Math.sin(tmp); // 以鼠标位置(e.clientX,e.clientY)为中心,图片坐标(x,y)旋转tmp弧度,计算新坐标
  270. data.y = e.clientY - (e.clientX - x) * Math.sin(tmp) - (e.clientY - y) * Math.cos(tmp);
  271. data.rotate = z;
  272. transform(t, data.x, data.y, s, z);
  273. return;
  274. }
  275. }
  276.  
  277. // 图片动画函数。translate移动,scale缩放,rotate旋转度
  278. function transform(t, x, y, s, r) {
  279. t.style.transform = `translate(${x | 0}px, ${y | 0}px) scale(${s}) rotate(${r}deg)`;
  280. }
  281.  
  282. // 关闭图片的范围是w图片框架还是doc页面
  283. function frame(w) {
  284. return doc.getElementById(w) || doc;
  285. }
  286.  
  287. // 浏览器窗口缩放后重新计算窗口大小,保证图片打开后的位置基于变化后的窗口大小
  288. function resize() {
  289. clearTimeout(debounce);
  290. debounce = setTimeout(function () {
  291. docWidth = docElement.clientWidth - 5;
  292. docHeight = docElement.clientHeight - 5;
  293. }, 500);
  294. }
  295.  
  296. /* 定位到贴子内容,用来注册(不可用)事件。(可修改) */
  297. var postlist = doc.getElementById('j_p_postlist');
  298.  
  299. /* 阻止贴吧默认打开图片方式函数。(可修改) */
  300. var prevent = function (e) {
  301. var t = e.target;
  302. if (!e.button && t.className === 'BDE_Image' && t.parentNode.nodeName !== 'A') { // t.parentNode.nodeName !== 'A'图册贴里的图片打开方式不取消,仍为默认方式
  303. e.stopPropagation();
  304. }
  305. },
  306.  
  307. /* 贴子翻页删除图片函数。(可修改) */
  308. callback = function () {
  309. gallery.style.display = 'none';
  310. while (gallery.hasChildNodes()) {
  311. gallery.firstChild.iData = null;
  312. gallery.firstChild.remove();
  313. }
  314. gallery.style.display = '';
  315. },
  316.  
  317. /* 监听贴子是否翻页。(可修改) */
  318. observer = new MutationObserver(callback);
  319. observer.observe(postlist, {
  320. childList: true
  321. });
  322.  
  323. /* 添加样式。鼠标放到图片上的cursor鼠标样式,放大后图片的btzi-gallery框架位置,以及btzi-img图片定位和hover鼠标经过图片时置顶并显示阴影,active鼠标按下图片后隐藏阴影。(可修改) */
  324. GM_addStyle('.BDE_Image,.d_content_img,.j_user_sign{cursor:zoom-in;}.btzi-gallery{position:fixed;top:0;left:0;z-index:19990801;}.btzi-img{position:absolute;transform-origin:0 0;box-shadow:0 0 7px rgba(0,0,0,.4);}.btzi-img:hover{z-index:20220801;box-shadow:0 0 7px rgb(0,0,0);}.btzi-img:active{box-shadow:0 0 7px rgba(0,0,0,.4);cursor:move;}');
  325.  
  326. /*
  327. 获取btzi-UserSettings用户设置,初次使用设定一个默认值。
  328. open鼠标左键打开图片方式;
  329. close鼠标左键关闭图片方式,closeWindow可关闭图片的范围;
  330. size图片打开后大小;
  331. wheelKey滚动图片组合键,wheelDirection滚动图片滚轮方向;
  332. zoomKey缩放图片组合键,zoomDirection缩放图片滚轮方向;
  333. rotateKey旋转图片组合键,rotateDirection旋转图片滚轮方向。
  334. */
  335. preferences = JSON.parse(GM_getValue('btzi-UserSettings', '{"open": "click","close": "click","closeWindow":"btzi_gallery","size":"100","wheelKey":"type","wheelDirection": "1","zoomKey": "ctrlKey","zoomDirection": "-1","rotateKey": "altKey","rotateDirection": "1"}'));
  336.  
  337. // 创建存放图片的div框架
  338. gallery = doc.createElement('div');
  339. gallery.className = 'btzi-gallery';
  340. gallery.id = 'btzi_gallery';
  341. gallery.addEventListener('mousedown', down); // 给框架注册(不可用)鼠标按下事件,可以移动关闭图片
  342. gallery.addEventListener('wheel', wheel); // 给框架注册(不可用)鼠标滚轮事件,可以滚动图片
  343. doc.body.appendChild(gallery);
  344.  
  345. postlist.addEventListener('click', prevent, true); // 给贴子内容注册(不可用)阻止原图片打开事件
  346. postlist.addEventListener(preferences.open, open, true); // 给贴子内容注册(不可用)打开图片事件
  347. frame(preferences.closeWindow).addEventListener(preferences.close, close); // 给关闭图片的范围注册(不可用)图片关闭图片事件
  348. win.addEventListener('resize', resize); // 给浏览器注册(不可用)窗口缩放事件
  349.  
  350. // 用户设置界面函数
  351. var settings = function () {
  352.  
  353. // 用户设置界面样式
  354. GM_addStyle('.btzi-enabled .btzi-modal,.btzi-enabled .btzi-container{display:flex;}.btzi-modal,.btzi-container{position:fixed;top:0;left:0;display:none;width:100%;height:100%;}.btzi-modal{z-index:20211231;background-color:rgba(0,0,0,.7);}.btzi-container{z-index:20220101;justify-content:center;align-items:center;text-align:left;}.btzi-content{width:335px;border-radius:6px;background-color:#fff;}.btzi-header,.btzi-body,.btzi-footer{padding:11px;}.btzi-header{border-bottom:1px solid #e6ecf0;}.btzi-title{padding:0;margin:0;font:400 20px sans-serif;color:#000;text-align:center;}.btzi-group{padding:0;margin:0;margin-bottom:15px;border:0;}.btzi-legend,.btzi-controls,.btzi-select,.btzi-button{font:14px sans-serif;color:#000;}.btzi-legend{padding:5px 0;margin:0;float:left;width:81px;text-align:right;}.btzi-controls{margin-left:93px;clear:none;}.btzi-select{box-sizing:border-box;padding:4px;margin:0;width:180px;height:30px;border:1px solid #e6ecf0;border-radius:3px;appearance:auto;}.btzi-select:focus{outline:#f0f auto;}.btzi-footer{text-align:center;border-top:1px solid #e6ecf0;}.btzi-button{padding:9px 18px;border:0;border-radius:75px;font-weight:700;color:#fff;background:#4ab3f4;cursor:pointer;transition:box-shadow .17s ease-in-out;}.btzi-button:hover,.btzi-button:active{background:#1da1f2;}.btzi-button:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #a4d9f9;}.btzi-button:active{box-shadow:0 0 0 2px #fff,0 0 0 4px #4ab3f4;}');
  355.  
  356. var html,
  357. form,
  358. p,
  359. prop,
  360. KeyIndex,
  361. change;
  362.  
  363. // 用户设置界面html
  364. html = '<div class=btzi-modal></div><div class=btzi-container><div class=btzi-content><div class=btzi-header><h3 class=btzi-title>用户设置</h3></div><div class=btzi-body><form id=btzi_settings_form><fieldset class=btzi-group><legend class=btzi-legend>打开图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[open]><option value=click>鼠标左键,单击图片</option><option value=dblclick>鼠标左键,双击图片</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>关闭图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[close]><option value=click>鼠标左键,单击</option><option value=dblclick>鼠标左键,双击</option></select><select class=btzi-select name=btzi[closeWindow]><option value=btzi_gallery>图片,关闭单个图片</option><option value=document>页面,关闭所有图片</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>图片大小</legend><div class=btzi-controls><select class=btzi-select name=btzi[size]><option value=100>默认: 原始</option><option value=0>默认: 等比例适应屏幕</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>滚动图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[wheelKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[wheelDirection]><option value=1>滚轮向下,图片上/左移</option><option value=-1>滚轮向上,图片上/左移</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>缩放图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[zoomKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[zoomDirection]><option value=1>滚轮向下,图片放大</option><option value=-1>滚轮向上,图片放大</option></select></div></fieldset><fieldset class=btzi-group><legend class=btzi-legend>旋转图片</legend><div class=btzi-controls><select class=btzi-select name=btzi[rotateKey]><option value=type>组合键: 无</option><option value=ctrlKey>组合键: Ctrl</option><option value=altKey>组合键: Alt</option><option value=shiftKey>组合键: Shift</option></select><select class=btzi-select name=btzi[rotateDirection]><option value=1>滚轮向下,顺时针旋转</option><option value=-1>滚轮向上,顺时针旋转</option></select></div></fieldset></form></div><div class=btzi-footer><button class=btzi-button id=btzi_settings_save type=button>保存设置</button></div></div></div>';
  365. doc.body.insertAdjacentHTML('beforeend', html);
  366. form = doc.getElementById('btzi_settings_form');
  367. p = preferences;
  368. for (prop in p) { // 将数据库里的设置导入到用户设置界面显示
  369. form[`btzi[${prop}]`].value = p[prop];
  370. }
  371.  
  372. KeyIndex = {'btzi[wheelKey]':form['btzi[wheelKey]'].selectedIndex,'btzi[zoomKey]':form['btzi[zoomKey]'].selectedIndex,'btzi[rotateKey]':form['btzi[rotateKey]'].selectedIndex};
  373.  
  374. // 避免组合键冲突,当选择已有组合键时会互相替换
  375. change = function () {
  376. var prop,tmp;
  377. for (prop in KeyIndex) {
  378. if (this.selectedIndex === KeyIndex[prop]) {
  379. tmp = KeyIndex[this.name];
  380. KeyIndex[prop] = tmp;
  381. form[prop].selectedIndex = tmp;
  382. break;
  383. }
  384. }
  385. KeyIndex[this.name] = this.selectedIndex;
  386. prop = null;
  387. tmp = null;
  388. };
  389. form['btzi[wheelKey]'].addEventListener('change', change);
  390. form['btzi[zoomKey]'].addEventListener('change', change);
  391. form['btzi[rotateKey]'].addEventListener('change', change);
  392.  
  393. // 给保存按钮注册(不可用)事件
  394. doc.getElementById('btzi_settings_save').addEventListener('click', function () {
  395. var prop,
  396. prefer = p,
  397. opened = prefer.open,
  398. closed = prefer.close,
  399. closedWindow = prefer.closeWindow;
  400. for (prop in prefer) { // 整合获得的新设置
  401. prefer[prop] = form[`btzi[${prop}]`].value;
  402. }
  403. if (opened !== prefer.open) { // 判断鼠标打开图片的方式是否更换
  404. postlist.removeEventListener(opened, open, true);
  405. postlist.addEventListener(prefer.open, open, true);
  406. }
  407. if (closed !== prefer.close || closedWindow !== prefer.closeWindow) { // 判断鼠标关闭图片的范围是否更换
  408. frame(closedWindow).removeEventListener(closed, close);
  409. frame(prefer.closeWindow).addEventListener(prefer.close, close);
  410. }
  411. GM_setValue('btzi-UserSettings', JSON.stringify(prefer)); // 将用户的新设置导入到数据库里保存
  412. doc.body.classList.remove('btzi-enabled');
  413. prefer=null;
  414. });
  415. settings = null;
  416. doc.body.classList.add('btzi-enabled');
  417. };
  418. if (!GM_getValue('btzi-UserSettings')) { // 第一次使用,弹出设置界面
  419. settings();
  420. }
  421.  
  422. // 在浏览器扩展的菜单列表里添加设置选项
  423. GM_registerMenuCommand('btzi-用户设置', function () {
  424. if (settings) {
  425. settings();
  426. } else {
  427. doc.body.classList.add('btzi-enabled');
  428. }
  429. });
  430.  
  431. })(window, document);
  432.  
  433. console.log('也许我走了,什么都不会剩下。');

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址