// ==UserScript==
// @name 豆包&即梦AI下载无水印图片
// @namespace http://tampermonkey.net/
// @version 1.31
// @description 实现豆包&即梦生成的图片免费无水印下载
// @author 11208596
// @license UNLICENSED
// @match https://www.doubao.com/*
// @match https://jimeng.jianying.com/ai-tool/*
// @grant GM_download
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function () {
'use strict';
// 创建确认对话框样式
const style = document.createElement('style');
style.textContent = `
.download-confirm-dialog {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
z-index: 10000;
min-width: 300px;
text-align: center;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.download-confirm-dialog h3 {
margin: 0 0 15px 0;
color: #333;
}
.download-confirm-dialog .buttons {
margin-top: 20px;
}
.download-confirm-dialog button {
margin: 0 10px;
padding: 8px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
.download-confirm-dialog .confirm-btn {
background: #1890ff;
color: white;
}
.download-confirm-dialog .confirm-btn:disabled {
background: #b4b4b4;
cursor: not-allowed;
}
.download-confirm-dialog .cancel-btn {
background: #f5f5f5;
color: #333;
}
.download-confirm-dialog button:hover {
opacity: 0.8;
}
.download-confirm-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 9999;
}
`;
document.head.appendChild(style);
// 获取当前网站域名
const currentDomain = window.location.hostname;
// 创建确认对话框
function createConfirmDialog(imageUrl, downloadFunction) {
// 创建遮罩层
const overlay = document.createElement('div');
overlay.className = 'download-confirm-overlay';
// 创建对话框
const dialog = document.createElement('div');
dialog.className = 'download-confirm-dialog';
// 设置对话框内容
dialog.innerHTML = `
<h3>确认下载</h3>
<p>是否下载此图片?</p>
<div class="buttons">
<button class="confirm-btn">确认</button>
<button class="cancel-btn">取消</button>
</div>
`;
// 添加到页面
document.body.appendChild(overlay);
document.body.appendChild(dialog);
// 绑定按钮事件
const confirmBtn = dialog.querySelector('.confirm-btn');
const cancelBtn = dialog.querySelector('.cancel-btn');
// 关闭对话框函数
function closeDialog() {
document.body.removeChild(overlay);
document.body.removeChild(dialog);
}
confirmBtn.addEventListener('click', () => {
// 禁用按钮,防止重复点击
confirmBtn.disabled = true;
confirmBtn.textContent = '下载中...';
// 包装下载函数,确保下载完成后关闭对话框
const wrappedDownload = (url) => {
downloadFunction(url, closeDialog);
};
wrappedDownload(imageUrl);
});
cancelBtn.addEventListener('click', closeDialog);
}
if (currentDomain.includes('doubao')) {
// 监听右键点击事件
document.addEventListener('contextmenu', function (event) {
if (event.target.tagName.toLowerCase() === 'img') {
const imgElement = event.target;
let imageUrl = imgElement.src;
if (imageUrl) {
createConfirmDialog(imageUrl, downloadImage);
event.preventDefault();
}
}
}, true);
// 下载图片的函数
function downloadImage(imageUrl, callback) {
const fileName = getFileNameFromUrl(imageUrl);
GM_xmlhttpRequest({
method: 'GET',
url: imageUrl,
responseType: 'blob',
headers: {
'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.doubao.com/',
'Origin': 'https://www.doubao.com',
'User-Agent': navigator.userAgent
},
onload: function(response) {
if (response.status === 200) {
const blob = response.response;
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
setTimeout(() => URL.revokeObjectURL(url), 100);
console.log('下载成功:', fileName);
// 下载完成后执行回调
if (callback) callback();
} else {
console.error('下载失败:', response.status);
if (callback) callback();
}
},
onerror: function(error) {
console.error('请求失败:', error);
if (callback) callback();
}
});
console.log(`正在下载图片: ${imageUrl}`);
}
// 从 URL 中提取文件名
function getFileNameFromUrl(url) {
// 移除查询参数
url = url.split('?')[0];
const urlParts = url.split('/');
let fileName = urlParts[urlParts.length - 1];
// 如果文件名包含处理参数,提取基础文件名
if (fileName.includes('~')) {
fileName = fileName.split('~')[0];
}
// 确保文件名有正确的扩展名
if (!fileName.endsWith('.jpeg') && !fileName.endsWith('.jpg')) {
fileName += '.jpeg';
}
return fileName;
}
} else if (currentDomain.includes('jianying')) {
// 监听右键点击事件
document.addEventListener('contextmenu', function (event) {
if (event.target.tagName.toLowerCase() === 'img') {
const imgElement = event.target;
let imageUrl = imgElement.src;
if (imageUrl) {
createConfirmDialog(imageUrl, downloadJianyingImage);
event.preventDefault();
}
}
}, true);
// 下载剪映图片的函数
function downloadJianyingImage(imageUrl, callback) {
const fileName = getJianyingFileName(imageUrl);
GM_xmlhttpRequest({
method: 'GET',
url: imageUrl,
responseType: 'blob',
headers: {
'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://jimeng.jianying.com/',
'Origin': 'https://jimeng.jianying.com',
'User-Agent': navigator.userAgent
},
onload: function(response) {
if (response.status === 200) {
const blob = response.response;
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
setTimeout(() => URL.revokeObjectURL(url), 100);
console.log('下载成功:', fileName);
// 下载完成后执行回调
if (callback) callback();
} else {
console.error('下载失败:', response.status);
if (callback) callback();
}
},
onerror: function(error) {
console.error('请求失败:', error);
if (callback) callback();
}
});
console.log(`正在下载图片: ${imageUrl}`);
}
// 从 URL 中提取剪映图片文件名
function getJianyingFileName(url) {
const urlParts = url.split('/');
let fileName = urlParts[urlParts.length - 1].split('?')[0];
if (!fileName.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
fileName += '.jpg';
}
return fileName;
}
}
})();