// ==UserScript== // @name 通用ai插图脚本 // @namespace http://tampermonkey.net/ // @version 6 // @license MIT // @description 免费或者使用sd的api配合ai生成插图 // @author 从前跟你一样 // @grant unsafeWindow // @match https://www.perplexity.ai/search/* // @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 // @connect pollinations.ai // @connect 此处换成你的电脑域名 // @downloadURL none // ==/UserScript== //必须在connect填你的sd域名,也就是你电脑的ip地址(本地ip)或网址xxx.com (function() { 'use strict'; unsafeWindow.sd=true; //true 开启 false 关闭 使用sd 否则使用免费网站 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";//ai输出的提示词以什么开头 会被去除 unsafeWindow.end="quality";///ai输出的提示词以什么结尾,不去除 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 replaceSpansWithImagesaifree() { 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() { var ran = Math.floor(Math.random() * 10000).toString(); const prompt = this.dataset.link + " " +unsafeWindow.prompts+" "+ran; const url = `https://image.pollinations.ai/prompt/${encodeURIComponent(prompt)}`; const img = document.createElement('img'); img.src = url; img.alt = "Generated Image"; imgSpan.innerHTML = ''; imgSpan.appendChild(img); } ); 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); } } } } async function replaceSpansWithImagesfree() { 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 = 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() { var ran = Math.floor(Math.random() * 10000).toString(); const prompt = this.dataset.link + " " +unsafeWindow.prompts+" "+ran; const url = `https://image.pollinations.ai/prompt/${encodeURIComponent(prompt)}`; const img = document.createElement('img'); img.src = url; img.alt = "Generated Image"; imgSpan.innerHTML = ''; imgSpan.appendChild(img); }); newbutton.parentNode.insertBefore(imgSpan, button.nextSibling); } } } } // if (window.location.hostname === 'www.perplexity.ai') { if(unsafeWindow.sd){ setInterval(replaceSpansWithImagesai, 5000); setInterval(replaceSpansWithImagesst, 5000); }else{ setInterval(replaceSpansWithImagesaifree, 5000); setInterval(replaceSpansWithImagesfree, 5000); }; })();