// ==UserScript== // @name pixiv获取原图 // @namespace https://github.com/MuXia-0326/twitter-auto-original-picture // @version 1.7 // @description pixiv页面生成按钮用于复制原图链接和下载原图 // @author Mossia // @icon https://raw.githubusercontent.com/MuXia-0326/drawio/master/angri.png // @match *://www.pixiv.net/* // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_download // @license MIT // @downloadURL none // ==/UserScript== const css = ` .pixiv-Btn { z-index: 1000; position: relative; display: inline-block; margin-right: 5px; padding: 10px; text-align: center; font-size: 18px; letter-spacing: 1px; text-decoration: none; color: rgb(0, 150, 250); background: transparent; cursor: pointer; transition: ease-out 0.5s; border: 2px solid rgb(0, 150, 250); border-radius: 10px; box-shadow: inset 0 0 0 0 rgb(0, 150, 250); } .pixiv-Btn:hover { color: white; box-shadow: inset 0 -100px 0 0 rgb(0, 150, 250); } .pixiv-Btn:active { transform: scale(0.9); } .pixiv-Btn:hover svg { fill: white; } .pixiv-Btn:active svg, .pixiv-Btn svg { fill: rgb(0, 150, 250); } .Btn { position: absolute; right: 0px; bottom: 0px; } .svgClass { display: flex; } .share-btn { display:none; } `; let styleTag = document.createElement('style'); styleTag.innerText = css; document.head.append(styleTag); function ILog() { this.prefix = ''; this.v = function (value) { if (level <= this.LogLevel.Verbose) { console.log(this.prefix + value); } }; this.i = function (info) { if (level <= this.LogLevel.Info) { console.info(this.prefix + info); } }; this.w = function (warning) { if (level <= this.LogLevel.Warning) { console.warn(this.prefix + warning); } }; this.e = function (error) { if (level <= this.LogLevel.Error) { console.error(this.prefix + error); } }; this.d = function (element) { if (level <= this.LogLevel.Verbose) { console.log(element); } }; this.setLogLevel = function (logLevel) { level = logLevel; }; this.LogLevel = { Verbose: 0, Info: 1, Warning: 2, Error: 3, }; let level = this.LogLevel.Warning; } var iLog = new ILog(); // let pixiv_proxy = 'https://i.pixiv.cat'; let pixiv_proxy = 'https://pixiv.mossia.top'; let g_getArtworkUrl = '/ajax/illust/#id#/pages'; let share_url = ''; let share_url_two = ''; let userName = ''; // 当前页面类型 let g_pageType = -1; // 页面相关的一些预定义,包括处理页面元素等 let PageType = { // 作品详情页 Artwork: 0, // 总数 PageTypeCount: 1, }; /* Pages 必须实现的函数 * PageTypeString: string,字符串形式的 PageType * bool CheckUrl: function(string url),用于检查一个 url 是否是当前页面的目标 url * ProcessPageElements: function(),处理页面(寻找图片元素、添加按钮) */ let Pages = {}; Pages[PageType.Artwork] = { PageTypeString: 'ArtworkPage', CheckUrl: function (url) { return /^https:\/\/www.pixiv.net\/artworks\/.*/.test(url) || /^https:\/\/www.pixiv.net\/en\/artworks\/.*/.test(url); }, ProcessPageElements: function () { if (userName === '') { getUserName(); } // 动图不处理 if (document.querySelector('main figure canvas')) { return; } // 未加载完不处理 if (!document.querySelector('main figure')) { return; } let allImage = document.querySelector('main figure').parentNode.querySelector('section + button'); if (allImage) { allImage.click(); } let matched = location.href.match(/artworks\/(\d+)/); if (!matched) { return; } let pid = matched[1]; let url = g_getArtworkUrl.replace('#id#', pid); let original = []; //生成按钮 let divImages = document.querySelectorAll('main figure div:first-child div[role="presentation"]'); divImages.forEach((e, i) => { let _this = e; let image = _this.querySelector('a').parentNode; if (image.querySelector('.Btn') && image.querySelector('.Btn').getAttribute('data-pid') === pid) { return; } fetch(url, { method: 'GET', }) .then((response) => response.json()) .then((json) => { iLog.i('Got artwork urls:'); if (json.error === true) { iLog.e('Server responsed an error: ' + json.message); return; } for (let i = 0; i < json.body.length; i++) { original.push(json.body[i].urls.original); } }) .catch((error) => { iLog.e('Request image urls failed!'); if (error) { iLog.e(error); } }); let btns = image.querySelectorAll('.Btn'); if (btns.length > 0) { btns.forEach((btn) => btn.remove()); } let div = document.createElement('div'); div.innerHTML = `