// ==UserScript== // @name AI生成画像の埋め込み情報を表示するやつ // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description AI生成画像の埋め込み情報を表示する。コンテキストメニューから実行して下さい。 // @author としあき // @match https://*.2chan.net/* // @icon https://www.google.com/s2/favicons?sz=64&domain=2chan.net // @grant none // @homepage https://wikiwiki.jp/sd_toshiaki/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E6%96%B9%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89#w79c1be7 // @run-at context-menu // ==/UserScript== (function () { let exif = (str) => { let res = ""; for (let i = 0; i < str.length; i = i + 2) { res = res + str[i] } return res; }; const exifinfo = () => [...document.querySelectorAll('a[href$=".jpg"]:last-of-type, a[href$=".webp"]:last-of-type')].forEach(async e => { if (!e.dataset.fetched) { e.dataset.fetched = true; const m = (await (await fetch(e.href)).text()).match(/UNICODE*([^]*)/u); m && (e.parentElement.innerHTML += `
Info
${
                      exif(m[1])
                          .replace(/&/g,'&')
                          .replace(//g,'>')
                          .replace(/"/g,'"')
                          .replace(/'/g,''')
                          .replace(/([A-Z][^:,]+: )/g, '$1')
                  }
`) } }); const pnginfo = () => [...document.querySelectorAll('a[href$=".png"]:last-of-type')].forEach(async e => { if (!e.dataset.fetched) { e.dataset.fetched = true; const m = (await (await fetch(e.href)).text()).match(/(?<=Xt(?:parameters|Description|Comment)\0*)([^\0]+)/ug); m && (e.parentElement.innerHTML += `
Info
${
                      m.join('')
                          .replace(/&/g,'&')
                          .replace(//g,'>')
                          .replace(/"/g,'"')
                          .replace(/'/g,''')
                          .replace(/([A-Z][^:,]+: )/g, '$1')
                  }
`) } }); exifinfo(); pnginfo(); const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (!mutation.addedNodes.length) return; const rtd = mutation.addedNodes[0].querySelector(".rtd"); if (rtd) { exifinfo(); pnginfo(); } }); }); const target = document.querySelector(".thre"); if (target) { observer.observe(target, { childList: true }); } })();