// ==UserScript== // @name Pixiv Previewer // @namespace https://github.com/Ocrosoft/PixivPreviewer // @version 3.2.2 // @description Display preview images (support single image, multiple images, moving images); Download animation(.zip); Sorting the search page by favorite count(and display it). Updated for the latest search page. // @description:zh-CN 显示预览图(支持单图,多图,动图);动图压缩包下载;搜索页按热门度(收藏数)排序并显示收藏数,适配11月更新。 // @description:ja プレビュー画像の表示(単一画像、複数画像、動画のサポート); アニメーションのダウンロード(.zip); お気に入りの数で検索ページをソートします(そして表示します)。 最新の検索ページ用に更新されました。 // @description:zh_TW 顯示預覽圖像(支持單幅圖像,多幅圖像,運動圖像); 下載動畫(.zip); 按收藏夾數對搜索頁進行排序(並顯示)。 已為最新的搜索頁面適配。 // @author Ocrosoft // @match *://www.pixiv.net/* // @grant none // @compatible Chrome // @downloadURL none // ==/UserScript== // 测试 JQuery,如果不支持就插入 //let $ = function () { }; try { $(); } catch (e) { let script = document.createElement('script'); script.src = 'https://code.jquery.com/jquery-2.2.4.min.js'; document.head.appendChild(script); } let Lang = { // 中文-中国大陆 zh_CN: 0, // 英语-美国 en_US: 1, }; let Texts = {}; Texts[Lang.zh_CN] = { // 安装或更新后弹出的提示 install_title: '欢迎使用 PixivPreviewer v', install_body: '

功能更新(v3.2.0): 增加“排序时隐藏已关注画师作品”选项,默认关闭,可到设置中开启。


欢迎反馈问题和提出建议!>反馈页面<


如果您是第一次使用,推荐到 详情页 查看脚本介绍。

', // 设置项 setting_preview: '预览', setting_sort: '排序(仅搜索页生效)', setting_anime: '动图下载(动图预览及详情页生效)', setting_origin: '预览时优先显示原图(慢)', setting_maxPage: '每次排序时统计的最大页数', setting_hideWork: '隐藏收藏数少于设定值的作品', setting_hideFav: '排序时隐藏已收藏的作品', setting_hideFollowed: '排序时隐藏已关注画师作品', setting_blank: '使用新标签页打开作品详情页', setting_turnPage: '使用键盘←→进行翻页(排序后的搜索页)', setting_save: '保存设置', setting_reset: '重置脚本', setting_resetHint: '这会删除所有设置,相当于重新安装脚本,确定要重置吗?', // 搜索时过滤值太高 sort_noWork: '没有可以显示的作品', sort_getWorks: '正在获取第%1/%2页作品', sort_getBookmarkCount: '获取收藏数:%1/%2', }; // translate by google Texts[Lang.en_US] = { install_title: 'Welcome to PixivPreviewer v', install_body: '

Feature update(v3.2.0): Add a options "Hide artworks of followed artists", this is disabled by default, you can enable it in settings.


Feedback questions and suggestions are welcome! >Feedback Page<


If you are using it for the first time, it is recommended to go to the Details Page to see the script introduction.

