Pranith-Jain/telegram-preview-parser
GitHub: Pranith-Jain/telegram-preview-parser
该工具将 Telegram 频道的公开预览页面解析为结构化 JSON,无需 Bot API 密钥即可获取最近消息并评估频道质量。
Stars: 0 | Forks: 0
# telegram-preview-parser
[](https://github.com/Pranith-Jain/telegram-preview-parser/actions/workflows/ci.yml)
[](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, 数据可视化, 数据解析, 暗色界面, 自动化攻击