mirror of
https://github.com/hpware/news-analyze.git
synced 2025-06-23 15:51:01 +08:00
Compare commits
3 Commits
046f5ae446
...
5392974261
Author | SHA1 | Date | |
---|---|---|---|
5392974261 | |||
1dd324e0ca | |||
ce1d150c11 |
@ -10,6 +10,8 @@ Reverse engineering documentation: [about](/about/)
|
||||
## Before deploying, please know this:
|
||||
This code is absolutly NOT designed to be spinned up at Vercel or Netlify, it has the scraping system now inside of the main website code, oh also the entire "caching feature" is based in memory, so please don't use those platforms, for Zeabur your cost might be expensive. idk, I haven't tried it yet. The web url: https://news.yuanhau.com is hosted on my own infra, you should too. Please get a server off of yahoo 拍賣, 蝦皮 or eBay to do so.
|
||||
|
||||
## Note for developing.
|
||||
The desktop enviroment is super unstable when even using a beefy computer, even so, the desktop will lag when opening the newsView, like it's just hates being in a dev env. Prod app works tho, so you can demo it using `bun run build && bun run preview` for demoing. Please don't file a issue request for this matter. If you have the fix, please contribute using Github PRs.
|
||||
|
||||
## Why?
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
const { t } = useI18n();
|
||||
</script>
|
||||
<template>
|
||||
<div class="gap-2 flex flex-row justift-center align-center text-center">
|
||||
<div class="gap-2 flex flex-row justify-center align-center text-center">
|
||||
<!--版權資訊-->
|
||||
<span class="text-sm">1.0.0</span>
|
||||
<span class="text-sm">|</span>
|
||||
|
@ -32,7 +32,7 @@ const props = defineProps<{
|
||||
<hr />
|
||||
<div class="flex flex-col">
|
||||
<span class="text-xl">版權資訊</span>
|
||||
<copyrightInfo />
|
||||
<copyrightInfo class="justify-center align-center text-center" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -241,7 +241,7 @@ const openPublisher = (text: string) => {
|
||||
<TooltipProvider>
|
||||
<Tooltip>
|
||||
<TooltipTrigger>
|
||||
<button @click="openPublisher(item.publisher)">
|
||||
<button @click="openPublisher(item.publisherId)">
|
||||
{{ item.publisher }}
|
||||
</button>
|
||||
</TooltipTrigger>
|
||||
|
@ -69,9 +69,7 @@ const aiSummary = async () => {
|
||||
/>Activate
|
||||
</button>
|
||||
<div v-else>
|
||||
<div v-if="!summaryText">
|
||||
Loading...
|
||||
</div>
|
||||
<div v-if="!summaryText">Loading...</div>
|
||||
<div v-else>{{ summaryText }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,5 +1,14 @@
|
||||
<script setup lang="ts">
|
||||
import { ArrowBigRightDashIcon, BadgeCheckIcon, BadgeXIcon, PanelTopIcon, RssIcon, NewspaperIcon, BotMessageSquareIcon, CombineIcon } from "lucide-vue-next";
|
||||
import {
|
||||
ArrowBigRightDashIcon,
|
||||
BadgeCheckIcon,
|
||||
BadgeXIcon,
|
||||
PanelTopIcon,
|
||||
RssIcon,
|
||||
NewspaperIcon,
|
||||
BotMessageSquareIcon,
|
||||
CombineIcon,
|
||||
} from "lucide-vue-next";
|
||||
const apis = [
|
||||
{
|
||||
icon: ArrowBigRightDashIcon,
|
||||
@ -40,7 +49,8 @@ const apis = [
|
||||
icon: BotMessageSquareIcon,
|
||||
apiroute: "/api/ai/chat/[slug]",
|
||||
name: "A Chating API",
|
||||
content: "This is for the desktop app & talk about news articles. Using Groq's free tier.",
|
||||
content:
|
||||
"This is for the desktop app & talk about news articles. Using Groq's free tier.",
|
||||
caching: false,
|
||||
openAccess: false,
|
||||
},
|
||||
@ -56,14 +66,15 @@ const apis = [
|
||||
</script>
|
||||
<template>
|
||||
<div class="h-4"></div>
|
||||
<div
|
||||
class="justify-center align-center text-center flex flex-col"
|
||||
>
|
||||
<div class="justify-center align-center text-center flex flex-col">
|
||||
<h1 class="text-4xl text-bold m-2">APIs</h1>
|
||||
<div class="items flex flex-row flex-wrap gap-2 justify-center align-center">
|
||||
<div
|
||||
class="items flex flex-row flex-wrap gap-2 justify-center align-center"
|
||||
>
|
||||
<div
|
||||
class="px-10 bg-gray-900/70 w-[400px] h-[300px] group rounded-xl hover:-translate-y-1 shadow-lg hover:shadow-sky-600/90 backdrop-blur-sm border border-gray-800 hover:border-sky-600/70 transition-all duration-700 justify-center align-middle flex flex-col text-left"
|
||||
v-for="item in apis">
|
||||
v-for="item in apis"
|
||||
>
|
||||
<component
|
||||
:is="item.icon"
|
||||
class="w-8 h-8 text-white group-hover:text-sky-500 transition-colors duration-300"
|
||||
@ -72,13 +83,27 @@ const apis = [
|
||||
<h2>API: {{ item.apiroute }}</h2>
|
||||
<p class="text-sm">{{ item.content || "N/A" }}</p>
|
||||
<div class="gap-0 m-1">
|
||||
<div class="text-md flex flex-row gap-2 text-center p-2">Caching:
|
||||
<BadgeCheckIcon v-if="item.caching" class="w-7 h-7 p-1 group-hover:text-green-300 transition-all duration-200"/>
|
||||
<BadgeXIcon v-else class="w-7 h-7 p-1 group-hover:text-red-400 transition-all duration-200"/>
|
||||
<div class="text-md flex flex-row gap-2 text-center p-2">
|
||||
Caching:
|
||||
<BadgeCheckIcon
|
||||
v-if="item.caching"
|
||||
class="w-7 h-7 p-1 group-hover:text-green-300 transition-all duration-200"
|
||||
/>
|
||||
<BadgeXIcon
|
||||
v-else
|
||||
class="w-7 h-7 p-1 group-hover:text-red-400 transition-all duration-200"
|
||||
/>
|
||||
</div>
|
||||
<div class="text-md flex flex-row gap-2 text-center p-2">Open Access:
|
||||
<BadgeCheckIcon v-if="item.caching" class="w-7 h-7 p-1 group-hover:text-green-300 transition-all duration-200"/>
|
||||
<BadgeXIcon v-else class="w-7 h-7 p-1 group-hover:text-red-400 transition-all duration-200"/>
|
||||
<div class="text-md flex flex-row gap-2 text-center p-2">
|
||||
Open Access:
|
||||
<BadgeCheckIcon
|
||||
v-if="item.caching"
|
||||
class="w-7 h-7 p-1 group-hover:text-green-300 transition-all duration-200"
|
||||
/>
|
||||
<BadgeXIcon
|
||||
v-else
|
||||
class="w-7 h-7 p-1 group-hover:text-red-400 transition-all duration-200"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
48
server/api/publishers/lt/[slug].ts
Normal file
48
server/api/publishers/lt/[slug].ts
Normal file
@ -0,0 +1,48 @@
|
||||
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 logo =
|
||||
html("div.editor div figure img").attr("srcset") ||
|
||||
html("div.editor div figure img").attr("src") ||
|
||||
"";
|
||||
const articles = [];
|
||||
const otherArticles = html("section.moduleContainer div");
|
||||
for (const item in otherArticles) {
|
||||
|
||||
}
|
||||
return {
|
||||
name: newsOrgName,
|
||||
description: description,
|
||||
logo: logo,
|
||||
articles: []
|
||||
};
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return {
|
||||
error: "SERVER_SIDE_ERROR",
|
||||
};
|
||||
}
|
||||
});
|
@ -89,6 +89,13 @@ async function lineToday(slug: string) {
|
||||
if (publishMatch) {
|
||||
publishedAt = findTime(publishMatch[1].trim());
|
||||
}
|
||||
|
||||
const findPublisherUrl =
|
||||
html("a.entityPublishInfo-avatarLink").attr("href") || "";
|
||||
const publisherIdMatch = findPublisherUrl.match(/[0-9]{6}/);
|
||||
const publisherId = publisherIdMatch ? publisherIdMatch[0] : "";
|
||||
console.log(publisherId);
|
||||
|
||||
return {
|
||||
title: title,
|
||||
paragraph: paragraph,
|
||||
@ -97,6 +104,7 @@ async function lineToday(slug: string) {
|
||||
images: images,
|
||||
updateat: updatedAt,
|
||||
publishedat: publishedAt,
|
||||
publisherId: publisherId,
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user