Pixiv Display All Images

Display all manga images automatically: no need to click the medium image.

目前為 2018-08-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Pixiv Display All Images
// @namespace    superschwul
// @version      1.5
// @description  Display all manga images automatically: no need to click the medium image.
// @homepageURL  https://gf.qytechs.cn/en/scripts/36886-pixiv-display-all-images
// @author       Superschwul
// @match        https://www.pixiv.net/stacc*
// @match        https://www.pixiv.net/member_illust.php*
// @grant        window.close
// @run-at       document-end
// ==/UserScript==

// ===============================================================================

// USER OPTIONS
var FIT_IMAGES_TO_SCREEN_WIDTH_AND_HEIGHT = false;
var LOAD_HIGH_RESOLUTION_IMAGES = true;

// ===============================================================================

// CHANGELOG
// 1.5 2018-08-29 improved image src identification
// 1.4 2018-08-26 added hi-res option, improved avatar timing
// 1.3 2018-08-16 removed feedback button
// 1.2 2018-08-16 disabled sticky bar, added fit-to-screen option
// 1.1 2018-06-21 fixed image src url
// 1.0 2018-06-17 show original instead of master manga images
// 0.8 2018-06-15 added fixed avatar
// 0.7 2018-06-13 added link to works page at illustration page
// 0.6 2018-06-12 updated to work with the new pixiv layout
// 0.5 2018-01-07 hide buttons over thumbnails at works page
// 0.4 2018-01-04 enlarge thumbnails at works page
// 0.3 2018-01-03 replaced gm_xmlhttprequest by xmlhttprequest
// 0.2 2017-12-30 added support for rtl manga pages
// 0.1 2017-12-30 initial code

// ===============================================================================

function addLinkToWorksPageAtStaccPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
        a.stacc_unify_comment_count {
            text-align: left !important;
        }
        .stacc_timeline_bottom {
            font-size: 200%;
        }
    `;
    document.getElementsByTagName('head')[0].appendChild(style);
    // add link
    var intervalCount = 0;
    var interval = setInterval(function() {
        intervalCount++;
        if(intervalCount >= 300) {
            clearInterval(interval);
            return;
        }
        var usernames = document.getElementsByClassName('stacc_ref_illust_user_name');
        if(usernames != undefined) {
            clearInterval(interval);
            var i = 0;
            for(i=0; i < usernames.length; i++) {
                usernames[i].style.display = 'block';
                var link = usernames[i].getElementsByTagName('a')[0].href;
                link = link.replace('member', 'member_illust');
                link = link.replace(/&from_sid=\d+/, '');
                var a = document.createElement('a');
                a.href = link;
                a.target = '_blank';
                a.style.display = 'block';
                a.appendChild(document.createTextNode("Go to Works page"));
                usernames[i].appendChild(a);
            }
        }
    }, 200);
}

function displayGalleryAtIllustrationPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    var styleCode = `
        body {
            background: #f5f5f5 !important;
        }
        #pil_gallery {
            padding: 3em;
            text-align: center;
            color: #b3c1d2;
        }
        #pil_gallery img {
            display: block;
            margin: 0 auto 3em auto;
            max-width: 100%;
            height: auto;
            background: #dcdbdb;
    `;
    if(FIT_IMAGES_TO_SCREEN_WIDTH_AND_HEIGHT) {
        styleCode += 'max-height: 90vh';
    }
    styleCode += `
        }
        figure > div:nth-child(2) > div {
            position: unset !important;
        }
        #pil_works {
            width: 93%;
            padding: 0.5em;
            background: white;
            text-align: center;
            display: block;
            border-radius: 1em;
            margin-top: 1em;
            font-weight: bold;
            text-decoration: none;
            font-size: 80%;
        }
        #pil_works:visited {
            color: #ccc;
        }
        #pil_fixedAvatar {
            position: fixed;
            left: 1.6em;
            bottom: 2em;
            width: 204px;
        }
        #root div:nth-child(4) > button {
            display: none;
        }
        #root div:nth-child(4) > ul {
            bottom: 2em;
        }
    `;
    style.innerHTML = styleCode;
    document.getElementsByTagName('head')[0].appendChild(style);
    //is it a single image, multiple vertical, or multiple rtl?
    var type = 'single';
    var intervalCount = 0;
    var interval = setInterval(function() {
        intervalCount++;
        if(intervalCount >= 300) {
            clearInterval(interval);
            return;
        }
        var article = document.getElementsByTagName('article')[0];
        var thumb;
        if(article != undefined) {
            thumb = article.getElementsByTagName('a')[0];
        }
        if(thumb != undefined) {
            var imgSrc = thumb.getElementsByTagName('img')[0].src;
            if(imgSrc != unsafeWindow.location.href) {
                clearInterval(interval);
                if(thumb.pathname == '/member_illust.php') {
                    type = 'vertical';
                }
                addLinkToWorksPageAtIllustPage();
                addFixedAvatar();
                //get original images and fill gallery
                if(type == 'single') {
                    getSingleOriginalImage(thumb);
                } else {
                    getMultipleVerticalOriginalImages();
                }
            }
        }
    }, 200);
}

function addLinkToWorksPageAtIllustPage() {
    var intervalAvatarCount = 0;
    var intervalAvatar = setInterval(function() {
        intervalAvatarCount++;
        if(intervalAvatarCount >= 300) {
            clearInterval(intervalAvatar);
            return;
        }
        var avatar = document.getElementsByTagName('aside')[1].children[0].children[0];
        if(avatar.children[0] != undefined) {
            clearInterval(intervalAvatar);
            var link = document.createElement('a');
            link.id = 'pil_works';
            link.href = avatar.children[0].href.replace('member', 'member_illust');
            link.appendChild(document.createTextNode('More works'));
            avatar.parentNode.insertBefore(link, avatar.nextSibling);
        }
    }, 200);
}

function addFixedAvatar() {
    var avatar = document.getElementsByTagName('aside')[1].children[0].children[0];
    var fixedAvatar = document.createElement('div');
    fixedAvatar.id = 'pil_fixedAvatar';
    fixedAvatar.appendChild(avatar.cloneNode(true));
    var links = fixedAvatar.getElementsByTagName('a');
    var i = 0;
    for(i=0; i < links.length; i++) {
        links[i].href = links[i].href.replace('member', 'member_illust');
    }
    document.body.appendChild(fixedAvatar);
}

function getSingleOriginalImage(thumb) {
    var images = [];
    var image = document.createElement('img');
    image.src = thumb.href; // original
    var imageContainer = document.createElement('div');
    if(LOAD_HIGH_RESOLUTION_IMAGES) {
        imageContainer.innerHTML = '<img src="' +image.src+ '"></a>';
    } else {
        image.src = thumb.getElementsByTagName('img')[0].src;
        image.dataset.original = thumb.href;
        imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
    }
    images.push(imageContainer);
    fillGallery(images);
}

function getMultipleVerticalOriginalImages() {
    var url = unsafeWindow.location.href.replace('medium', 'manga');
    var req = new XMLHttpRequest();
    req.addEventListener("load", function() {
        var images = [];
        var parser = new DOMParser();
        var responseDoc = parser.parseFromString(this.responseText, "text/html");
        var imageContainers = responseDoc.getElementsByClassName('item-container');
        if(imageContainers.length == 0) {
            getMultipleRtlOriginalImages(responseDoc);
            return;
        }
        var i = 0;
        for(i=0; i < imageContainers.length; i++) {
            var image = imageContainers[i].getElementsByTagName('img')[0];
            image.src = image.dataset.src; //master
            var originalSrc = image.src.replace('img-master', 'img-original');
            originalSrc = originalSrc.replace('_master1200', '');
            image.dataset.original = originalSrc;
            var imageContainer = document.createElement('div');
            if(LOAD_HIGH_RESOLUTION_IMAGES) {
                image.src = originalSrc;
                delete image.dataset.original;
                var altExt = swapExt(image.src);
                imageContainer.innerHTML = '<img src="' +image.src+ '" onerror="this.onerror=null; this.src=\'' +altExt+ '\';">';
            } else {
                imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
            }
            images.push(imageContainer);
        }
        fillGallery(images);
    });
    req.open('GET', url);
    req.send();
}

function getMultipleRtlOriginalImages(responseDoc) {
    var images = [];
    var scriptTags = responseDoc.getElementsByTagName('script');
    var i = 0;
    for(i=0; i < scriptTags.length; i++) {
        if(scriptTags[i].textContent.search('pixiv.context.images\\[') != -1) {
            var imageVar = scriptTags[i].textContent.split(';')[0];
            var imageUrl = imageVar.split('"')[1].replace(/\\/g, '');
            var image = document.createElement('img');
            image.src = imageUrl; //master
            var originalSrc = image.src.replace('img-master', 'img-original');
            originalSrc = originalSrc.replace('_master1200', '');
            image.dataset.original = originalSrc;
            var imageContainer = document.createElement('div');
            if(LOAD_HIGH_RESOLUTION_IMAGES) {
                image.src = originalSrc;
                delete image.dataset.original;
                var altExt = swapExt(image.src);
                imageContainer.innerHTML = '<img src="' +image.src+ '" onerror="this.onerror=null; this.src=\'' +altExt+ '\';">';
            } else {
                imageContainer.innerHTML = '<a href="' +image.dataset.original+ '"><img src="' +image.src+ '"></a>';
            }
            images.push(imageContainer);
        }
    }
    fillGallery(images);
}

function swapExt(src) {
    var ext = src.substr(src.length - 3);
    var swap = { jpg: 'png', png: 'jpg' };
    return src.replace(ext, swap[ext]);
}

function fillGallery(images) {
    var gallery = document.createElement('div');
    gallery.id = 'pil_gallery';
    var i = 0;
    for(i=0; i < images.length; i++) {
        var p = document.createElement('p');
        i++;
        var pText = document.createTextNode('Image ' + i + ' of ' + images.length);
        i--;
        p.appendChild(pText);
        gallery.appendChild(p);
        //images[i].onclick = function(){ window.close(); }; // OPTIONAL
        gallery.appendChild(images[i]);
    }
    var header = document.getElementsByTagName('header')[0];
    header.parentNode.insertBefore(gallery, header.nextSibling);
}

function enlargeThumbsAtWorksPage() {
    // override css
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
        .manage-unit .image-item {
            width: 220px;
        }
        ._work.work {
            width: 220px;
            height: 220px;
        }
        .image-item img {
            object-fit: contain;
            width: 220px;
            height: 220px;
        }
        ._one-click-bookmark,
        .thumbnail-menu {
            display: none; /* OPTIONAL */
        }
    `;
    document.getElementsByTagName('head')[0].appendChild(style);
}

(function() {
    'use strict';
    if (window.top != window.self) {
        return;
    }
    // run on stacc page
    if(unsafeWindow.location.href.search('stacc') != -1) {
        addLinkToWorksPageAtStaccPage();
    }
    // run on works page
    if(unsafeWindow.location.href.search('member_illust') != -1 &&
    unsafeWindow.location.href.search('mode') == -1) {
        enlargeThumbsAtWorksPage();
    }
    // run on illustration page
    if(unsafeWindow.location.href.search('medium') != -1) {
        displayGalleryAtIllustrationPage();
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址