nlegs.com 聚圖&下載

如題,由於此站人機驗證出現頻繁,一部寫真需要分1~3次才能全部載入大圖。

La data de 02-04-2023. Vezi ultima versiune.

// ==UserScript==
// @name         nlegs.com 聚圖&下載
// @version      1.0
// @description  如題,由於此站人機驗證出現頻繁,一部寫真需要分1~3次才能全部載入大圖。
// @author       tony0809
// @match        https://www.nlegs.com/girls/*.html
// @icon         https://www.google.com/s2/favicons?sz=64&domain=nlegs.com
// @grant        none
// @license      MIT
// @namespace    https://greasyfork.org/users/20361
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js
// ==/UserScript==

/*
腳本"图聚合展示by xhua",https://greasyfork.org/scripts/442098
對於此站也不能取得全部大圖,遇到人機驗證一樣撞牆,所以才寫了一個堪用的取得大圖腳本。
此站大圖質量真的不錯,可惜人機驗證神煩!!!

獲取大圖操作
1.自動取得所有預覽圖
2.手動點擊載入全部大圖按鈕來獲取大圖
3.等待替換元素
4.遇到人機驗證會跳出警告結束取得迴圈
5.手動在新分頁新分頁新分頁隨便開啟一個預覽圖鏈接
6.完成人機驗證
7.回來繼續按載入大圖按鈕取得大圖

東方永頁機用戶請添加黑名單網址避免衝突
*://www.nlegs.com/girls/*.html

WIN10把默認圖片保存格式變成「jfif」了,怎麼變回「JPG」格式?
首先按鍵盤的「Win鍵+R鍵」,彈出「運行」對話框,輸入「regedit」,然後點Enter進入註冊表編輯器。
然後把路徑貼到地址欄裡Enter:
HKEY_CLASSES_ROOT\MIME\Database\Content Type\image/jpeg
再然後,右面的列表框中有個「Extension」選項,雙擊這一行點開,在「編輯字符串」對話框中,把「jfif」改爲「jpg」,最後點確定就可以了。
*/

