Merge branch 'master' into master

This commit is contained in:
longqian
2025-02-07 23:22:16 +08:00
committed by GitHub
3 changed files with 148 additions and 0 deletions

25
src/router.types.d.ts vendored
View File

@@ -385,4 +385,29 @@ export type RouterType = {
desc: string;
timestamp: string;
};
hackernews: {
id: string;
title: string;
hot: number | undefined;
timestamp: number | undefined;
url: string;
mobileUrl: string;
};
github: {
id: string;
title: string;
desc?: string;
hot: number | undefined;
timestamp: number | undefined;
url: string;
mobileUrl: string;
};
producthunt: {
id: string;
title: string;
hot: number | undefined;
timestamp: number | undefined;
url: string;
mobileUrl: string;
};
};

63
src/routes/hackernews.ts Normal file
View File

@@ -0,0 +1,63 @@
import type { RouterData } from "../types.js";
import { get } from "../utils/getData.js";
import { load } from "cheerio";
import type { RouterType } from "../router.types.js";
export const handleRoute = async (_: undefined, noCache: boolean) => {
const listData = await getList(noCache);
const routeData: RouterData = {
name: "hackernews",
title: "Hacker News",
type: "Popular",
description: "News about hacking and startups",
link: "https://news.ycombinator.com/",
total: listData.data?.length || 0,
...listData,
};
return routeData;
};
const getList = async (noCache: boolean) => {
const baseUrl = "https://news.ycombinator.com";
const result = await get({
url: baseUrl,
noCache,
headers: {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
});
try {
const $ = load(result.data);
const stories: RouterType["hackernews"][] = [];
$(".athing").each((_, el) => {
const item = $(el);
const id = item.attr("id") || "";
const title = item.find(".titleline a").first().text().trim();
const url = item.find(".titleline a").first().attr("href");
// 获取分数并转换为数字
const scoreText = $(`#score_${id}`).text().match(/\d+/)?.[0];
const hot = scoreText ? parseInt(scoreText, 10) : undefined;
if (id && title) {
stories.push({
id,
title,
hot,
timestamp: undefined,
url: url || `${baseUrl}/item?id=${id}`,
mobileUrl: url || `${baseUrl}/item?id=${id}`,
});
}
});
return {
...result,
data: stories,
};
} catch (error) {
throw new Error(`Failed to parse HackerNews HTML: ${error}`);
}
};

60
src/routes/producthunt.ts Normal file
View File

@@ -0,0 +1,60 @@
import type { RouterData } from "../types.js";
import { get } from "../utils/getData.js";
import { load } from "cheerio";
import type { RouterType } from "../router.types.js";
export const handleRoute = async (_: undefined, noCache: boolean) => {
const listData = await getList(noCache);
const routeData: RouterData = {
name: "producthunt",
title: "Product Hunt",
type: "Today",
description: "The best new products, every day",
link: "https://www.producthunt.com/",
total: listData.data?.length || 0,
...listData,
};
return routeData;
};
const getList = async (noCache: boolean) => {
const baseUrl = "https://www.producthunt.com";
const result = await get({
url: baseUrl,
noCache,
headers: {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
});
try {
const $ = load(result.data);
const stories: RouterType["producthunt"][] = [];
$("[data-test=homepage-section-0] [data-test^=post-item]").each((_, el) => {
const a = $(el).find("a").first();
const path = a.attr("href");
const title = $(el).find("a[data-test^=post-name]").text().trim();
const id = $(el).attr("data-test")?.replace("post-item-", "");
const vote = $(el).find("[data-test=vote-button]").text().trim();
if (path && id && title) {
stories.push({
id,
title,
hot: parseInt(vote) || undefined,
timestamp: undefined,
url: `${baseUrl}${path}`,
mobileUrl: `${baseUrl}${path}`,
});
}
});
return {
...result,
data: stories,
};
} catch (error) {
throw new Error(`Failed to parse Product Hunt HTML: ${error}`);
}
};