rsshub
Version:
Make RSS Great Again!
86 lines (85 loc) • 3 kB
JavaScript
import { t as rofetch } from "./ofetch-W1aeTHCo.mjs";
import { t as parseDate } from "./parse-date-CjhZE69i.mjs";
import { t as md5 } from "./md5-CpIHIxCO.mjs";
//#region lib/routes/meipai/user.ts
const route = {
path: "/user/:uid",
categories: ["social-media"],
example: "/meipai/user/56537299",
parameters: { uid: "用户 id, 可在分享出去获得的用户主页 URL 中找到" },
radar: [{
source: ["www.meipai.com/user/:uid"],
target: "/user/:uid"
}],
name: "用户动态",
maintainers: ["ihewro"],
handler,
url: "www.meipai.com"
};
function sign(urlType, params) {
const hex = [...md5(`${urlType}${Object.entries(params).filter(([key]) => !key.startsWith("sig")).map(([, value]) => value).toSorted().join("")}bdaefd747c7d594f${params.sigTime}Tw5AY783H@EU3#XC`)];
for (let i = 0; i < hex.length; i += 2) [hex[i], hex[i + 1]] = [hex[i + 1], hex[i]];
return hex.join("");
}
async function handler(ctx) {
const { uid } = ctx.req.param();
const limit = ctx.req.query("limit") ? Math.trunc(Number(ctx.req.query("limit"))) : 20;
const urlType = "medias/user_timeline.json";
const now = String(Date.now());
const params = {
build: "16601",
channel: "8888",
client_id: "1089857299",
country_code: "CN",
gnum: String(Math.floor(Math.random() * 9e16) + 0x2386f26fc10000),
language: "zh-Hans",
local_time: now,
locale: "1",
model: "iPhone18,2",
network: "wifi",
os: "27.0",
resolution: "1320*2868",
session_id: Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join("").toUpperCase(),
sigTime: now,
sigVersion: "1.3",
teenager_status: "0",
version: "9.8.000",
uid,
count: String(limit),
page: "1",
/** Placeholder */
sig: ""
};
params.sig = sign(urlType, params);
const response = await rofetch(`https://api.meipai.com/${urlType}`, {
query: params,
headers: {
"User-Agent": "Meipai/9.8.000 (iPhone; iOS 27.0; Scale/3.00)",
"Ab-Version": "5.2.0",
"Accept-Language": "zh-Hans-CN;q=1"
}
});
const item = response.map((media) => {
const caption = (media.caption ?? "").replaceAll(/#([^#]+)#/g, "").trim();
return {
title: caption || media.cover_title || media.recommend_caption,
description: `${caption}<br>${media.video ? `<video controls preload="metadata" poster="${media.cover_pic}"><source src="${media.video.replace("http:", "https:")}" type="video/mp4"></video>` : `<img src="${media.cover_pic}">`}`,
link: `https://www.meipai.com/media/${media.id}`,
pubDate: parseDate(media.created_at, "X"),
author: media.user.screen_name,
category: (media.caption ?? "").matchAll(/#([^#]+)#/g).toArray().map((match) => match[1]),
enclosure_url: media.video?.replace("http:", "https:"),
enclosure_type: "video/mp4"
};
});
const user = response[0]?.user;
return {
title: `${user?.screen_name ?? uid}的美拍`,
link: `https://www.meipai.com/user/${uid}`,
description: user?.weibo_share_caption,
image: user?.avatar,
item
};
}
//#endregion
export { route };