// node pixiv-downloader.js -p [numpages] -s [startpage] [-r] var argv = require("minimist")(process.argv.slice(2), { default: { "p": 1, "s": 1 } }); var query = argv._.join(" "); var puppeteer = require("puppeteer"); var download = require("download"); var fs = require("fs"); (async function(){ var browser = await puppeteer.launch({ headless: false, userDataDir: process.cwd() + "/chromium_data" }); var page = await browser.newPage(); await page.setContent(`login to pixiv if necessary, then close this page to continue.`); await new Promise(r => page.on("close", r)); var page = await browser.newPage(); for (let i = argv.s; i < argv.s + argv.p; i++) { let url = `https://www.pixiv.net/ajax/search/artworks/${encodeURIComponent(query)}?order=popular_d&mode=${argv.r ? "all" : "safe"}&p=${i}`; console.log("get page", i, url); await page.goto(url); let data = JSON.parse(await page.evaluate(() => document.querySelector("body").innerText)); if (data.error) throw data.message; for (let item of data.body.illustManga.data) { let url = `https://www.pixiv.net/ajax/illust/${item.id}/pages`; console.log("get", url); await page.goto(url); let data = JSON.parse(await page.evaluate(() => document.querySelector("body").innerText)); if (data.error) { console.error(error.message); } else { for (let image of data.body) { let url = image.urls.original; console.log("download", url); if (!fs.existsSync("download")) fs.mkdirSync("download"); let filename = url.split('/').pop(); let filedir = "download/" + query + "/"; if (!fs.existsSync(filedir)) fs.mkdirSync(filedir); let filepath = filedir + filename; if (fs.existsSync(filepath)) { console.log(filename, "already exists"); continue; } let write = fs.createWriteStream(filepath); download(url, { headers: { "Referer": "https://www.pixiv.net" } }).pipe(write); await new Promise(r => write.on("close", r)); console.log("saved", filename) } } } } console.log("complete"); await browser.close(); })();