// ==UserScript==
// @name sdto
// @namespace http://tampermonkey.net/
// @license MIT
// @version 0.1
// @description happy
// @author damoshen
// @grant unsafeWindow
// @match *://*/*
// @require https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js
// @connect vagrantup.com
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @connect 127.0.0.1
// @connect 192.168.10.2
// ==/UserScript==
//必须在connect填你的sd域名,也就是你电脑的ip地址(本地ip)或网址xxx.com
(function() {
'use strict';
unsafeWindow.url = "http://192.168.10.2:7860";//sd地址 记得要修改上面的connect 的sd域名才能访问
unsafeWindow.prompts = "highres"; //额外固定的提示词 nsfw? 下面是反向提示词
unsafeWindow.negative_prompt = "bad proportions,out of focus,username,text,bad anatomy,lowres,worstquality,watermark,cropped,bad body,deformed,mutated,disfigured,poorly drawn face,mutated hands and fingers,malformed hands,poorly drawn hands,mutated hands,extra arms,extra limb,malformed limbs,missing limb,too many fingers,extra legs,bad feet,missing fingers,fused fingers,bad hands,acnes,floating limbs,disconnected limbs,long neck,long body,mutation,ugly,blurry,low quality,sketches,normal quality,monochrome,grayscale,signature,logo";
unsafeWindow.cfg_scale = 7;//关键词关联性
unsafeWindow.width = 512; //宽度
unsafeWindow.height = 512;//长度
unsafeWindow.restore_faces = false; //面部修复
unsafeWindow.steps = 20; //步数
unsafeWindow.sampler_name="DPM++ SDE Karras" ; //采样方式
unsafeWindow.start="image ss";//以什么开头 会被去除
unsafeWindow.end="quality";//以什么结尾,不去除
async function replaceSpansWithImagesai() {
var spans = document.querySelectorAll('span');
for (var i = 0; i < spans.length; i++) {
var span = spans[i];
if (!span.querySelector('span')) {
if (span.innerHTML.includes(unsafeWindow.start)) {
var linkText = span.textContent.trim();
if (linkText.startsWith(unsafeWindow.start) && linkText.endsWith(unsafeWindow.end)) {
var link = linkText.replace('unsafeWindow.start', '');
const button = document.createElement('button');
button.textContent = '生成图片';
button.dataset.link = link;
const imgSpan = document.createElement('span');
button.addEventListener('click', async function() {
const url = unsafeWindow.url;
const payload = {
"prompt": this.dataset.link+" "+unsafeWindow.prompts,
"negative_prompt": unsafeWindow.negative_prompt,
"steps": unsafeWindow.steps,
"sampler_name": unsafeWindow.sampler_name,
"width": unsafeWindow.width,
"height": unsafeWindow.height,
"restore_faces": unsafeWindow.restore_faces,
"cfg_scale":unsafeWindow.cfg_scale
};
try {
const response = await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: `${url}/sdapi/v1/txt2img`,
data: JSON.stringify(payload),
headers: {
"Content-Type": "application/json"
},
onload: resolve,
onerror: reject
});
});
const r = JSON.parse(response.responseText);
for (let i of r['images']) {
const png_payload = {
"image": "data:image/png;base64," + i
};
const response2 = await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: `${url}/sdapi/v1/png-info`,
data: JSON.stringify(png_payload),
headers: {
"Content-Type": "application/json"
},
onload: resolve,
onerror: reject
});
});
const pngInfo = JSON.parse(response2.responseText).info;
const dataURL = "data:image/png;base64," + i;
const img = document.createElement('img');
img.src = dataURL;
img.alt = "Generated Image";
img.dataset.parameters = pngInfo;
imgSpan.innerHTML = '';
imgSpan.appendChild(img);
}
} catch (error) {
console.error('Error generating image:', error);
}
});
span.parentNode.replaceChild(button, span);
button.parentNode.insertBefore(imgSpan, button.nextSibling);
}
}
}
}
}
async function replaceSpansWithImagesst() {
var ps = document.querySelectorAll('p');
for (var i = 0; i < ps.length; i++) {
var p = ps[i];
if (!p.querySelector('p')) {
if (p.innerHTML.includes(unsafeWindow.start)&&p.innerHTML.includes(unsafeWindow.end)) {
// var linkText = span.textContent.trim();
var linkText = p.textContent;
var regex = new RegExp(`${unsafeWindow.start}(.*)${unsafeWindow.end}`, "gs");
var matches = linkText.match(regex);
var targetText = matches[0];
var link = targetText.replace('image ss', '');
const button = document.createElement('button');
var uniqueId = "button_" + Math.random().toString(36).substr(2, 9);
button.id = uniqueId;
button.textContent = '生成图片';
button.dataset.link = link;
p.innerHTML = p.innerHTML.replace(targetText, button.outerHTML);
// 重新找到新创建的按钮
var newbutton = document.getElementById(uniqueId);
const imgSpan = document.createElement('span');
newbutton.addEventListener('click', async function() {
const url = unsafeWindow.url;
const payload = {
"prompt": this.dataset.link+" "+unsafeWindow.prompts,
"negative_prompt": unsafeWindow.negative_prompt,
"steps": unsafeWindow.steps,
"sampler_name": unsafeWindow.sampler_name,
"width": unsafeWindow.width,
"height": unsafeWindow.height,
"restore_faces": unsafeWindow.restore_faces,
"cfg_scale":unsafeWindow.cfg_scale
};
try {
const response = await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: `${url}/sdapi/v1/txt2img`,
data: JSON.stringify(payload),
headers: {
"Content-Type": "application/json"
},
onload: resolve,
onerror: reject
});
});
const r = JSON.parse(response.responseText);
for (let i of r['images']) {
const png_payload = {
"image": "data:image/png;base64," + i
};
const response2 = await new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: `${url}/sdapi/v1/png-info`,
data: JSON.stringify(png_payload),
headers: {
"Content-Type": "application/json"
},
onload: resolve,
onerror: reject
});
});
const pngInfo = JSON.parse(response2.responseText).info;
const dataURL = "data:image/png;base64," + i;
const img = document.createElement('img');
img.src = dataURL;
img.alt = "Generated Image";
img.dataset.parameters = pngInfo;
imgSpan.innerHTML = '';
imgSpan.appendChild(img);
}
} catch (error) {
console.error('Error generating image:', error);
}
});
// p.parentNode.replaceChild(button, span);
newbutton.parentNode.insertBefore(imgSpan, button.nextSibling);
}
}
}
}
if (window.location.hostname === 'www.perplexity.ai') {
setInterval(replaceSpansWithImagesai, 5000);
} else {
setInterval(replaceSpansWithImagesst, 5000);
};
})();