From 32396aecf1297fd09994b4ec9df1521f56f6c05b Mon Sep 17 00:00:00 2001 From: zhaoyingbo Date: Thu, 13 Feb 2025 08:10:57 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0byteMonitor=E4=BB=A5?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=B9=B6=E7=BF=BB=E8=AF=91=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=86=85=E5=AE=B9=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 1 + bun.lockb | Bin 165495 -> 180502 bytes package.json | 2 + schedule/byteMonitor.ts | 237 ++++++++++++++++++++++++++++++++++++++++ schedule/index.ts | 4 + 5 files changed, 244 insertions(+) create mode 100644 schedule/byteMonitor.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index ce81483..18437d7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "CEINTL", "Chakroun", "CICD", + "cnbj", "commitlint", "dbaeumer", "deepseek", diff --git a/bun.lockb b/bun.lockb index e0497f381be2be8499dab9934dd0bb1629b148ff..03dbd9912ba6351498854c4722a86c631e09763a 100755 GIT binary patch delta 39862 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

2GgSZ&5bXeW%mo_gyIYDC!+KE5ky5 z3v>L@zsxuaDC$CChiMkIy&VB#WM_=Dtd2##c zZ&6Zymc{|@8={`d5BzZIUH8OX%gHTKd!*G_CH4)I+h-5$-1fvVIX8{9f2DN#7w5hd z>aLGkC%t=lju#7Ojl1ucI#px0`l7f@+I5!Qr_n^r#9hf3lk(F1)zp{OQa$aTicn71iI?%z08ulSS z*~o8@cf@ztrWaSc?7oFBt$MvjKkK=%PE>!pD>ufCJ<)8$jp>Q#wXy&9>#|n+hL627 z4P9;!O?e|YWKr9AaX>Vcj{ { + const translatedTexts = await llm.invoke( + "batchTranslate", + { + inputArray: textList, + targetLang: "简体中文", + }, + requestId, + 1, + true + ) + + const translatedList = JSON.parse(translatedTexts as string) as string[] + + const translatedMap: Record = {} + textList.forEach((text, index) => { + translatedMap[text] = translatedList[index] + }) + + return translatedMap +} + +/** + * 过滤不需要翻译的字符串 + * @param str - 待处理的字符串 + * @returns 是否需要翻译 + */ +const getIsTranslatableString = (str: string): boolean => { + const trimmed: string = str.trim() + + // 1. 排除空字符串或纯空白字符 + if (trimmed === "") return false + + // 2. 排除纯Emoji字符(包括复合Emoji如👨👩👧👦) + const isEmojiOnly: boolean = /^\p{Emoji}+$/u.test(trimmed) + if (isEmojiOnly) return false + + // 3. 排除无字母/文字字符(允许包含数字但必须存在文字) + const hasLetters: boolean = /\p{L}/u.test(trimmed) // 匹配任意语言字母/文字 + return hasLetters +} + +/** + * 获取新的页面内容 + * @param newId - 页面ID + * @returns 页面内容的HTML字符串 + */ +const getNewPage = async (newId: number) => { + const url = `https://bytes.dev/archives/${newId}` + const res = await fetch(url) + + if (!res.ok) { + return "" + } + + const htmlContent = await res.text() + + // 替换相对路径为绝对路径 + const replacedContent = htmlContent.replace( + /(href|src)="\/(?!\/)/g, + `$1="https://bytes.dev/` + ) + + return replacedContent +} + +/** + * 获取页面内容并翻译 + * @param ctx - 上下文对象 + * @param rawHtml - 原始HTML内容 + * @returns 翻译后的HTML内容 + */ +const translateHTML = async (ctx: Context, rawHtml: string) => { + const { logger } = ctx + const dom = new JSDOM(rawHtml) + const document = dom.window.document + + // 移除 __NEXT_DATA__ 脚本 + const nextDataEle = document.querySelector( + "script#__NEXT_DATA__" + ) as HTMLScriptElement + nextDataEle.remove() + + // 需要翻译的元素列表(扩展selector需在此添加) + const targetNodes = Array.from( + document.querySelectorAll( + "p:not(code *), h1:not(code *), h2:not(code *), h3:not(code *), h4:not(code *), h5:not(code *), h6:not(code *), span:not(code *), a:not(code *), li:not(code *), td, th:not(code *), caption:not(code *), button:not(code *), label:not(code *), title:not(code *)" + ) + ) + + const needTranslateText: string[] = [] + + // 提取需要翻译的文本 + targetNodes.forEach((ele) => { + const textNodes = Array.from(ele.childNodes).filter( + (node) => node.nodeType === 3 + ) + textNodes.forEach((textNode) => { + const text = textNode.textContent?.trim() + if (text && getIsTranslatableString(text)) { + needTranslateText.push(text) + } + }) + }) + + const uniqueTexts = [...new Set(needTranslateText)] + + logger.debug(`uniqueTexts: ${uniqueTexts}`) + + // 翻译,拆分为多个请求以避免超长 + const chunkSize = 20 + const chunks: string[][] = [] + for (let i = 0; i < uniqueTexts.length; i += chunkSize) { + chunks.push(uniqueTexts.slice(i, i + chunkSize)) + } + const reqList = [] + for (const chunk of chunks) { + reqList.push(translateTextList(chunk, "translateHTML")) + } + + const translatedMaps = await Promise.all(reqList) + + const mergedMap: Record = {} + translatedMaps.forEach((translatedMap) => { + Object.assign(mergedMap, translatedMap) + }) + + // 更新页面内容 + targetNodes.forEach((ele) => { + const textNodes = Array.from(ele.childNodes).filter( + (node) => node.nodeType === 3 + ) + textNodes.forEach((textNode) => { + const text = textNode.textContent?.trim() + if (text) { + const translated = mergedMap[text] + if (translated) { + textNode.textContent = translated + } + } + }) + }) + + // 将所有 标签的点击改成在新页面打开链接 + const anchorNodes = document.querySelectorAll("a") + anchorNodes.forEach((anchor) => { + anchor.setAttribute("target", "_blank") + }) + + return dom.serialize() +} + +/** + * 获取最新的页面ID + * @returns 最新的页面ID + */ +const getLatestId = async () => { + const current = await pbClient + .collection("env") + .getOne("5l8a8u85p5v4aid") + return current.value +} + +/** + * 设置最新的页面ID + * @param id - 页面ID + */ +const setLatestId = async (id: number) => { + await pbClient + .collection("env") + .update("5l8a8u85p5v4aid", { value: id }) +} + +/** + * 写入HTML内容到文件 + * @param html - HTML内容 + */ +const writeHtml = async (html: string, version: number) => { + const client = new S3Client({ + accessKeyId: APP_CONFIG.S3_MICHAT_AK, + secretAccessKey: APP_CONFIG.S3_MICHAT_SK, + region: "cnbj1", + endpoint: "https://s3-cnbj1.mi-fds.net", + bucket: "mi-chat-fe", + }) + + const s3file: S3File = client.file(`bytes/${version}.html`) + await s3file.write(html) +} + +/** + * 监控并翻译最新的页面内容 + */ +const byteMonitor = async () => { + const ctx = await genContextManually() + const { logger, larkService, appInfo } = ctx + logger.info("byteMonitor start") + try { + const latestId = await getLatestId() + if (!latestId) throw new Error("getLatestId empty") + const newId = Number(latestId) + 1 + const newPage = await getNewPage(newId) + if (!newPage) throw new Error("getNewPage empty") + const translatedPage = await translateHTML(ctx, newPage) + await writeHtml(translatedPage, newId) + await setLatestId(newId) + await larkService.message.sendText2Chat( + appInfo.errChatId, + `页面链接:https://mi-chat-fe.cnbj1.mi-fds.com/mi-chat-fe/bytes/${newId}.html`, + "byteMonitor 更新" + ) + } catch (error) { + const errorMessage = `byteMonitor error: ${error}` + logger.error(errorMessage) + } finally { + logger.info("byteMonitor finished") + } +} + +export default byteMonitor diff --git a/schedule/index.ts b/schedule/index.ts index abcaa43..2aa8f20 100644 --- a/schedule/index.ts +++ b/schedule/index.ts @@ -2,6 +2,7 @@ import schedule from "node-schedule" import report from "../controller/groupAgent/report" import { loginPbClient } from "../db/pbClient" +import byteMonitor from "./byteMonitor" import fmMonitor from "./fmMonitor" import sendZhongNotify from "./zhongNotify" @@ -20,4 +21,7 @@ export const initSchedule = async () => { // 定时任务,每小时执行一次 schedule.scheduleJob("0 * * * *", loginPbClient) + + // 定时任务,每小时执行一次 + schedule.scheduleJob("0 * * * *", byteMonitor) }