Pranith-Jain/telegram-preview-parser

GitHub: Pranith-Jain/telegram-preview-parser

该工具将 Telegram 频道的公开预览页面解析为结构化 JSON,无需 Bot API 密钥即可获取最近消息并评估频道质量。

Stars: 0 | Forks: 0

# telegram-preview-parser [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Pranith-Jain/telegram-preview-parser/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) 将 Telegram 频道预览页面(`https://t.me/s/`)解析为结构化的 JSON。无需 Bot API 密钥——直接使用公开的预览页面,该页面会展示任何公开频道最近的约 30-50 条消息。 最初提取自 [pranithjain.qzz.io](https://pranithjain.qzz.io) 威胁情报平台,该平台每 30 分钟追踪约 16 个网络安全频道。 ## 安装 ``` npm install telegram-preview-parser ``` ## 快速开始 ``` import { fetchAndParse, scoreChannel } from 'telegram-preview-parser'; // One-call fetch + parse. const messages = await fetchAndParse('telegram'); if (!messages) { console.error('channel not found / fetch failed'); process.exit(1); } console.log(`${messages.length} recent messages`); for (const m of messages.slice(0, 5)) { console.log(m.datetime, m.permalink, '\n ', m.text.slice(0, 80)); } // Quality signal for the channel. const q = scoreChannel(messages); console.log(`channel quality: ${q.score}/100`, q.signals); ``` 如果你已经有了 HTML(已缓存,或自行获取的): ``` import { parseChannelHtml } from 'telegram-preview-parser'; const messages = parseChannelHtml(html, { maxAgeDays: 7, maxMessages: 50, maxTextLength: 400, }); ``` ## API ### `fetchAndParse(handle, opts?) → Promise` 一次调用完成获取和解析。当频道不存在、请求失败,或者 HTML 中缺少预期的 wrapper 标记时,返回 `null`(而不是抛出异常)。 ``` interface FetchOptions { maxTextLength?: number; // default 400; truncates with '…' maxAgeDays?: number; // default 7 maxMessages?: number; // default 50 timeoutMs?: number; // default 8000 userAgent?: string; // default identifies this package signal?: AbortSignal; // caller-side cancellation } ``` ### `parseChannelHtml(html, opts?) → ParsedMessage[]` 纯转换函数。传入完整的 t.me/s/ HTML,返回按最新优先排序的结构化消息。如果 HTML 中缺少预期的 wrapper 标记,则返回 `[]`——Telegram 有时会为无效频道返回主页 HTML,此函数会将其视为“无消息”,而不是抛出错误。 ### `scoreChannel(messages) → ChannelQuality` 基于四个信号计算的 0-100 分频道质量得分: - `recent_pct` — 最近 30 天内发布的消息比例(死频道下降很快) - `dupe_pct` — 重复消息比例(垃圾信息/转载信号) - `median_text_len` — 内容深度代理指标(<50 字符被视为仅含标题) - `posts_per_day` — 发布频率合理性检测(极低和极高都会被扣分) 这用于辅助决策,而不是硬性截断。在信息流中,评分为 35 的频道应该排在 80 的后面,但你可能仍然希望让其消息可见。 ### `decodeEntities(s)` / `stripHtml(s)` 基础构建辅助函数,导出供希望在解析输出基础上实现自定义渲染器的调用者使用。 ## `ParsedMessage` 结构 ``` interface ParsedMessage { permalink: string; // 'https://t.me//' datetime: string; // ISO 8601, from
标签:CMS安全, GNU通用公共许可证, JavaScript, Node.js, Telegram, 数据可视化, 数据解析, 暗色界面, 自动化攻击