Greasy Fork is available in English.
豆包AI生图下载原图去水印,并添加用户提示
// ==UserScript==
// @name 豆包AI生图去水印(增强版)
// @namespace http://tampermonkey.net/
// @version 1.2.0
// @description 豆包AI生图下载原图去水印,并添加用户提示
// @author mzh
// @homepage https://blog.csdn.net/u011027547
// @match https://www.doubao.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=doubao.com
// @grant none
// @license GPL-3.0
// ==/UserScript==
(function() {
'use strict';
let scriptActive = false;
function showActivationMessage() {
// 避免重复提示
if (scriptActive) return;
scriptActive = true;
// 控制台日志
console.log('🚫 豆包AI去水印脚本已激活,正在监控图片数据...');
// 页面顶部状态栏
const statusBar = document.createElement('div');
statusBar.textContent = '豆包AI去水印:已启用(检测到图片生成时会自动去除水印)';
statusBar.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
background: #4CAF50;
color: white;
padding: 8px;
text-align: center;
font-size: 14px;
z-index: 9999;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
`;
document.body.appendChild(statusBar);
// 5秒后淡出状态栏
setTimeout(() => {
statusBar.style.transition = 'opacity 0.5s';
statusBar.style.opacity = '0';
setTimeout(() => {
if (document.body.contains(statusBar)) {
document.body.removeChild(statusBar);
}
}, 500);
}, 5000);
}
function showSuccessToast() {
const toast = document.createElement('div');
toast.innerHTML = '✅ 已成功去除图片水印,可下载无水印原图';
toast.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #2196F3;
color: white;
padding: 12px 16px;
border-radius: 4px;
z-index: 10000;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
font-size: 14px;
max-width: 300px;
`;
document.body.appendChild(toast);
setTimeout(() => {
if (document.body.contains(toast)) {
toast.style.transition = 'opacity 0.5s';
toast.style.opacity = '0';
setTimeout(() => {
if (document.body.contains(toast)) {
document.body.removeChild(toast);
}
}, 500);
}
}, 3000);
}
function findAllKeysInJson(obj, key) {
const results = [];
function search(current) {
if (current && typeof current === 'object') {
if (!Array.isArray(current) && Object.prototype.hasOwnProperty.call(current, key)) {
results.push(current[key]);
}
const items = Array.isArray(current) ? current : Object.values(current);
for (const item of items) {
search(item);
}
}
}
search(obj);
return results;
}
let _parse = JSON.parse;
JSON.parse = function(data) {
let jsonData = _parse(data);
if (!data.match('creations')) return jsonData;
let creations = findAllKeysInJson(jsonData, 'creations');
if (creations.length > 0) {
creations.forEach((creation) => {
creation.map((item) => {
if (item.image && item.image.image_ori_raw && item.image.image_ori_raw.url) {
const rawUrl = item.image.image_ori_raw.url;
item.image.image_ori.url = rawUrl;
// 预览时也去水印
item.image.image_preview.url = rawUrl;
item.image.image_thumb.url = rawUrl;
}
return item;
});
});
// 显示成功提示
setTimeout(showSuccessToast, 500);
}
return jsonData;
}
// 页面加载后显示激活提示
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', showActivationMessage);
} else {
setTimeout(showActivationMessage, 1000);
}
})();