(() => {
    'use strict';
    const ge = (selector, doc) => (doc || document).querySelector(selector);
    const gae = (selector, doc) => (doc || document).querySelectorAll(selector);
    const gx = (xpath, doc) => (doc || document).evaluate(xpath, (doc || document), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    const gax = (xpath, doc) => {
        let nodes = [];
        let results = (doc || document).evaluate(xpath, (doc || document), null, XPathResult.ANY_TYPE, null);
        let node;
        while (node = results.iterateNext()) {
            nodes.push(node);
        }
        return nodes;
    };

    let loopFind = setInterval(() => {
        let set = ge('.pagination>li:last-child>a');
        if (set) {
            clearInterval(loopFind);
            if (set.innerText == 1) {
                addButton();
            } else {
                let pages = gae('.pagination>li>a');
                const getAllThumb = async () => {
                    for (let i = 1; i < pages.length; i++) {
                        let res = await fetch(pages[i].href);
                        let resText = await res.text();
                        let doc = await new DOMParser().parseFromString(resText, 'text/html');
                        let xpath = "//div[a/div[contains(@style,'thumb') and span]]";
                        let thumbs = gax(xpath, doc);
                        console.log(`第${parseInt(i)+1}頁\n`, thumbs);
                        let fragment = new DocumentFragment();
                        for (let i in thumbs) {
                            fragment.appendChild(thumbs[i]);
                        }
                        gx(xpath).parentNode.appendChild(fragment);
                        let e = '.pagination';
                        ge(e).outerHTML = ge(e, doc).outerHTML;
                    }
                    addButton();
                };
                getAllThumb();
            }
        }
    }, 100);

    const getAllOriginal = async () => {
        let links = gae('a[href*=image]');
        if (!links[0]) {
            alert('預覽圖連一張都沒有了!');
            return;
        }
        for (let i = 0; i < links.length; i++) {
            let res = await fetch(links[i].href);
            let resText = await res.text();
            let doc = await new DOMParser().parseFromString(resText, 'text/html');
            let img = ge('.img-res', doc);
            if (!img) {
                alert('獲取大圖中斷,遇到了人機驗證,先隨便選一張未獲得大圖的預覽圖鏈接在新分頁新分頁新分頁打開,解決人機驗證後再回來按載入大圖按鈕繼續獲取大圖');
                return;
            } else {
                let res = await fetch(img.src);
                let resBlob = await res.blob();
                let objectURL = await URL.createObjectURL(resBlob);
                console.log(objectURL);
                links[i].parentNode.outerHTML = `<img src='${objectURL}'>`;
            }
        }
    };

    const imgZipDownload = async () => {
        let imgs = gae('img[src^=blob]');
        if (!imgs[0]) {
            alert('大圖一張也沒有!');
            return;
        }
        let title = ge('strong').innerText.trim();
        const zip = new JSZip();
        const folder = zip.folder(title);
        for (let i = 0; i < imgs.length; i++) {
            let n = parseInt(i) + 1;
            let pn = n;
            if (i < 9) {
                pn = '00' + n;
            } else if (i < 99) {
                pn = '0' + n;
            }
            let file_name = `${pn}P.jpg`;
            await fetch(imgs[i].src).then(res => res.blob()).then(data => {
                folder.file(file_name, data, {
                    binary: true
                });
                console.log(`第${n}張,檔案名:${file_name},大小:${parseInt(data.size / 1024)} Kb,下載完成!等待壓縮...`);
            });
        }
        zip.generateAsync({
            type: "blob"
        }).then(content => {
            saveAs(content, `${title} [${imgs.length}P].zip`);
        });
    };

    const imgDownload = () => {
        let imgs = gae('img[src^=blob]');
        if (!imgs[0]) {
            alert('大圖一張也沒有!');
            return;
        }
        let title = ge('strong').innerText.trim();
        for (let i = 0; i < imgs.length; i++) {
            let n = parseInt(i) + 1;
            let pn = n;
            if (i < 9) {
                pn = '00' + n;
            } else if (i < 99) {
                pn = '0' + n;
            }
            let yes = confirm(`下載第 ${n}/${imgs.length} 張`);
            if (yes) {
                let a = document.createElement('a');
                a.download = `${title}_${pn}P.jpg`;
                a.href = imgs[i].src;
                document.body.appendChild(a);
                a.click();
                a.remove();
            }
        }
    };

    const addButton = () => {
        let ele = ge('span.title').parentNode;
        let div = document.createElement('div');
        div.innerText = '點擊載入全部大圖';
        div.className = 'btn btn-primary getBigImg';
        div.addEventListener("click", () => {
            getAllOriginal();
        });
        ele.appendChild(div);
        let div2 = document.createElement('div');
        div2.innerText = '鏈接逐張下載大圖';
        div2.className = 'btn btn-primary imgDownload';
        div2.addEventListener("click", () => {
            imgDownload();
        });
        ele.appendChild(div2);
        let div3 = document.createElement('div');
        div3.innerText = '壓縮打包下載圖片';
        div3.className = 'btn btn-primary imgDownload';
        div3.addEventListener("click", () => {
            imgZipDownload();
        });
        ele.appendChild(div3);
    };

    const addGlobalStyle = css => {
        let style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        document.head.appendChild(style);
    };
    const css = `
img[src^=blob] {
    width: auto;
    height: auto;
    max-width: 100%;
    display: block;
    margin: 0 auto;
}
.imgDownload {
    font-size: 16px;
    font-family: Arial,sans-serif!important;
    line-height: 24px;
    width: 150px;
    padding: 4px;
    margin-right: 5px;
    margin-bottom: 10px;
}
.getBigImg {
    font-size: 16px;
    font-family: Arial,sans-serif!important;
    line-height: 24px;
    width: 150px;
    position: fixed;
    z-index:999;
    bottom: 10px;
    left: 50%;
    margin-left: -75px;
    padding: 4px;
}
    `;
    addGlobalStyle(css);

})();