Greasy Fork

Greasy Fork is available in English.

A岛只看po

向网页端添加只看PO功能,需要跨域权限访问三酱api

当前为 2020-05-04 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         A岛只看po
// @namespace   adidfilter
// @version      0.3.2
// @description  向网页端添加只看PO功能,需要跨域权限访问三酱api
// @match        https://adnmb2.com/t/*
// @grant GM_xmlhttpRequest
// @run-at document-end
// ==/UserScript==

(function () {
    var threadsIinfo = document.getElementsByClassName('h-threads-info')[0];
    var POid = threadsIinfo.getElementsByClassName('h-threads-info-uid')[0];
    var ubutton = threadsIinfo.getElementsByClassName('h-threads-info-report-btn')[0].cloneNode(true);
    var uhref = ubutton.childNodes[1];
    uhref.setAttribute('href', 'javascript:;');
    uhref.innerHTML = '只看PO';
    threadsIinfo.insertBefore(ubutton, threadsIinfo.getElementsByClassName('h-threads-info-report-btn')[0]);
    uhref.onclick = function () {
        ubutton.style.display = 'none';
        var uid = []; //需要过滤的id
        var total = 0; //当前展示的过滤后页面数量
        var endflag; //请求的最大数量
        var runCount = 0; //用来区分首次运行
        var locker = 0; //防止同时请求
        var reply = []; //存放得到的页面数据
        var replyPtr; //用来防止重复过滤
        var filtered = []; //存放过滤后的回复
        var gtot = 0; //当前已获得的页面计数

        //页面信息
        var url = document.URL.split('/')[4];
        var thread = url.substring(0, url.indexOf('?'));
        thread = thread ? thread : url;
        var page = url.substring(url.indexOf('=') + 1); //论坛的page从1开始计算,脚本内处理成0开始计算
        page = url.indexOf('r=') != -1 ? 1 : parseInt(page);
        gtot = page = page != thread && page != 1 ? (page - 1) : 0;
        var pageCount; //总页面数量
        var pageCur; //已经向服务器请求过的页面数量
        var p = document.getElementsByClassName('h-threads-item-reply');
        p[0].setAttribute('id', 'top');
        var defaultUid = POid.innerText.substring(3);
        //ui
        var imgbox = document.createElement('div');
        imgbox.setAttribute('class', 'h-threads-img-box');
        imgbox.innerHTML = `<div class="h-threads-img-tool uk-animation-slide-top">
    <span class="h-threads-img-tool-btn h-threads-img-tool-small uk-button-link"><i class="uk-icon-minus"></i>收起</span>
    <a href="" target="_blank" class="h-threads-img-tool-btn uk-button-link"><i class="uk-icon-search-plus"></i>查看大图</a>
    <span class="h-threads-img-tool-btn h-threads-img-tool-left uk-button-link"><i class="uk-icon-reply"></i>向左旋转</span>
    <span class="h-threads-img-tool-btn h-threads-img-tool-right uk-button-link"><i class="uk-icon-share"></i>向右旋转</span>
    </div>
    <a href="" rel="_blank" target="_blank" class="h-threads-img-a" style="height: 0px;"><img data-src="" src="" align="left" border="0" hspace="20" class="h-threads-img" style="top: 0px; left: 0px;"></a>`;
        var ctrlpanel = document.createElement('div');
        ctrlpanel.style = 'margin: 5px';
        var selector = document.createElement('select');
        selector.style = 'width: 4rem; height: 2rem; border: 1px solid rgba(0,0,0,.06);';
        selector.id = 'id-filter-select';
        selector.onchange = function () {
            render(this.options.selectedIndex);
        };
        var navigationBef = document.createElement('p');
        navigationBef.style.display = 'inline-block';
        navigationBef.innerHTML = '第';
        var navigationAft = document.createElement('p');
        navigationAft.style.display = 'inline-block';
        var buttonStyle = 'margin-left: 5px; color: #07d; background: #fff; height: 2rem; border: 1px solid rgba(0,0,0,.06);';
        var loadMore = document.createElement('button');
        loadMore.style = buttonStyle;
        loadMore.innerText = '加载更多';
        loadMore.onclick = function () {
            if (pageCur == pageCount) {
                alert('已经加载最后一页');
                return;
            }
            if (locker + 1 == runCount) {
                locker++;
                loadNewPage(30);
            } else
                alert('加载中,请稍等');
        };
        var lastPage = document.createElement('button');
        lastPage.style = buttonStyle;
        lastPage.innerText = '上一页';
        lastPage.onclick = function () {
            let c = selector.options.selectedIndex;
            if (c > 0) {
                selector.options.selectedIndex = c - 1;
                render(c - 1);
                $('html, body').animate({
                    scrollTop: $('#top').offset().top
                }, 600);
            }
        };
        var nextPage = document.createElement('button');
        nextPage.style = buttonStyle;
        nextPage.innerText = '下一页';
        nextPage.onclick = function () {
            let c = selector.options.selectedIndex;
            if (c != total - 1) {
                selector.options.selectedIndex = c + 1;
                render(c + 1);
                $('html, body').animate({
                    scrollTop: $('#top').offset().top
                }, 600);
            }
        };
        ctrlpanel.appendChild(navigationBef);
        ctrlpanel.appendChild(selector);
        ctrlpanel.appendChild(navigationAft);
        ctrlpanel.appendChild(loadMore);
        ctrlpanel.appendChild(lastPage);
        ctrlpanel.appendChild(nextPage);
        var msgDiv = document.createElement('div');
        msgDiv.className = 'h-threads-content';
        msgDiv.style.backgroundColor = '#f0e0d6';
        msgDiv.style.padding = '10px';
        msgDiv.style.margin = '10px';
        var info = document.createElement('p');
        info.innerHTML = '正在加载更多页面';
        var warning = document.createElement('p');
        if (page != 0) {
            warning.innerHTML = '当前是第' + (page + 1) + '页,脚本不会加载前' + page + '页的内容<br/>要查看之前的回复,请回到串的第1页再打开只看Po功能';
        }
        var progress = document.createElement('div');
        progress.setAttribute('value', 0);
        progress.setAttribute('max', 30);
        progress.style = 'list-style: none;font-size: 12px;line-height: 2em;background: #e9e5e2;background-image: -webkit-gradient(linear,left top,left bottom,from(#e1ddd9), to(#e9e5e2));height: 20px;border-radius: 10px;box-shadow: 0 1px 0 #bebbb9 inset, 0 1px 0 #fcfcfc;';
        var innerBar = document.createElement('div');
        innerBar.style = 'height: 18px;margin: 1px 2px;position: relative;border-radius: 9px;-webkit-box-shadow:0 1px 0 #fcfcfc inset, 0 1px 0 #bebbb9;box-shadow:0 1px 0 #fcfcfc inset, 0 1px 0 #bebbb9;background-color: #009e0c;     width: 0%;';
        progress.appendChild(innerBar);
        progress.setProgress = function (v) {
            let max = this.getAttribute('max');
            innerBar.style.width = (v / max) * 100 + '%';
        }
        msgDiv.appendChild(info);
        msgDiv.appendChild(warning);
        msgDiv.appendChild(progress);
        document.getElementsByClassName('uk-container')[0].insertBefore(msgDiv, document.getElementsByClassName('h-threads-list')[0]);
        //清除原内容
        let i = 0;
        try {
            for (; i < p.length; i++) {
                let img = p[i].getElementsByClassName('h-threads-img-box')[0];
                if (img)
                    img.innerHTML = '';
                let po = p[i].getElementsByClassName('uk-text-primary uk-text-small')[0];
                if (po)
                    p[i].getElementsByClassName('h-threads-info')[0].removeChild(po);
                let cont = p[i].getElementsByClassName('h-threads-content')[0];
                if (cont)
                    cont.innerHTML = '';
            }
        } catch (error) {
            alert('重写网页出现问题,刷新重试');
            window.history.go(0);
        }
        for (; i < 20; i++) {
            p[p.length - 1].after(p[0].cloneNode(true));
        }
        var pagination = document.getElementsByClassName('uk-pagination uk-pagination-left h-pagination')[0];
        pagination.parentNode.removeChild(pagination);
        //首次请求
        GM_xmlhttpRequest({
            method: 'get',
            headers: {
                cookie: document.cookie
            },
            url: 'https://nmb.fastmirror.org/api/thread?id=' + thread + '&page=' + (page + 1),
            onload: function (res) {
                let con = JSON.parse(res.response);
                reply[page] = con;
                pageCount = Math.ceil(con.replyCount / 19);
                progress.setAttribute('max', pageCount > 30 ? 30 : pageCount);
                pageCur = page + 1;
                if (pageCount > 1)
                    loadNewPage(30);
                else
                    finished();
            }
        });
        //shift:向后读取的页面数量
        function loadNewPage(shift) {
            let i;
            endflag = Math.min(pageCount, pageCur + shift);
            for (i = pageCur; i < endflag; i++)
                fetch(i, i - pageCur);
            pageCur = i;
        }
        //网络请求
        function fetch(i, t) {
            setTimeout(function () {
                GM_xmlhttpRequest({
                    method: 'get',
                    headers: {
                        cookie: document.cookie
                    },
                    url: 'https://nmb.fastmirror.org/api/thread?id=' + thread + '&page=' + (i + 1),
                    onload: function (res) {
                        let con = JSON.parse(res.response);
                        reply[i] = con;
                        gtot++;
                        if (gtot == endflag - 1) finished();
                        if (!runCount)
                            progress.setProgress(i + 1 - page);
                        else
                            loadMore.innerText = '加载更多 (' + (i + 1) + '/' + pageCount + ')';
                    }
                });
            }, 70 * t);
        }

        function finished() {
            if (!runCount)
                dialog();
            else {
                loadMore.innerText = '加载更多 (' + endflag + '/' + pageCount + ')';
                p = document.getElementsByClassName('h-threads-item-reply');
                //过滤部分
                for (let i = replyPtr + 1; i < reply.length; i++) {
                    for (let j = 0; j < reply[i].replys.length; j++)
                        for (let k = 0; k < uid.length; k++)
                            if (reply[i].replys[j].userid == uid[k]) {
                                filtered.push(reply[i].replys[j]);
                                break;
                            }
                }
                replyPtr = i;
                for (i = total; i < Math.ceil(filtered.length / 20); i++) {
                    let u = document.createElement('option');
                    u.innerText = i + 1;
                    selector.appendChild(u);
                }
                selector.options.selectedIndex = total;
                render(total);
                $('html, body').animate({
                    scrollTop: $('#top').offset().top
                }, 600);
                total = i;
                navigationAft.innerHTML = '共' + total + '页';
            }
            runCount++;
        }

        function dialog() {
            let uidd = prompt("要显示的饼干(用分号分隔多个)", defaultUid);
            if (!uidd) window.history.go(0);
            uid = uidd.split(';');
            p = document.getElementsByClassName('h-threads-item-reply');
            msgDiv.parentNode.removeChild(msgDiv);
            for (let i in reply)
                for (let j = 0; j < reply[i].replys.length; j++)
                    for (let k = 0; k < uid.length; k++)
                        if (reply[i].replys[j].userid == uid[k]) {
                            filtered.push(reply[i].replys[j]);
                            break;
                        }
            replyPtr = parseInt(i);
            render(0);
            for (i = 0; i < Math.ceil(filtered.length / 20); i++) {
                let u = document.createElement('option');
                u.innerText = i + 1;
                selector.appendChild(u);
            }
            total = i;
            navigationAft.innerHTML = '页(共' + total + '页)';
            document.getElementsByClassName('uk-container')[0].insertBefore(ctrlpanel, document.getElementsByClassName('uk-pagination.uk-pagination-left.h-pagination')[0]);
        }
        //展示过滤后内容
        function render(index) {
            index = index * 20;
            for (let i = 0; i < 20; i++) {
                let cont = p[i].getElementsByClassName('h-threads-content')[0];
                let info = p[i].getElementsByClassName('h-threads-info')[0];
                let length = filtered.length;
                let imgb = p[i].children[1].getElementsByClassName('h-threads-img-box')[0];
                if (imgb) {
                    p[i].children[1].removeChild(imgb);
                }
                if (i + index < length) {
                    let f = filtered[i + index];
                    info.children[0].innerText = f.title;
                    info.children[1].innerText = f.name;
                    info.children[2].innerText = f.now;
                    info.children[3].innerText = 'ID:' + f.userid;
                    info.children[4].children[0].setAttribute('href', '/f/值班室?r=' + f.id);
                    info.children[5].setAttribute('href', '/t/' + thread + '?r=' + f.id);
                    info.children[5].innerText = 'No.' + f.id;
                    cont.innerHTML = f.content;
                    if (f.img) {
                        let imgb = imgbox.cloneNode(true);
                        imgb.children[0].children[1].setAttribute('href', 'https://nmbimg.fastmirror.org/image/' + f.img + f.ext);
                        imgb.children[1].setAttribute('href', 'https://nmbimg.fastmirror.org/image/' + f.img + f.ext);
                        imgb.children[1].children[0].setAttribute('data-src', 'https://nmbimg.fastmirror.org/thumb/' + f.img + f.ext);
                        imgb.children[1].children[0].setAttribute('src', 'https://nmbimg.fastmirror.org/thumb/' + f.img + f.ext);
                        p[i].children[1].insertBefore(imgb, info);
                    }
                } else {
                    let f = {
                        content: '',
                        id: '',
                        img: '',
                        name: '无内容-点击底部按钮加载更多',
                        now: '',
                        title: '无标题',
                        userid: ''
                    };
                    filtered.push(f);
                    cont.innerHTML = f.content;
                    info.children[0].innerText = f.title;
                    info.children[1].innerText = f.name;
                    info.children[2].innerText = f.now;
                    info.children[3].innerText = f.userid;
                    info.children[5].innerText = 'No.' + f.id;
                }
            }
            //三酱的api
            initImageBox();
            initContent();
        }
    }
})();

//感谢阅读 欢迎改进( ´∀`)