Pixiv 增强

屏蔽广告, 查看热门图片, 按收藏数搜索, 替换大图, 下载gif、多图, 显示画师id、画师背景图, 自动加载评论。github:https://github.com/Ahaochan/Tampermonkey,欢迎star和fork。

目前为 2017-11-06 提交的版本。查看 最新版本

// ==UserScript==
// @name        Pixiv 增强
// @namespace   https://github.com/Ahaochan/Tampermonkey
// @version     0.0.8
// @description 屏蔽广告, 查看热门图片, 按收藏数搜索, 替换大图, 下载gif、多图, 显示画师id、画师背景图, 自动加载评论。github:https://github.com/Ahaochan/Tampermonkey,欢迎star和fork。
// @author      Ahaochan
// @match       https://*.pixiv.net*
// @match       https://*.pixiv.net/*
// @connect     i.pximg.net
// @grant       GM_xmlhttpRequest
// @grant       GM_setClipboard
// @require     https://code.jquery.com/jquery-2.2.4.min.js
// @require     https://cdn.bootcss.com/jszip/3.1.4/jszip.min.js
// @require     https://cdn.bootcss.com/FileSaver.js/1.3.2/FileSaver.min.js
// ==/UserScript==

(function ($) {
    'use strict';

    // 删除广告、查看热门图片
    (function () {
        // 删除广告
        $('._premium-lead-tag-search-bar').hide();
        // 查看热门图片
        $('.popular-introduction-overlay').hide();
    })();

    // 按收藏数搜索
    (function () {
        $('.navigation-menu-right').append(
            '<div class="menu-group">' +
            '    <a class="menu-item js-click-trackable-later">' +
            '           <img class="_howto-icon" src="https://source.pixiv.net/www/images/knowhow/icon/howto-brush.svg?20171004">' +
            '           <span class="label">收藏人数:</span>' +
            '           <select id="ahao_favourite_num_select">' +
            '               <option value=""></option>' +
            '               <option value="10000users入り">10000users入り</option>' +
            '               <option value="5000users入り" > 5000users入り</option>' +
            '               <option value="1000users入り" > 1000users入り</option>' +
            '               <option value="500users入り"  >  500users入り</option>' +
            '               <option value="300users入り"  >  300users入り</option>' +
            '               <option value="100users入り"  >  100users入り</option>' +
            '               <option value="50users入り"   >   50users入り</option>' +
            '           </select>' +
            '   </a>' +
            '</div>');

        // 如果已经有搜索字符串就在改变选项时直接搜索
        $('#ahao_favourite_num_select').on('change', function () {
            var $text = $('#suggest-input');
            if (!!$text.val()) {
                $('#suggest-container').submit();
            }
        });

        // 在提交搜索前处理搜索关键字
        $('#suggest-container').submit(function () {
            var $text = $('#suggest-input');
            var $favourite = $('#ahao_favourite_num_select');
            // 去除旧的搜索选项
            $text.val($text.val().replace(/\d*users入り/, ''));
            // 去除多余空格
            while ($text.val().indexOf('  ') > -1) {
                $text.val($text.val().replace('  ', ' '));
            }
            // 添加新的搜索选项
            $text.val($text.val() + ' ' + $favourite.val());
        });
    })();

    // 下载图片
    (function () {
        if (!(location.href.indexOf('member_illust.php') !== -1)) {
            return;
        }
        // 获取参数
        var param = $('.bookmark_modal_thumbnail')
            .attr('data-src')
            .match(/img-master\/img([\s\S]*?)_/)
            [1];

        // 单图、多图、gif图三种模式
        var moreMode = !!$('a.read-more').length;
        var gifMode = !!$('div ._ugoku-illust-player-container').length;
        var singleMode = !moreMode && !gifMode;

        // 替换单图为大图
        (function () {
            if (!singleMode) {
                return;
            }
            console.log('加载单图模式');

            var img = $('.original-image').attr('data-src');
            $('div.works_display')
                .find('img')
                .attr('src', img)
                .css('width', '100%');
        })();

        // 下载动图
        (function () {
            if (!gifMode) {
                return;
            }
            console.log('加载gif图模式');

            var url = 'https://i.pximg.net/img-zip-ugoira/img' + param + '_ugoira600x600.zip';
            // 添加下载按钮
            $('div .bookmark-container').append(
                '<a href="' + url + '" class="_bookmark-toggle-button add-bookmark">' +
                '   <span class="bookmark-icon"></span><span class="description">下载动图</span>' +
                '</a>');
        })();

        // 下载多图
        (function () {
            if (!moreMode) {
                return;
            }
            console.log('加载多图模式');

            var downloaded = 0;                             // 下载完成数量
            var num = $('a.read-more').text().match(/\d+/); // 下载目标数量

            // 1. 添加下载按钮
            var zip = new JSZip();
            var $a = $('<a class="_bookmark-toggle-button add-bookmark">' +
                '   <span class="bookmark-icon"></span><span class="description">下载中</span>' +
                '</a>');
            $a.on('click', function () {
                if (downloaded < num) {
                    return;
                }
                zip.generateAsync({type: "blob", base64: true})
                    .then(function (content) {
                        saveAs(content, "pic.zip"); // see FileSaver.js'
                    });
            });
            $('div .bookmark-container').append($a);

            // 2. 获取图片地址
            var ajaxs = [];
            var imgUrls = [];
            var illust_id = pixiv.context.illustId;
            for (var i = 0; i < num; i++) {
                var url = 'https://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=' + illust_id + '&page=' + i;
                var ajax = $.ajax({
                    type: 'GET',
                    url: url,
                    headers: {referer: 'https://www.pixiv.net/'}
                });
                ajaxs.push(ajax);
            }
            // 3. 获取所有图片url后
            $.when.apply($, ajaxs).then(function () {
                for (var i in arguments) {
                    var html = arguments[i][2].responseText;
                    var pattern = /(<img.+">)/;
                    var $img = $(html.match(pattern)[0]);
                    imgUrls.push($img.attr('src'));
                }

                // 4. 下载并压缩图片
                (function () {
                    for (var i = 0; i < num; i++) {
                        (function (index) {
                            var url = imgUrls[i];
                            // 4.1. 下载图片
                            GM_xmlhttpRequest({
                                method: 'GET',
                                headers: {referer: 'https://www.pixiv.net/'},
                                overrideMimeType: 'text/plain; charset=x-user-defined',
                                url: url,
                                onload: function (xhr) {
                                    // 转为blob类型
                                    var r = xhr.responseText,
                                        data = new Uint8Array(r.length),
                                        i = 0;
                                    while (i < r.length) {
                                        data[i] = r.charCodeAt(i);
                                        i++;
                                    }
                                    var blob = new Blob([data], {type: 'image/jpeg'});

                                    // 压缩图片
                                    downloaded++;
                                    var suffix = url.split('.').splice(-1);
                                    zip.file('pic_' + index + '.' + suffix, blob, {binary: true});

                                    if (downloaded == num) {
                                        $a.find('.description').text('下载多图(' + downloaded + '/' + num + ')');
                                    } else {
                                        $a.find('.description').text('下载中: ' + downloaded + '/' + num);
                                    }
                                }
                            });
                        })(i);
                    }
                })();
            }, function () {
                //失败回调,任意一个请求失败时返回
                $a.find('.description').text('下载失败: ' + 0 + '/' + num);
            });
        })();
    })();

    // 显示画师id和背景图
    (function () {
        if (!(location.href.indexOf('member_illust.php') !== -1 ||
            location.href.indexOf('member.php') !== -1  )) {
            return;
        }
        // 用户名
        var $username = $('a.user-name');

        // 显示画师id
        var $id = $('<span>ID: ' + pixiv.context.userId + '</span>');
        $id.on('click', function () {
            var $this = $(this);
            $this.text('ID已复制到剪贴板');
            GM_setClipboard(pixiv.context.userId);
            setTimeout(function () {
                $this.text('ID: ' + pixiv.context.userId);
            }, 2000);
        });
        $username.after($id);

        // 显示画师背景图
        var url = $('body').css('background-image').replace('url(', '').replace(')', '').replace(/\"/gi, "");
        $username.after('<div style="text-align: center"><img src="' + url + '" width="10%"><a target="_blank" href="' + url + ' ">背景图</a></div>');
    })();

    // 自动加载评论
    (function () {
        if (!(location.href.indexOf('member_illust.php') !== -1)) {
            return;
        }

        // 1秒加载一次评论
        var clickEvent = document.createEvent('MouseEvents');
        clickEvent.initEvent('click', true, true);
        setInterval(function () {
            var more = document.getElementsByClassName('_3aAuVt-')[0];
            if (!!more) {
                more.dispatchEvent(clickEvent);
            }
        }, 1000);
    })();
})(jQuery);