nlegs.com 聚圖&下載

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

2023-04-02 या दिनांकाला. सर्वात नवीन आवृत्ती पाहा.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

// ==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);

})();