', setting_preview: 'Preview', setting_sort: 'Sorting (Search page)', setting_anime: 'Animation download (Preview and Artwork page)', setting_origin: 'Display original image when preview (slow)', setting_maxPage: 'Maximum number of pages counted per sort', setting_hideWork: 'Hide works with less than set value', setting_hideFav: 'Hide favorites when sorting', setting_hideFollowed: 'Hide artworks of followed artists when sorting', setting_blank: 'Open works\' details page in new tab', setting_turnPage: 'Use ← → to turn pages (Search page)', setting_save: 'Save', setting_reset: 'Reset', setting_resetHint: 'This will delete all settings and set it to default. Are you sure?', sort_noWork: 'No works to display', sort_getWorks: 'Getting artworks of page: %1 of %2', sort_getBookmarkCount: 'Getting bookmark count of artworks:%1 of %2', }; let LogLevel = { None: 0, Error: 1, Warning: 2, Info: 3, Elements: 4, }; function DoLog(level, msgOrElement) { if (level <= g_logLevel) { let prefix = '%c'; let param = ''; if (level == LogLevel.Error) { prefix += '[Error]'; param = 'color:#ff0000'; } else if (level == LogLevel.Warning) { prefix += '[Warning]'; param = 'color:#ffa500'; } else if (level == LogLevel.Info) { prefix += '[Info]'; param = 'color:#000000'; } else if (level == LogLevel.Elements) { prefix += 'Elements'; param = 'color:#000000'; } if (level != LogLevel.Elements) { console.log(prefix + msgOrElement, param); } else { console.log(msgOrElement); } if (++g_logCount > 512) { //console.clear(); g_logCount = 0; } } } // 语言,如果 g_autoDetectLanguage 的值为 true,则默认值无效;如果希望使用某种语言,请这样操作: // 1.修改 g_language 的值,中文(Lang.zh_CN)、英文(Lang.en_US) // 2.将 g_autoDetectLanguage 的值从 true 修改为 false // ===== // If you want to set language instead auto detect it, follow this: // 1.Change g_language's value, Chinese(Lang.zh_CN), English(Lang.en_US). // 2.Change g_autoDetectLanguage's value from true to false. let g_language = Lang.zh_CN; // 自动检测语言,开启后 g_language 的默认值将无效 let g_autoDetectLanguage = true; // 版本号,第三位不需要跟脚本的版本号对上,第三位更新只有需要弹更新提示的时候才需要更新这里 let g_version = '3.2.0'; // 添加收藏需要这个 let g_csrfToken = ''; // 打的日志数量,超过一定数值清空控制台 let g_logCount = 0; // 当前页面类型 let g_pageType = -1; // 图片详情页的链接,使用时替换 #id# let g_artworkUrl = '/artworks/#id#'; // 获取图片链接的链接 let g_getArtworkUrl = '/ajax/illust/#id#/pages'; // 获取动图下载链接的链接 let g_getUgoiraUrl = '/ajax/illust/#id#/ugoira_meta'; // 鼠标位置 let g_mousePos = { x: 0, y: 0 }; // 加载中图片 let g_loadingImage = 'https://pp-1252089172.cos.ap-chengdu.myqcloud.com/loading.gif'; // 页面打开时的 url let initialUrl = location.href; // 默认设置,仅用于首次脚本初始化 let g_defaultSettings = { 'enablePreview': 1, 'enableSort': 1, 'enableAnimeDownload': 1, 'original': 0, 'pageCount': 2, 'favFilter': 0, 'hideFavorite': 0, 'hideFollowed': 0, 'linkBlank': 1, 'pageByKey': 0, 'logLevel': 1, 'version': g_version, }; // 设置 let g_settings; // 日志等级 let g_logLevel = LogLevel.Warning; // 排序时同时请求收藏量的 Request 数量,没必要太多,并不会加快速度 let g_maxXhr = 64; // 排序是否完成(如果排序时页面出现了非刷新切换,强制刷新) let g_sortComplete = true; // 页面相关的一些预定义,包括处理页面元素等 let PageType = { // 搜索 Search: 0, // 关注的新作品 BookMarkNew: 1, // 发现 Discovery: 2, // 用户主页 Member: 3, // 首页 Home: 4, // 排行榜 Ranking: 5, // 大家的新作品 NewIllust: 6, // R18 R18: 7, // 自己的收藏页 BookMark: 8, // 动态 Stacc: 9, // 作品详情页(处理动图预览及下载) Artwork: 10, // 总数 PageTypeCount: 11, }; let Pages = {}; /* Pages 必须实现的函数 * PageTypeString: string,字符串形式的 PageType * bool CheckUrl: function(string url),用于检查一个 url 是否是当前页面的目标 url * ReturnMap ProcessPageElements: function(),处理页面(寻找图片元素、添加属性等),返回 ReturnMap * ReturnMap GetProcessedPageElements: function(), 返回上一次 ProcessPageElements 的返回值(如果没有上次调用则调用一次) * Object GetToolBar: function(), 返回工具栏元素(右下角那个,用来放设置按钮) * HasAutoLoad: bool,表示这个页面是否有自动加载功能 */ let ReturnMapSample = { // 页面是否加载完成,false 意味着后面的成员无效 loadingComplete: false, // 控制元素,每个图片的鼠标响应元素 controlElements: [], // 可有可无,如果为 true,强制重新刷新预览功能 forceUpdate: false, }; let ControlElementsAttributesSample = { // 图片信息,内容如下: // [必需] 图片 id illustId: 0, // [必需] 图片类型(0:普通图片,2:动图) illustType: 0, // [必需] 页数 pageCount: 1, // [可选] 标题 title: '', // [可选] 作者 id userId: 0, // [可选] 作者昵称 userName: '', // [可选] 收藏数 bookmarkCount: 0, }; function findToolbarCommon() { let div = $('#root').children('div'); // 搜索页前面插入了一个新的 div 节点 if ($('#root').children('#gtm-var-theme-kind').length > 0) { let max_children = 0; let max_children_i = 0; for (let i = 0; i < div.length; ++i) { if (div.children().length > max_children) { max_children_i = i; max_children = $(div[i]).children().length; } } div = $(div[max_children_i]).children(); } for (let i = div.length - 1; i >= 0; i--) { if ($(div.get(i)).children('ul').length > 0) { return $(div.get(i)).children('ul').get(0); } } } function findToolbarOld() { return $('._toolmenu').get(0); } Pages[PageType.Search] = { PageTypeString: 'SearchPage', CheckUrl: function (url) { // 没有 /artworks 的页面不支持 return /^https?:\/\/www.pixiv.net\/tags\/.*\/(artworks|illustrations|manga)/.test(url) || /^https?:\/\/www.pixiv.net\/en\/tags\/.*\/(artworks|illustrations|manga)/.test(url); }, ProcessPageElements: function () { let returnMap = { loadingComplete: false, controlElements: [], }; let sections = $('section'); DoLog(LogLevel.Info, 'Page has ' + sections.length + '
.'); DoLog(LogLevel.Elements, sections); // 先对 section 进行评分 let sectionIndex = -1; let bestScore = -99; sections.each(function (i, e) { let section = $(e); let score = 0; if (section.find('ul').length > 0) { let childrenCount = section.children().length; if (childrenCount != 2) { DoLog(LogLevel.Warning, '