pleroma_pixiv_hatsunemiku_a.../pixiv.js

78 lines
2.3 KiB
JavaScript

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(/<meta name="preload-data" id="meta-preload-data" content='(.*)'>/)[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};
}