141 lines
4.4 KiB
JavaScript
141 lines
4.4 KiB
JavaScript
import credentials from "./credentials.json" with { type: "json" };
|
|
var {client_id, client_secret, username, password, pixiv_cookie} = credentials;
|
|
|
|
var access_token;
|
|
|
|
await (async function login() {
|
|
var form = new FormData();
|
|
form.append("client_id", client_id);
|
|
form.append("client_secret", client_secret);
|
|
form.append("grant_type", "password");
|
|
form.append("username", username);
|
|
form.append("password", password);
|
|
var data = await fetch("https://pleroma.lamp.wtf/oauth/token", {
|
|
method: "POST",
|
|
body: form
|
|
}).then(res => res.json());
|
|
console.log ("logged in", data);
|
|
access_token = data.access_token;
|
|
})();
|
|
|
|
async function uploadFile({data, name}) {
|
|
var form = new FormData();
|
|
form.append("file", data, name);
|
|
var res = await fetch("https://pleroma.lamp.wtf/api/v1/media", {
|
|
method: "POST",
|
|
body: form,
|
|
headers: {"Authorization": `Bearer ${access_token}`}
|
|
});
|
|
var json = await res.json();
|
|
console.log("uploaded file", res.status, json.url);
|
|
return json;
|
|
}
|
|
|
|
async function postStatus({status, visibility = "unlisted", content_type = "text/plain", media_ids = [], sensitive, files}) {
|
|
if (files) {
|
|
media_ids = (await Promise.all(files.map(file => uploadFile(file)))).map(d => d.id);
|
|
}
|
|
var form = new FormData();
|
|
form.append("status", status);
|
|
form.append("visibility", visibility);
|
|
form.append("source", "bot");
|
|
form.append("content_type", content_type);
|
|
for (let media_id of media_ids) {
|
|
form.append("media_ids[]", media_id);
|
|
}
|
|
if (sensitive) form.append("sensitive", "true");
|
|
var res = await fetch("https://pleroma.lamp.wtf/api/v1/statuses", {
|
|
method: "POST",
|
|
body: form,
|
|
headers: {"Authorization": `Bearer ${access_token}`}
|
|
});
|
|
var json = await res.json();
|
|
console.log("posted", res.status, json.uri || json);
|
|
return json;
|
|
}
|
|
|
|
async function downloadPixivIllust(illust_id) {
|
|
var url = `https://www.pixiv.net/en/artworks/${illust_id}`;
|
|
console.log("fetch", url);
|
|
var html = await fetch(url, {headers: {"Cookie": 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};
|
|
}
|
|
|
|
export async function pixivToPleroma(illust_id) {
|
|
try {
|
|
var {illust, images} = await downloadPixivIllust(illust_id);
|
|
await postStatus({
|
|
status: `https://www.pixiv.net/en/artworks/${illust_id}`
|
|
+ ((images.length > 4) ? '\n⚠ >4 img' : '')
|
|
+ ((illust.illustType == 2) ? '\n⚠ ugoira conversion not implemented' : ''),
|
|
files: images,
|
|
visibility: "unlisted",
|
|
sensitive: Boolean(illust.xRestrict)
|
|
});
|
|
} catch (error) {
|
|
console.error(error.stack);
|
|
postStatus({
|
|
status: `https://www.pixiv.net/en/artworks/${illust_id}` +
|
|
`\n#error:\n${error.stack}`
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
if (import.meta.main) Deno.serve({
|
|
port: 18024,
|
|
hostname: "127.0.0.1"
|
|
}, async (req, info) => {
|
|
var {pathname} = new URL(req.url);
|
|
console.log(info.remoteAddr.hostname, req.headers.get('x-forwarded-for'), pathname);
|
|
|
|
try {
|
|
switch (pathname) {
|
|
case "/ajax/illusts/bookmarks/add":
|
|
var payload = await req.clone().json();
|
|
console.log(payload);
|
|
var {comment, illust_id, restrict, tags} = payload;
|
|
pixivToPleroma(illust_id);
|
|
break;
|
|
case "/ajax/illusts/bookmarks/delete":
|
|
var payload = await req.clone().formData();
|
|
console.log(payload);
|
|
// todo
|
|
break;
|
|
case "/touch/ajax_api/ajax_api.php":
|
|
var payload = await req.clone().formData();
|
|
console.log(payload);
|
|
var mode = payload.get("mode");
|
|
if (mode == "add_bookmark_illust") {
|
|
var restrict = payload.get("restrict");
|
|
var tag = payload.get("tag");
|
|
var id = payload.get("id");
|
|
var comment = payload.get("comment");
|
|
pixivToPleroma(id);
|
|
} else if (mode == "delete_bookmark_illust") {
|
|
var id = payload.get("id");
|
|
// todo
|
|
}
|
|
break;
|
|
}
|
|
} catch (error) {
|
|
console.error("payload error:", error.stack);
|
|
}
|
|
|
|
return fetch("https://www.pixiv.net"+pathname, {
|
|
method: req.method,
|
|
headers: req.headers,
|
|
body: req.body,
|
|
redirect: "manual"
|
|
});
|
|
});
|