99 lines
3.0 KiB
JavaScript
Executable File
99 lines
3.0 KiB
JavaScript
Executable File
import { ACCESS_TOKEN, PIXIV_COOKIE } from "./private.mjs";
|
|
const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36";
|
|
|
|
async function fetch(url, options) {
|
|
console.log("fetch", url);
|
|
var res = await globalThis.fetch(url, options);
|
|
if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
return res;
|
|
}
|
|
|
|
var page = 1 + Math.floor(Math.random() * 1000);
|
|
console.log("page", page);
|
|
|
|
var res = await fetch(`https://www.pixiv.net/ajax/search/artworks/%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF?word=%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF&order=date_d&mode=safe&p=${page}&csw=0&s_mode=s_tag&type=all&lang=en&version=59e08d0871b7c68569ebe89084d52eca68a1685d`, {
|
|
headers: {
|
|
Cookie: PIXIV_COOKIE,
|
|
"User-Agent": USER_AGENT
|
|
}
|
|
});
|
|
|
|
var data = await res.json();
|
|
if (data.error) throw data;
|
|
|
|
var illusts = data.body.illustManga.data;
|
|
var randomIllust = illusts[Math.floor(Math.random() * illusts.length)];
|
|
|
|
var res = await fetch(`https://www.pixiv.net/ajax/illust/${randomIllust.id}?lang=en`, {
|
|
headers: {
|
|
Cookie: PIXIV_COOKIE,
|
|
"User-Agent": USER_AGENT
|
|
}
|
|
});
|
|
var data = await res.json();
|
|
if (data.error) {
|
|
throw new Error(JSON.stringify(data));
|
|
}
|
|
var illustData = data.body;
|
|
|
|
|
|
|
|
var images = [];
|
|
for (let i = 0; i < Math.min(4, illustData.pageCount); i++) {
|
|
let url = illustData.urls.original.replace('p0', 'p'+i);
|
|
let file = await fetch(url, {
|
|
headers: {"Referer": "https://www.pixiv.net/"}
|
|
}).then(res => res.blob());
|
|
images.push({
|
|
url,
|
|
name: url.split('/').pop(),
|
|
file
|
|
});
|
|
}
|
|
|
|
var illustDate = new Date(illustData.createDate).toLocaleString("en-US", {timeZone: "JST", month: "long", day: "numeric", year: "numeric"});
|
|
var status = `${illustData.title} / ${illustData.userName} / ${illustDate}
|
|
${illustData.aiType == 2 ? "#AIgenerated " : ''}${randomIllust.tags.map(tag => `#${tag}`).join(" ")}
|
|
https://www.pixiv.net/en/artworks/${illustData.id}`;
|
|
|
|
if (illustData.pageCount > 4) status += `\nClick link to see ${illustData.pageCount - 4} additional images`;
|
|
|
|
|
|
var media_ids = await Promise.all(images.map(image => uploadFile(image.file, image.name, image.url).then(j => j.id)));
|
|
|
|
|
|
|
|
|
|
async function uploadFile(file, filename, description) {
|
|
var form = new FormData();
|
|
form.append("file", file, filename);
|
|
if (description) form.append("description", description);
|
|
return await fetch("https://mastodon.social/api/v2/media", {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `Bearer ${ACCESS_TOKEN}`
|
|
},
|
|
body: form
|
|
}).then(res => res.json());
|
|
}
|
|
|
|
|
|
|
|
|
|
var form = new FormData();
|
|
form.append("status", status);
|
|
for (let media_id of media_ids) {
|
|
form.append("media_ids[]", media_id);
|
|
}
|
|
if (process.env.TEST) form.append("visibility", "direct");
|
|
var response = await fetch("https://mastodon.social/api/v1/statuses", {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `Bearer ${ACCESS_TOKEN}`
|
|
},
|
|
body: form
|
|
});
|
|
|
|
console.log(response.status, await response.json());
|
|
|