Greasy Fork 支持简体中文。

孔夫子旧书网图片下载(自动去水印)-路人甲乙丙

何以生财,唯有实战。(问题反馈联系微信Byte4Me)

// ==UserScript==
// @name         孔夫子旧书网图片下载(自动去水印)-路人甲乙丙
// @description  何以生财,唯有实战。(问题反馈联系微信Byte4Me)
// @version      4.2
// @author       路人甲乙丙
// @namespace    iblogc
// @match        *://search.kongfz.com/*
// @match        *://book.kongfz.com/*
// @match        *://item.kongfz.com/*
// @match        *://book.kongfz.com/C*
// @grant        GM_addStyle
// @grant        GM_download
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license      Apache License, Version 2.0
// @require      https://cdn.jsdelivr.net/npm/[email protected]/runtime.min.js
// @homepage     https://greasyfork.org/zh-CN/scripts/467062
// ==/UserScript==

"use strict";function _asyncToGenerator(n){return function(){var e=n.apply(this,arguments);return new Promise(function(n,t){function o(r,a){try{var i=e[r](a),s=i.value}catch(n){return void t(n)}if(!i.done)return Promise.resolve(s).then(function(n){o("next",n)},function(n){o("throw",n)});n(s)}return o("next")})}}!function(){function n(){var n=Object.values(R),t=n.indexOf(T),r=(t+1)%n.length,a=n[r];if(a===R.CUSTOM_WATERMARK&&!q)return alert("请先在设置面板中上传自定义水印图片"),void o();T=a,GM_setValue("watermarkRemovalMethod",a),alert("已切换为"+e(a)+"方式")}function e(n){switch(n){case R.CANVAS_COVER:return"纯色覆盖";case R.CUSTOM_WATERMARK:return"自定义水印";case R.CROP_BOTTOM:return"裁剪底部";default:return"未设置"}}function t(){var n=document.createElement("div");return n.className="settings-panel",n.innerHTML='\n      <div class="settings-header">\n        <h3>去水印备选方案设置</h3>\n        <button class="close-button">×</button>\n      </div>\n      <div class="settings-content">\n        <div class="settings-notice">\n          <div class="notice-icon">ⓘ</div>\n          <div class="notice-text">\n            系统会优先使用完美去水印方式,\n            仅在该方式失效时(目前失效率很高)才会使用以下备选方案。\n          </div>\n        </div>\n\n        <div class="settings-section">\n          <div class="method-options">\n            <label class="method-radio">\n              <input type="radio" name="watermarkMethod" value="canvas_cover" \n                     '+(T===R.CANVAS_COVER?"checked":"")+'>\n              <div class="method-radio-content">\n                <span class="method-title">纯色覆盖</span>\n                <span class="method-desc">采集图片右下角的颜色,用相近的颜色覆盖水印区域,适合底色均匀的图片。</span>\n              </div>\n            </label>\n            <label class="method-radio">\n              <input type="radio" name="watermarkMethod" value="custom_watermark"\n                     '+(T===R.CUSTOM_WATERMARK?"checked":"")+'>\n              <div class="method-radio-content">\n                <span class="method-title">自定义水印</span>\n                <span class="method-desc">使用自定义图片覆盖水印区域,可以上传自己设计的水印或纯色图片。</span>\n              </div>\n            </label>\n            <label class="method-radio">\n              <input type="radio" name="watermarkMethod" value="crop_bottom"\n                     '+(T===R.CROP_BOTTOM?"checked":"")+'>\n              <div class="method-radio-content">\n                <span class="method-title">裁剪底部</span>\n                <span class="method-desc">直接裁剪掉图片底部的水印区域,适合水印区域内容不重要的图片。</span>\n              </div>\n            </label>\n          </div>\n        </div>\n\n        <div id="customWatermarkSection" class="settings-section" \n             style="display: '+(T===R.CUSTOM_WATERMARK?"block":"none")+'">\n          <h4>自定义水印图片</h4>\n          <span class="method-desc">\n            脚本会自动缩放水印图片,以适应水印区域,并且保持水印图片比例,宽:高=5:2的图片刚好能覆盖水印区域。\n            当然你也可以上传其它比例图片,不管怎样的水印图片,脚本都会自动缩放以覆盖水印区域。\n          </span>\n          <div class="file-upload">\n            <label class="file-upload-button" for="watermarkFile">\n              选择水印图片\n            </label>\n            <input type="file" id="watermarkFile" accept="image/*">\n          </div>\n          '+(q?'<div class="preview-wrapper">\n               <img src="'+q+'" class="preview-image">\n             </div>':"")+'\n        </div>\n      </div>\n      <div class="settings-footer">\n        <button id="saveSettings" class="save-button">保存设置</button>\n        <div class="settings-footer-links">\n          <a href="#" id="donation" style="color: #007bff; text-decoration: none;">\n            💰 赞赏支持\n          </a>\n          <span class="link-separator">|</span>\n          <a href="#" id="devService" style="color: #007bff; text-decoration: none;">\n            💻 软件/脚本/自动化定制开发\n          </a>\n        </div>\n      </div>\n    ',n}function o(){var n=document.createElement("div");n.className="settings-overlay",document.body.appendChild(n);var e=t();document.body.appendChild(e),e.querySelectorAll('input[name="watermarkMethod"]').forEach(function(n){n.addEventListener("change",function(){e.querySelector("#customWatermarkSection").style.display=n.value===R.CUSTOM_WATERMARK?"block":"none"})}),e.querySelector("#saveSettings").onclick=function(){var t=e.querySelector('input[name="watermarkMethod"]:checked').value;T=t,GM_setValue("watermarkRemovalMethod",t),GM_setValue("customWatermarkBase64",q),alert("设置已保存"),e.remove(),n.remove()},e.querySelector(".close-button").onclick=function(){e.remove(),n.remove()},e.querySelector("#watermarkFile").onchange=function(n){var t=n.target.files[0];if(t){var o=new FileReader;o.onload=function(n){q=n.target.result;var t=e.querySelector(".preview-image");if(t)t.src=q;else{var o=document.createElement("div");o.className="preview-wrapper";var r=document.createElement("img");r.src=q,r.className="preview-image",o.appendChild(r),e.querySelector(".file-upload").insertAdjacentElement("afterend",o)}},o.readAsDataURL(t)}},e.querySelector("#devService").addEventListener("click",function(n){n.preventDefault(),z()}),e.querySelector("#donation").addEventListener("click",function(n){n.preventDefault(),g()})}function r(n){B=n,localStorage.setItem(A,n)}function a(){D=!0,localStorage.setItem(O,"true")}function i(n){return n.replace(/(_water|_n|_p|_b|_s)/g,"")}function s(n,e){var t=n.createElement("button");t.innerText="👉 下载图片",t.className="searchPageDownloadButton item-button",t.style.backgroundColor="#8c222c",t.style.color="white";var o=e.querySelector("div.add-cart-btn")||e.querySelector("div.add-cart-button");return o.parentNode.insertBefore(t,o.nextSibling),t}function c(n,e){var t=n.createElement("button");t.innerText="👉 下载图片",t.className="searchPageDownloadButton item-button",t.style.backgroundColor="#8c222c",t.style.color="white";var o=e.querySelector("div.add-cart-btn")||e.querySelector("div.add-cart-button");return o.parentNode.insertBefore(t,o.nextSibling),t}function d(n,e){var t=n.createElement("button");t.innerText="👉 下载图片",t.className="bookListPageDownloadButton",t.style.backgroundColor="#8c222c",t.style.color="white";var o=e.querySelector("a.con-btn-cart");return o.parentNode.insertBefore(t,o.nextSibling),t}function l(n,e){u(n,e)}function p(n){var e=n.querySelectorAll("ul#figure-info-box > li");return Array.from(e,function(n){return n.querySelector("img").getAttribute("_viewsrc")})}function u(n,e){function t(){e.style.lineHeight="20px",e.innerText="📢总计:"+o.length+"\n✨完美去水印:"+s+"\n🎨备选去水印:"+c+"\n🔄未去水印:"+d+"\n😭下载失败:"+l+"\n",e.appendChild(a),l>0?(e.style.backgroundColor="#c97c75",e.style.color="#fff"):(e.style.backgroundColor="#7b7475",e.style.color="#fff")}var o=p(n);e.style.cursor="not-allowed";var a=document.createElement("a");if(a.href="#",a.textContent="🐛问题反馈",a.style.color="#ffeb83",a.onclick=function(n){n.preventDefault(),f("https://greasyfork.s3.us-east-2.amazonaws.com/lp9hdyffstt0wpz2ub39gw9p6srr")},0===o.length)return e.innerText="🧐商品详情中没\n有图片可以下载\n",e.style.backgroundColor="#ccc",e.style.color="#999",a.style.color="#b55222",void e.appendChild(a);e.disabled=!0,e.innerText="Downloading...";var s=0,c=0,d=0,l=0,u=(n.querySelector('meta[name="keywords"]').getAttribute("content")||"").match(/([^,]+)/),m=u&&u.length>1?u[1]:"",h=(n.querySelector('meta[name="description"]').getAttribute("content")||"").match(/ISBN:([0-9]*)/),x=h&&h.length>1?h[1]:"";o.forEach(function(n,a){function p(i){var u=this,h=arguments.length>1&&void 0!==arguments[1]&&arguments[1],v=arguments.length>2&&void 0!==arguments[2]&&arguments[2],b=v?"original":h?T:"direct",y=C(a,m,x,f,b);console.log("开始下载图片:",{url:i,filename:y,isRetry:h,isOriginal:v,currentProgress:s+c+d+l+1+"/"+o.length}),GM_download({url:i,name:y,onprogress:function(n){e.innerText="Downloading...("+(a+1)+"/"+o.length+")"},onload:function(){v?(d++,console.log("原图下载成功 - 总进度: "+(s+c+d+l)+"/"+o.length)):h?(c++,console.log("Canvas处理图片下载成功 - 总进度: "+(s+c+d+l)+"/"+o.length)):(s++,console.log("直接去水印下载成功 - 总进度: "+(s+c+d+l)+"/"+o.length)),s+c+d+l===o.length&&(console.log("所有图片处理完成:",{"直接去水印成功":s,"Canvas处理成功":c,"原图下载":d,"失败":l}),t(),r(B+s+c+d),(B%100==0&&0!==B&&!D||B>1e3&&!D)&&g())},onerror:function(){var e=_asyncToGenerator(regeneratorRuntime.mark(function e(r){var a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(h||v){e.next=15;break}return console.log("无水印链接下载失败,尝试Canvas处理...",r),e.prev=2,e.next=5,M(n);case 5:a=e.sent,p(a,!0,!1),e.next=13;break;case 9:e.prev=9,e.t0=e.catch(2),console.log("Canvas处理失败,降级到原图下载:",e.t0),p(n,!0,!0);case 13:e.next=16;break;case 15:h&&!v?(console.log("Canvas处理图片下载失败,降级到原图下载:",r),p(n,!0,!0)):(l++,console.error("图片下载完全失败:",r),s+c+d+l===o.length&&t());case 16:case"end":return e.stop()}},e,u,[[2,9]])}));return function(n){return e.apply(this,arguments)}}()})}var u=i(n),f=(u.split(".").pop()||"").toLowerCase();m.trim(),x.trim();p(u)})}function g(){k();var n=document.createElement("div");n.classList.add("overlay"),document.body.appendChild(n);var e=document.createElement("div");e.classList.add("donation-popup"),e.innerHTML='\n      <div class="donation-header">\n        <h3>孔夫子旧书网图片下载(自动去水印)</h3>\n        <button class="close-button">×</button>\n        <p style="font-size: 14px; color: #666;">让您的时间更高效</p>\n      </div>\n      <div class="donation-body">\n        <p>🙏感谢您选择此工具!捐赠是对我最大的支持,也能帮助工具不断改进与维护。</p>\n        <div class="donation-images">\n          <img src="https://greasyfork.s3.us-east-2.amazonaws.com/hve4r1x61p2vrsx2bjqjb1um8wfh" alt="捐赠二维码1" class="donation-image-large" />\n          <img src="https://greasyfork.s3.us-east-2.amazonaws.com/2w21qpqvqb9iikjqiovagnuyut1x" alt="捐赠二维码2" class="donation-image-large" />\n        </div>\n        <div class="donation-links">\n          <a href="#" id="feedbackWeChat">\n            ❓问题/建议反馈微信:Byte4Me\n          </a>\n          <a href="#" id="sideHustleGroup">\n            💰副业社群体检卡\n          </a>\n          <a href="#" id="devService">\n            💻 软件/脚本/自动化定制开发\n          </a>\n        </div>\n         <div class="donation-footer">\n            <button id="donateBtn" class="donation-button donate">我已捐赠💖</button>\n        </div>\n      </div>\n    ',document.body.appendChild(e);var t=e.querySelector(".close-button");e.querySelector("#donateBtn").addEventListener("click",function(){alert("🙏感谢您的支持!如果有问题,欢迎联系微信:Byte4Me"),e.remove(),n.remove(),a()}),t.addEventListener("click",function(){e.remove(),n.remove()}),e.querySelector("#feedbackWeChat").addEventListener("click",function(n){n.preventDefault(),f("https://greasyfork.s3.us-east-2.amazonaws.com/lp9hdyffstt0wpz2ub39gw9p6srr")}),e.querySelector("#sideHustleGroup").addEventListener("click",function(n){n.preventDefault(),f("https://greasyfork.s3.us-east-2.amazonaws.com/7cjf1r8rohkrh8xwp0mn2srocx0u")}),e.querySelector("#devService").addEventListener("click",function(n){n.preventDefault(),z()})}function f(n){var e=document.createElement("div"),t=document.createElement("div");t.classList.add("image-popup"),t.innerHTML='\n      <div class="image-popup-header">\n        <button class="close-button">×</button>\n      </div>\n      <div class="image-popup-body">\n        <img src="'+n+'" alt="Image" />\n      </div>\n    ',document.body.appendChild(t),t.querySelector(".close-button").addEventListener("click",function(){t.remove(),e.remove()}),e.addEventListener("click",function(){t.remove(),e.remove()})}function m(n,e){e.addEventListener("click",function(){GM_xmlhttpRequest({method:"GET",url:n,onload:function(n){u((new DOMParser).parseFromString(n.responseText,"text/html"),e)},onerror:function(n){console.log("Error:",n),e.innerText="⛔ 解析网页时出错"}})})}function h(n){m(n.querySelector(".item-info-box > .item-name > a.item-link").href,s(document,n))}function x(n){m(n.querySelector(".item-info > .title > a.link").href,c(document,n))}function v(n){m(n.querySelector("div.list-con-title > a").href,d(document,n))}function b(){document.querySelector(".product-item-box")&&(clearInterval(N),document.querySelectorAll(".product-item-box > .product-item-wrap").forEach(function(n){h(n)}))}function y(){document.querySelector("#listBox")&&(clearInterval(N),document.querySelectorAll("#listBox > .item").forEach(function(n){x(n)}))}function w(){document.querySelector("ul.itemList")&&(clearInterval(N),document.querySelectorAll("ul.itemList > li").forEach(function(n){v(n)}))}function k(){var n=document.createElement("div");n.className="confetti-container",document.body.appendChild(n);for(var e=0;e<50;e++){var t=document.createElement("div");t.className="confetti",t.style.left=100*Math.random()+"vw",t.style.animationDelay=3*Math.random()+"s",t.style.backgroundColor="hsl("+360*Math.random()+", 100%, 50%)",n.appendChild(t)}setTimeout(function(){n.remove()},5e3)}function C(n,e,t,o,r){var a=void 0;switch(r){case"direct":a="完美去水印";break;case R.CANVAS_COVER:a="纯色覆盖";break;case R.CUSTOM_WATERMARK:a="自定义水印";break;case R.CROP_BOTTOM:a="裁剪底部";break;default:a="未知方式"}return a+"_"+e.trim()+"-"+t.trim()+"-"+(n+1)+"."+(o||"jpg")}function S(n){var e=this,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=o?"original":t?T:"direct",i=C(index,bookName,isbn,extension,a);console.log("开始下载图片:",{url:n,filename:i,isRetry:t,isOriginal:o,currentProgress:directSuccessCount+canvasSuccessCount+originalImageCount+failCount+1+"/"+images.length}),GM_download({url:n,name:i,onprogress:function(n){downloadButton.innerText="Downloading...("+(index+1)+"/"+images.length+")"},onload:function(){o?(originalImageCount++,console.log("原图下载成功 - 总进度: "+(directSuccessCount+canvasSuccessCount+originalImageCount+failCount)+"/"+images.length)):t?(canvasSuccessCount++,console.log("Canvas处理图片下载成功 - 总进度: "+(directSuccessCount+canvasSuccessCount+originalImageCount+failCount)+"/"+images.length)):(directSuccessCount++,console.log("直接去水印下载成功 - 总进度: "+(directSuccessCount+canvasSuccessCount+originalImageCount+failCount)+"/"+images.length)),directSuccessCount+canvasSuccessCount+originalImageCount+failCount===images.length&&(console.log("所有图片处理完成:",{"直接去水印成功":directSuccessCount,"Canvas处理成功":canvasSuccessCount,"原图下载":originalImageCount,"失败":failCount}),updateDownloadButton(),r(B+directSuccessCount+canvasSuccessCount+originalImageCount),(B%100==0&&0!==B&&!D||B>1e3&&!D)&&g())},onerror:function(){var n=_asyncToGenerator(regeneratorRuntime.mark(function n(r){var a;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(t||o){n.next=15;break}return console.log("无水印链接下载失败,尝试Canvas处理...",r),n.prev=2,n.next=5,M(imageUrl);case 5:a=n.sent,S(a,!0,!1),n.next=13;break;case 9:n.prev=9,n.t0=n.catch(2),console.log("Canvas处理失败,降级到原图下载:",n.t0),S(imageUrl,!0,!0);case 13:n.next=16;break;case 15:t&&!o?(console.log("Canvas处理图片下载失败,降级到原图下载:",r),S(imageUrl,!0,!0)):(failCount++,console.error("图片下载完全失败:",r),directSuccessCount+canvasSuccessCount+originalImageCount+failCount===images.length&&updateDownloadButton());case 16:case"end":return n.stop()}},n,e,[[2,9]])}));return function(e){return n.apply(this,arguments)}}()})}function z(){var n=document.createElement("div");n.className="overlay",n.style.zIndex="10003",document.body.appendChild(n);var e=document.createElement("div");e.className="dev-service-popup",e.innerHTML='\n      <div class="dev-service-header">\n        <h3>专业软件定制开发服务</h3>\n        <button class="close-button">×</button>\n      </div>\n      <div class="dev-service-body">\n        <div class="service-sections">\n          <div class="service-intro">\n            <h4>🌟 服务范围</h4>\n            <ul>\n              <li>浏览器脚本工具开发</li>\n              <li>数据采集爬虫开发</li>\n              <li>RPA自动化流程开发</li>\n              <li>网站建设与软件小程序开发</li>\n              <li>其他定制化开发需求</li>\n            </ul>\n          </div>\n          <div class="service-intro">\n            <h4>💪 为什么选择我们</h4>\n            <ul>\n              <li>专业技术团队,经验丰富</li>\n              <li>一对一需求对接,快速响应</li>\n              <li>合理报价,质量保证</li>\n              <li>交付及时,售后无忧</li>\n            </ul>\n          </div>\n        </div>\n        <div class="contact-info">\n          <div class="contact-qr">\n            <img src="https://greasyfork.s3.us-east-2.amazonaws.com/lp9hdyffstt0wpz2ub39gw9p6srr" alt="联系方式">\n            <p>微信号: Byte4Me</p>\n          </div>\n          <p class="contact-note">扫码或添加微信咨询</p>\n        </div>\n      </div>\n    ',document.body.appendChild(e),e.querySelector(".close-button").onclick=function(){e.remove(),n.remove()},n.onclick=function(){e.remove(),n.remove()}}var M=function(){var n=_asyncToGenerator(regeneratorRuntime.mark(function n(e){return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return console.log("开始Canvas处理水印,原图URL:",e),n.abrupt("return",new Promise(function(n,t){var o=new Image;o.crossOrigin="anonymous",o.onload=_asyncToGenerator(regeneratorRuntime.mark(function e(){var r,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:console.log("图片加载成功,尺寸:",o.width,"x",o.height),r=document.createElement("canvas"),a=r.getContext("2d"),e.t0=T,e.next=e.t0===R.CANVAS_COVER?6:e.t0===R.CUSTOM_WATERMARK?12:e.t0===R.CROP_BOTTOM?18:22;break;case 6:return r.width=o.width,r.height=o.height,a.drawImage(o,0,0),e.next=11,E(a,o);case 11:return e.abrupt("break",22);case 12:return r.width=o.width,r.height=o.height,a.drawImage(o,0,0),e.next=17,_(a,o);case 17:return e.abrupt("break",22);case 18:return r.width=o.width,r.height=o.height-o.width/10,a.drawImage(o,0,0),e.abrupt("break",22);case 22:r.toBlob(function(e){if(e){var o=URL.createObjectURL(e);console.log("Canvas处理完成,生成新URL:",o),n(o)}else console.error("Canvas转Blob失败"),t(new Error("Canvas to Blob conversion failed"))},"image/jpeg",.95);case 23:case"end":return e.stop()}},e,this)})),o.onerror=function(n){console.error("图片加载失败:",n),t(new Error("Image loading failed"))},o.src=e}));case 2:case"end":return n.stop()}},n,this)}));return function(e){return n.apply(this,arguments)}}(),E=function(){var n=_asyncToGenerator(regeneratorRuntime.mark(function n(e,t){var o,r,a,i,s,c,d,l,p,u,g,f,m,h,x,v,b,y;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:for(o=t.width/4,r=t.width/10,a=t.width-o,i=t.height-r,s=5,c=0,d=0,l=0,p=0,u=a+o-s;u<a+o;u++)for(g=i+r-s;g<i+r;g++)f=e.getImageData(u,g,1,1).data,c+=f[0],d+=f[1],l+=f[2],p++;for(m=Math.round(c/p),h=Math.round(d/p),x=Math.round(l/p),v=e.getImageData(a,i,o,r),b=v.data,y=0;y<b.length;y+=4)b[y]=m+10*(Math.random()-.5),b[y+1]=h+10*(Math.random()-.5),b[y+2]=x+10*(Math.random()-.5),b[y+3]=245;e.putImageData(v,a,i),e.filter="blur(2px)",e.fillStyle="rgba("+m+", "+h+", "+x+", 0.3)",e.fillRect(a,i,o,r),e.filter="none";case 18:case"end":return n.stop()}},n,this)}));return function(e,t){return n.apply(this,arguments)}}(),_=function(){var n=_asyncToGenerator(regeneratorRuntime.mark(function n(e,t){return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:if(q){n.next=2;break}throw new Error("未设置自定义水印图片");case 2:return n.abrupt("return",new Promise(function(n,o){var r=new Image;r.crossOrigin="anonymous",r.onload=function(){var o=t.width/4,a=t.width/10,i=r.width/r.height,s=o/a,c=void 0,d=void 0,l=void 0,p=void 0;i>s?(d=a,c=d*i,p=t.height-a,l=t.width-c+(c-o)/2):(c=o,d=c/i,l=t.width-o,p=t.height-d+(d-a)/2),e.drawImage(r,l,p,c,d),n()},r.onerror=function(){o(new Error("自定义水印图片加载失败"))},r.src=q}));case 3:case"end":return n.stop()}},n,this)}));return function(e,t){return n.apply(this,arguments)}}(),R={CANVAS_COVER:"canvas_cover",CUSTOM_WATERMARK:"custom_watermark",CROP_BOTTOM:"crop_bottom"},T=GM_getValue("watermarkRemovalMethod",R.CANVAS_COVER),q=GM_getValue("customWatermarkBase64","");GM_getValue("cropRatio",.9);GM_registerMenuCommand("⚙️ 去水印设置",o),GM_registerMenuCommand("✨ 当前方式:"+e(T),n),GM_addStyle('\n    .settings-overlay {\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(0, 0, 0, 0.3);\n      backdrop-filter: blur(5px);\n      z-index: 9998;\n    }\n\n    .settings-panel {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: rgba(255, 255, 255, 0.95);\n      padding: 32px;\n      border-radius: 16px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);\n      z-index: 9999;\n      width: 800px;\n      max-height: 90vh;\n      overflow-y: auto;\n      scrollbar-width: none;\n    }\n\n    .settings-panel::-webkit-scrollbar {\n      display: none;\n    }\n\n    .settings-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 24px;\n      position: relative;\n    }\n\n    .settings-header h3 {\n      font-size: 20px;\n      font-weight: 600;\n      color: #1d1d1f;\n      margin: 0;\n    }\n\n    .settings-notice {\n      display: flex;\n      align-items: flex-start;\n      background: #f5f5f7;\n      border-radius: 12px;\n      padding: 16px;\n      margin-bottom: 24px;\n    }\n\n    .notice-icon {\n      font-size: 20px;\n      color: #06c;\n      margin-right: 12px;\n    }\n\n    .notice-text {\n      font-size: 14px;\n      line-height: 1.4;\n      color: #1d1d1f;\n    }\n\n    .settings-section {\n      margin-bottom: 24px;\n    }\n\n    .settings-section h4 {\n      font-size: 16px;\n      font-weight: 600;\n      color: #1d1d1f;\n      margin: 0 0 5px 0;\n    }\n\n    .size-inputs {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      margin-top: 12px;\n      justify-content: center;\n    }\n\n    .size-input-wrapper {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      flex: 0 1 auto;\n    }\n\n    .size-input-wrapper label {\n      white-space: nowrap;\n      color: #86868b;\n      font-size: 13px;\n    }\n\n    .input-unit-wrapper {\n      position: relative;\n      display: flex;\n      align-items: center;\n      min-width: 120px;\n    }\n\n    .size-separator {\n      margin: 0 8px;\n      color: #86868b;\n      font-size: 14px;\n      line-height: 1;\n    }\n\n    input[type="text"] {\n      width: 100%;\n      padding: 8px 50px 8px 12px;\n      border: 1px solid #d2d2d7;\n      border-radius: 8px;\n      font-size: 14px;\n      color: #1d1d1f;\n    }\n\n    .unit-select {\n      position: absolute;\n      right: 8px;\n      top: 50%;\n      transform: translateY(-50%);\n      border: none;\n      background: transparent;\n      font-size: 14px;\n      color: #86868b;\n      cursor: pointer;\n      padding-right: 16px;\n    }\n\n    .method-options {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 24px;\n    }\n\n    .method-radio {\n      flex: 1;\n      cursor: pointer;\n    }\n\n    .method-radio input[type="radio"] {\n      display: none;\n    }\n\n    .method-radio-content {\n      padding: 16px;\n      background: #f8f9fa;\n      border: 1px solid #dee2e6;\n      border-radius: 12px;\n      text-align: center;\n      transition: all 0.2s;\n    }\n\n    .method-radio input[type="radio"]:checked + .method-radio-content {\n      background: #e8f2ff;\n      border: 1px solid #06c;\n    }\n\n    .method-title {\n      display: block;\n      font-size: 15px;\n      font-weight: 600;\n      color: #1d1d1f;\n      margin-bottom: 12px;\n      padding-bottom: 8px;\n      border-bottom: 1px solid #eee;\n    }\n\n    .method-desc {\n      display: block;\n      font-size: 13px;\n      line-height: 1.5;\n      color: #666;\n      text-align: left;\n      padding: 0 4px;\n    }\n\n    .preview-wrapper {\n      margin: 16px auto;\n      border-radius: 8px;\n      overflow: hidden;\n      border: 1px solid #d2d2d7;\n      max-width: 200px !important;  \n      max-height: 80px !important;  \n      width: 200px;\n      height: 80px;\n      background: #f5f5f7;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .preview-image {\n      width: 100%;\n      height: 100%;\n      object-fit: contain; // 保持图片比例,确保完整显示\n    }\n\n    .crop-mode .size-input-wrapper {\n      max-width: 300px;\n      margin: 0 auto;\n    }\n\n    .file-upload {\n      margin-bottom: 16px;\n      text-align: center;\n    }\n\n    .file-upload-button {\n      display: inline-block;\n      padding: 8px 16px;\n      background: #06c;\n      color: white;\n      border-radius: 8px;\n      font-size: 14px;\n      cursor: pointer;\n      transition: background-color 0.2s;\n    }\n\n    .file-upload-button:hover {\n      background: #0055b3;\n    }\n\n    .file-upload input[type="file"] {\n      display: none;\n    }\n\n    .close-button {\n      width: 28px;\n      height: 28px;\n      border: none;\n      background: #f5f5f7;\n      border-radius: 50%;\n      font-size: 18px;\n      color: #86868b;\n      cursor: pointer;\n      transition: all 0.2s;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .close-button:hover {\n      background: #e5e5e7;\n      color: #1d1d1f;\n    }\n\n    .settings-footer {\n      margin-top: 24px;\n      text-align: center;\n    }\n\n    .save-button {\n      padding: 10px 24px;\n      background: #06c;\n      color: white;\n      border: none;\n      border-radius: 8px;\n      font-size: 15px;\n      font-weight: 500;\n      cursor: pointer;\n      transition: background-color 0.2s;\n    }\n\n    .save-button:hover {\n      background: #0055b3;\n    }\n\n    /* 图片弹窗样式 */\n    .image-popup {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: white;\n      border-radius: 16px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n      z-index: 10004;\n      overflow: hidden;\n    }\n\n    .image-popup-header {\n      position: relative;\n      height: 0;\n    }\n\n    .image-popup-body {\n      padding: 30px;\n    }\n\n    .image-popup img {\n      max-width: 700px;\n      max-height: 80vh;\n      border-radius: 8px;\n      display: block;\n    }\n\n    /* 设置面板底部链接样式 */\n    .settings-footer-links {\n      margin-top: 15px;\n      text-align: center;\n    }\n\n    .link-separator {\n      margin: 0 10px;\n      color: #dee2e6;\n    }\n\n    /* 捐赠弹窗样式优化 */\n    .donation-popup {\n      max-width: 800px;\n      width: 90%;\n      padding: 30px;\n    }\n\n    .donation-header {\n      position: relative;\n      text-align: center;\n      margin-bottom: 25px;\n      padding-bottom: 15px;\n      border-bottom: 2px solid #f0f2f5;\n    }\n\n    .donation-header h3 {\n      margin: 0;\n      font-size: 24px;\n      color: #2c3e50;\n      font-weight: 600;\n    }\n\n    .donation-links {\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n      margin-top: 20px;\n      text-align: center;\n    }\n\n    .donation-links a {\n      color: #007bff;\n      text-decoration: none;\n      transition: color 0.2s;\n    }\n\n    .donation-links a:hover {\n      color: #0056b3;\n    }\n\n    /* 统一关闭按钮样式 */\n    .close-button {\n      position: absolute;\n      top: -20px;\n      right: -20px;\n      width: 36px;\n      height: 36px;\n      border: none;\n      background: #dc3545;\n      border-radius: 50%;\n      font-size: 20px;\n      color: white;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: 0 2px 8px rgba(220, 53, 69, 0.4);\n      z-index: 1;\n    }\n\n    .close-button:hover {\n      background: #c82333;\n      transform: scale(1.1) rotate(90deg);\n      box-shadow: 0 4px 12px rgba(220, 53, 69, 0.6);\n    }\n  ');var L=window.location.href,A="downloadCount",O="donationPopupShown",I="firstExecutionv42",B=parseInt(localStorage.getItem(A))||0,D="true"===localStorage.getItem(O),G="true"===localStorage.getItem(I),N=void 0;if(G||(function(){k();var n=document.createElement("div");n.classList.add("overlay"),document.body.appendChild(n);var e=document.createElement("div");e.classList.add("update-log-popup"),e.innerHTML='\n              <div class="update-log-header">\n                  <p><a target="_blank" href="https://greasyfork.org/zh-CN/scripts/467062">孔夫子旧书网图片下载(自动去水印)更新日志</a></p>\n                  <div style="font-size: 12px; color: #666; text-align: center;">每次升级后此窗口可能会展示多次</div>\n              </div>\n              <div class="update-log-body">\n                  <ul>\n                    <li>\n                      <div style="display: flex; align-items: center; justify-content: center;">🧨提前祝大家新年快乐🧨</div>\n                      <p style="font-weight: bold;">[2025-01-22] v4.2</p>\n                      <ul>\n                          <li style="color: red;">自动根据要下载的图片尺寸计算水印区域,不再需要手动设置</li>\n                      </ul>\n                    </li>\n                    <li>\n                      <p style="font-weight: bold;">[2024-12-27] v4.0</p>\n                      <ul>\n                          <li style="color: red;">1. 新增三种备用去水印方式,分别是:裁剪底部水印区域、裁剪底部水印区域、裁剪底部水印区域;<br><img src="https://greasyfork.s3.us-east-2.amazonaws.com/vb9gy3e8gy70l2r26vw3lgo5bfix" alt="设置菜单说明" style="width: 90%;"></li>\n                          <li>2. 修改按钮和弹窗样式。</li>\n                      </ul>\n                    </li>\n                  </ul>\n                  <p style="text-align: center; margin-top: 10px;">\n                      <a href="#" id="donation" style="color: #007bff; text-decoration: none;">\n                          💰 好活,当赏\n                      </a>\n                      &nbsp;|&nbsp;\n                      <a href="#" id="scyspromotion" style="color: #007bff; text-decoration: none;">\n                          💵 副业社群体检卡\n                      </a>\n                      &nbsp;|&nbsp;\n                      <a href="#" id="devService" style="color: #007bff; text-decoration: none;">\n                          💻 软件/脚本/自动化定制开发\n                      </a>\n                  </p>\n              </div>\n              <div class="update-log-footer">\n                  <button id="closeUpdateLogBtn" class="update-log-button">我知道了</button>\n              </div>\n          ',document.body.appendChild(e),e.querySelector("#closeUpdateLogBtn").addEventListener("click",function(){e.remove(),n.remove()});var t=e.querySelector("#donation"),o=e.querySelector("#scyspromotion"),r=e.querySelector("#devService");t.addEventListener("click",function(n){n.preventDefault(),g()}),o.addEventListener("click",function(n){n.preventDefault(),f("https://greasyfork.s3.us-east-2.amazonaws.com/7cjf1r8rohkrh8xwp0mn2srocx0u")}),r.addEventListener("click",function(n){n.preventDefault(),z()})}(),function(){G=!0,localStorage.setItem(I,"true")}()),L.includes("//search.kongfz.com/"))console.log("//search.kongfz.com/"),N=setInterval(b,1e3);else if(L.includes("//book.kongfz.com/C"))console.log("//book.kongfz.com/C"),N=setInterval(y,1e3);else if(L.includes("//book.kongfz.com/")){console.log("//book.kongfz.com/");var P=function(n){var e=document.createElement("button");return e.innerText="👉 下载图片("+n.length+")",e.id="downloadButton",e.style.backgroundColor="#8c222c",e.style.color="white",document.body.appendChild(e),e}(p(document));P.addEventListener("click",function(){return l(document,P)})}else L.includes("//item.kongfz.com/")&&(console.log("//item.kongfz.com/"),N=setInterval(w,1e3));GM_addStyle("\n    #downloadButton {\n    position: fixed;\n    bottom: 20px;\n    right: 20px;\n    padding: 10px 20px;\n    background-color: #333;\n    color: #fff;\n    border: none;\n    border-radius: 5px;\n    cursor: pointer;\n    z-index: 9999;\n    }\n    #bugReportLink {\n    position: fixed;\n    bottom: 5px;\n    right: 20px;\n    padding: 10px 20px;\n    background-color: #333;\n    color: #fff;\n    border: none;\n    border-radius: 5px;\n    cursor: pointer;\n    z-index: 9999;\n    }\n    .searchPageDownloadButton {\n    padding: 1px 5px;\n    background-color: #333;\n    color: #fff;\n    border: none;\n    border-radius: 3px;\n    cursor: pointer;\n    z-index: 9999;\n    font-size: 12px;\n    margin: 0px 10px;\n    }\n    .bookListPageDownloadButton {\n    padding: 1px 5px;\n    background-color: #333;\n    color: #fff;\n    border: none;\n    border-radius: 3px;\n    cursor: pointer;\n    z-index: 9999;\n    font-size: 12px;\n    margin: 8px auto 0;\n    display: block;\n    }\n    button.disabled {\n    background-color: #ccc;\n    color: #999;\n    cursor: pointer;\n    /* 其他样式 */\n    }\n  .overlay {\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(0, 0, 0, 0.5);\n      backdrop-filter: blur(5px);\n      z-index: 1000;\n  }\n  .donation-popup {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: white;\n      padding: 20px;\n      border-radius: 10px;\n      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);\n      text-align: center;\n      z-index: 10001;\n      max-width: 800px;\n      width: 90%;\n  }\n  .donation-header p {\n      margin: 5px 0;\n      font-size: 18px;\n      font-weight: bold;\n      color: #333;\n  }\n  .donation-body p {\n      font-size: 14px;\n      color: #555;\n      line-height: 1.5;\n  }\n  .donation-images {\n      display: flex;\n      justify-content: space-around;\n      margin: 15px 0;\n  }\n  .donation-image-large {\n      max-width: 350px;\n      max-height: 350px;\n      border: 1px solid #ddd;\n      border-radius: 5px;\n  }\n  .donation-footer {\n      margin-top: 20px;\n  }\n  .donation-button {\n      margin: 5px;\n      padding: 10px 20px;\n      font-size: 14px;\n      border: none;\n      border-radius: 5px;\n      cursor: pointer;\n  }\n  .donation-button.donate {\n      background-color: #28a745;\n      color: white;\n  }\n  .donation-button.cancel {\n      background-color: #dc3545;\n      color: white;\n  }\n  .donation-button:hover {\n      opacity: 0.9;\n  }\n  .image-popup {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: white;\n      border-radius: 10px;\n      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);\n      padding: 10px;\n      z-index: 10002;\n  }\n  .image-popup img {\n      max-width: 700px;\n      max-height: 90vh;\n      border-radius: 5px;\n      padding: 20px 50px;\n  }\n  .image-popup .close-button {\n      position: absolute;\n      top: 0px;\n      right: 0px;\n      background: #dc3545;\n      color: white;\n      border: none;\n      border-radius: 50%;\n      width: 30px;\n      height: 30px;\n      font-size: 16px;\n      text-align: center;\n      cursor: pointer;\n  }\n  .update-log-popup {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: white;\n      padding: 20px;\n      border-radius: 10px;\n      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);\n      text-align: left;\n      z-index: 10001;\n      max-height: 80vh;\n      overflow-y: auto;\n      max-width: 800px;\n      width: 90%;\n      scrollbar-width: none;\n  }\n      \n  .update-log-header p {\n      margin: 5px 0;\n      font-size: 18px;\n      font-weight: bold;\n      color: #333;\n      text-align: center;\n  }\n  .update-log-body ul {\n      list-style-type: disc;\n      padding-left: 20px;\n  }\n  .update-log-body ul ul {\n      list-style-type: circle;\n      padding-left: 20px;\n  }\n  .update-log-body li {\n      margin-bottom: 2px;\n  }\n  .update-log-footer {\n      margin-top: 20px;\n      text-align: center;\n  }\n  .update-log-button {\n      padding: 5px 10px;\n      font-size: 14px;\n      border: none;\n      border-radius: 5px;\n      cursor: pointer;\n      background-color: #007bff;\n      color: white;\n  }\n  .update-log-button:hover {\n      opacity: 0.9;\n  }\n  \n    "),GM_addStyle("\n    .fireworks-container {\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n      z-index: 9999;\n    }\n\n    .firework {\n      position: absolute;\n      transform: scale(1);\n      animation: scale 0.3s ease-out forwards;\n    }\n\n    .particle {\n      position: absolute;\n      width: 6px;  // 增大粒子尺寸\n      height: 6px;\n      border-radius: 50%;\n      animation: explode 1.5s ease-out forwards;\n      box-shadow: 0 0 10px 2px currentColor;  // 添加发光效果\n    }\n\n    @keyframes scale {\n      from {\n        transform: scale(0);\n      }\n      50% {\n        transform: scale(1.2);\n      }\n      to {\n        transform: scale(1);\n      }\n    }\n\n    @keyframes explode {\n      0% {\n        transform: translateX(0) translateY(0);\n        opacity: 1;\n      }\n      50% {\n        opacity: 0.8;\n      }\n      100% {\n        transform: translateX(var(--x)) translateY(var(--y));\n        opacity: 0;\n      }\n    }\n  "),document.addEventListener("DOMContentLoaded",function(){for(var n=document.createElement("style"),e="",t=0;t<20;t++){var o=18*t+(20*Math.random()-10),r=100+50*Math.random();e+=".firework .particle:nth-child("+(t+1)+") { --x: "+Math.cos(o*Math.PI/180)*r+"px; --y: "+Math.sin(o*Math.PI/180)*r+"px; }\n"}n.textContent=e,document.head.appendChild(n)}),GM_addStyle("\n    .confetti-container {\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n      z-index: 9999;\n      overflow: hidden;\n    }\n\n    .confetti {\n      position: absolute;\n      width: 10px;\n      height: 20px;\n      top: -20px;\n      transform-origin: center;\n      animation: confetti-fall 3s ease-in-out forwards;\n    }\n\n    @keyframes confetti-fall {\n      0% {\n        transform: translateY(0) rotate(0) scale(1);\n        opacity: 1;\n      }\n      \n      25% {\n        transform: translateY(25vh) rotate(90deg) scale(0.9);\n        opacity: 0.8;\n      }\n      \n      50% {\n        transform: translateY(50vh) rotate(180deg) scale(0.8);\n        opacity: 0.6;\n      }\n      \n      75% {\n        transform: translateY(75vh) rotate(270deg) scale(0.7);\n        opacity: 0.4;\n      }\n      \n      100% {\n        transform: translateY(100vh) rotate(360deg) scale(0.6);\n        opacity: 0;\n      }\n    }\n  "),GM_addStyle('\n    .dev-service-popup {\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background: white;\n      padding: 30px;\n      border-radius: 16px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n      z-index: 10004;\n      max-width: 800px;\n      width: 90%;\n    }\n\n    .dev-service-header {\n      position: relative;\n      text-align: center;\n      margin-bottom: 25px;\n      padding-bottom: 15px;\n      border-bottom: 2px solid #f0f2f5;\n    }\n\n    .dev-service-header h3 {\n      margin: 0;\n      font-size: 24px;\n      color: #2c3e50;\n      font-weight: 600;\n    }\n\n    .close-button {\n      position: absolute;\n      top: -10px;\n      right: -10px;\n      width: 30px;\n      height: 30px;\n      border: none;\n      background: #dc3545;\n      border-radius: 50%;\n      font-size: 20px;\n      color: white;\n      cursor: pointer;\n      transition: all 0.3s ease;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .close-button:hover {\n      background: #c82333;\n      transform: scale(1.1) rotate(90deg);\n      box-shadow: 0 4px 12px rgba(220, 53, 69, 0.6);\n    }\n\n    .service-sections {\n      display: flex;\n      gap: 40px;\n      margin-bottom: 30px;\n      padding: 20px;\n      background: #f8fafc;\n      border-radius: 12px;\n    }\n\n    .service-intro {\n      flex: 1;\n      padding: 20px;\n      background: white;\n      border-radius: 10px;\n      box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\n    }\n\n    .service-intro h4 {\n      color: #2c3e50;\n      margin: 0 0 15px;\n      font-size: 18px;\n      font-weight: 600;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .service-intro ul {\n      list-style: none;\n      padding: 0;\n      margin: 0;\n    }\n\n    .service-intro li {\n      padding: 8px 0 8px 24px;\n      position: relative;\n      color: #34495e;\n      font-size: 15px;\n      line-height: 1.5;\n    }\n\n    .service-intro li:before {\n      content: "✓";\n      position: absolute;\n      left: 0;\n      color: #3498db;\n      font-weight: bold;\n    }\n\n    .contact-info {\n      text-align: center;\n      padding-top: 20px;\n      border-top: 2px solid #f0f2f5;\n    }\n\n    .contact-qr {\n      margin-bottom: 15px;\n    }\n\n    .contact-qr img {\n      max-width: 180px;\n      border-radius: 10px;\n      margin-bottom: 12px;\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n      transition: transform 0.3s ease;\n    }\n\n    .contact-qr img:hover {\n      transform: scale(1.05);\n    }\n\n    .contact-qr p {\n      margin: 5px 0;\n      color: #2c3e50;\n      font-weight: 600;\n      font-size: 16px;\n    }\n\n    .contact-note {\n      color: #7f8c8d;\n      font-size: 14px;\n      margin: 0;\n    }\n\n    @media (max-width: 768px) {\n      .service-sections {\n        flex-direction: column;\n        gap: 20px;\n      }\n      \n      .dev-service-popup {\n        padding: 20px;\n      }\n      \n      .service-intro {\n        padding: 15px;\n      }\n    }\n  ')}();