import { readFileSync, appendFileSync } from "fs"; import credentials from "./credentials.json" assert { type: 'json' }; export async function getNewPixivPosts(tag = "初音ミク") { try { var known_ids = readFileSync(`known_ids/${tag}.txt`, "utf8").trim().split("\n"); //todo tail n lines } catch (error) { var known_ids = []; } var newPosts = []; var encodedTag = encodeURIComponent(tag); iteratePages: for (var page = 1; page < 500; page++) { let url = `https://www.pixiv.net/ajax/search/artworks/${encodedTag}?word=${encodedTag}&order=date_d&mode=all&p=${page}&csw=0&s_mode=s_tag&type=all&lang=en&version=59e08d0871b7c68569ebe89084d52eca68a1685d`; console.log("fetch", url); let data = await fetch(url, { headers: { "Cookie": credentials.pixiv_cookie } }).then(res => res.json()); if (data.error) { throw new Error(JSON.stringify(data)); } for (let post of data.body.illustManga.data) { if (known_ids.includes(post.id) || new Date(post.createDate) < new Date("2024-01-01T00:00:00+09:00")) { break iteratePages; } newPosts.push(post); if (post.xRestrict) console.log("r18"); } await sleep(1); } return newPosts.reverse(); /*return { [Symbol.iterator]() { return this; }, next() { var value = newPosts.pop(); if (value) { appendFileSync(`known_ids/${tag}.txt`, "\n" + value.id); } return {value, done: !Boolean(value)} } }*/ } async function sleep(seconds) { await new Promise(resolve => setTimeout(resolve, seconds * 1000)); } export async function getPostDataById(id) { var url = `https://www.pixiv.net/en/artworks/${id}`; console.log("fetch", url); var html = await fetch(url, { headers: { "Cookie": credentials.pixiv_cookie } }).then(res => res.text()); var illust = Object.values(JSON.parse(html.match(//)[1]).illust)[0]; var images = []; for (let i = 0; i < illust.pageCount; i++) { let url = illust.urls.original.replace('p0', 'p'+i); console.log("fetch", url); let data = await fetch(url, { headers: {"Referer": "https://www.pixiv.net/"} }).then(res => res.blob()); images.push({url, name: url.split('/').pop(), data}); }; return {illust, images}; }