rsshub
Version:
Make RSS Great Again!
114 lines (113 loc) • 3.45 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
//#region lib/routes/pinterest/user.ts
const route = {
path: "/user/:username/:type?",
categories: ["picture"],
example: "/pinterest/user/howieserious",
parameters: {
username: "Username",
type: {
description: "Type, default to `_created`",
default: "_created",
options: [{
value: "_created",
label: "Created"
}, {
value: "_saved",
label: "Saved"
}]
}
},
radar: [{
source: ["www.pinterest.com/:id/:type?", "www.pinterest.com/:id"],
target: "/user/:id/:type?"
}],
name: "User",
maintainers: ["TonyRL"],
handler
};
const baseUrl = "https://www.pinterest.com";
async function handler(ctx) {
const { username, type = "_created" } = ctx.req.param();
const profile = await getUserResource(username);
const response = type === "_created" ? await getUserActivityPinsResource(username, profile.id) : await getBoardsFeedResource(username);
const items = type === "_created" ? response.map((item) => ({
title: item.title || item.seo_title,
description: `${item.grid_description}<br><img src="${item.images.orig.url}">`,
link: `${baseUrl}${item.seo_url}`,
author: item.pinner.full_name,
pubDate: parseDate(item.created_at),
image: item.images.orig.url
})) : response.map((item) => ({
title: item.name,
description: item.description + (item.images?.["170x"] ? "<br>" + item.images["170x"].map((img) => `<img src="${img.url}">`).join("") : ""),
link: `${baseUrl}${item.url}`,
author: item.owner.full_name,
pubDate: parseDate(item.created_at),
image: item.image_cover_hd_url
}));
return {
title: profile.seo_title,
description: profile.seo_description,
image: profile.image_xlarge_url ?? profile.image_medium_url,
link: `${baseUrl}/${username}/`,
item: items
};
}
const getUserResource = (username) => cache_default.tryGet(`pinterest:user:${username}`, async () => {
return (await rofetch(`${baseUrl}/resource/UserResource/get/`, {
headers: { "x-pinterest-pws-handler": "www/[username]/_created.js" },
query: {
source_url: `/${username}/_created`,
data: JSON.stringify({
options: {
username,
field_set_key: "unauth_profile"
},
context: {}
}),
_: Date.now()
}
})).resource_response.data;
});
const getUserActivityPinsResource = async (username, userId) => {
return (await rofetch(`${baseUrl}/resource/UserActivityPinsResource/get/`, {
headers: { "x-pinterest-pws-handler": "www/[username]/_created.js" },
query: {
source_url: `/${username}/_created`,
data: JSON.stringify({
options: {
exclude_add_pin_rep: true,
field_set_key: "grid_item",
is_own_profile_pins: false,
user_id: userId,
username
},
context: {}
}),
_: Date.now()
}
})).resource_response.data;
};
const getBoardsFeedResource = async (username) => {
return (await rofetch(`${baseUrl}/resource/BoardsFeedResource/get/`, {
headers: { "x-pinterest-pws-handler": "www/[username]/_saved.js" },
query: {
source_url: `/${username}/_saved`,
data: JSON.stringify({
options: {
field_set_key: "profile_grid_item",
filter_stories: false,
sort: "last_pinned_to",
username
},
context: {}
}),
_: Date.now()
}
})).resource_response.data.filter((item) => item.node_id);
};
//#endregion
export { route };