mirror of
https://github.com/hpware/news-analyze.git
synced 2025-06-23 13:04:23 +00:00
html & remove the legacy hot news by google rss window, (it is still accessable via the tty interface) and update i18n with the aboutNewsOrg thingy added articles (that currently does not work) & also added the privacy policy & tos page, both only accessbile via the tty interface for now. It will be avaible via the settings interface.
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
// TODO Add caching
|
|
import * as cheerio from "cheerio";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const slug = getRouterParam(event, "slug");
|
|
const buildUrl = "https://today.line.me/tw/v3/publisher/" + slug;
|
|
try {
|
|
const req = await fetch(buildUrl, {
|
|
headers: {
|
|
"User-Agent":
|
|
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
Accept: "*",
|
|
"Accept-Language": "zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
Connection: "keep-alive",
|
|
"Sec-Fetch-Dest": "document",
|
|
"Sec-Fetch-Mode": "navigate",
|
|
"Sec-Fetch-Site": "same-origin",
|
|
"Cache-Control": "max-age=0",
|
|
},
|
|
});
|
|
const data = await req.text();
|
|
const html = cheerio.load(data);
|
|
const newsOrgName = html("div.profileHead")
|
|
.text()
|
|
.replace(/.css-.*\}/, "");
|
|
const description = html("p.description").text();
|
|
const logoClue = html("div.editor").contents();
|
|
const logo =
|
|
logoClue.find("img").attr("srcset") ||
|
|
html("div.editor div figure img").attr("src") ||
|
|
"";
|
|
const bgImage = html("figure.keyVisual img").attr("srcset") || "";
|
|
const articles = [];
|
|
const regexArticleLinks = /[a-zA-Z0-9]{7}/g;
|
|
const otherArticles = <any[]>[];
|
|
html("a.ltcp-link").each((i, element) => {
|
|
const articleLink = html(element).attr("href");
|
|
const articleTitle = html(element).find("h3.header").text();
|
|
const date = html(element)
|
|
.find("div._articleCard div.css-wqleh6 span")
|
|
.text();
|
|
if (articleLink && articleTitle) {
|
|
const articleSlug = articleLink.matchAll(regexArticleLinks);
|
|
otherArticles.push({
|
|
index: i,
|
|
title: articleTitle,
|
|
link: articleSlug,
|
|
date: date,
|
|
});
|
|
}
|
|
});
|
|
return {
|
|
title: newsOrgName,
|
|
description: description,
|
|
logo: logo,
|
|
articles: otherArticles,
|
|
logoClue: String(logoClue),
|
|
};
|
|
} catch (e) {
|
|
console.log(e);
|
|
return {
|
|
error: "SERVER_SIDE_ERROR",
|
|
};
|
|
}
|
|
});
|