Files
qun-monitor/README.md
你的用户名 0c93f88aa3
Some checks are pending
CI Deploy / build-test-deploy (push) Waiting to run
chore: add gitea deploy workflow
2025-11-08 17:37:57 +08:00

126 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 群监控GramJS 版)
使用 [GramJS](https://github.com/gram-js/gramjs) 驱动的 Node.js User-Bot 自动加入目标群、识别群主并实时监听消息。一旦命中关键词,结果会通过单独的 Telegram Bot 安全汇报到指定群/频道。
## 功能亮点
- **GramJS 长连接**:以 Node.js 形式运行,便于使用 Chrome DevTools Protocol 调试 Node 后端。
- **自动入群**:支持公开群链接与 `https://t.me/+xxxx` 邀请链接,必要时自动执行 `ImportChatInvite`
- **群主洞察**:拉取 `ChannelParticipantsAdmins`,找到创建者后写入汇报,方便对齐「自动添加群主」的状态。
- **关键词热加载**`keywords.yaml` 被修改后自动重新解析,支持子串匹配与 `(?i)``(?im)` 等内联正则修饰符。
- **Bot 汇报隔离**:监听使用 user-bot会话由用户账号维持真正的告警与附件提醒交由 Bot Token 发出,避免刷屏。
## 环境要求
- Node.js 18+(建议 LTS
- Telegram API 凭据:`api_id` / `api_hash`
- 可登录的手机号(首次运行需验证码)
- Telegram Bot TokenBot 必须已经在汇报群内)
## 快速开始
1. 安装依赖:
```bash
npm install
```
2. 配置环境变量:
```bash
cp .env.example .env
```
填写下方参数;`SESSION_DIR` 会自动创建并持久化 `*.session` 文件。
3. 配置 `keywords.yaml`(示例见下节)。
4. 启动:
```bash
npm run dev # tsx 直接运行 TypeScript
# 或
npm run build && npm run start
```
首次登陆会提示输入手机号验证码及二步验证密码(若有)。
## 环境变量说明
- `API_ID` / `API_HASH`:来自 [my.telegram.org](https://my.telegram.org)。
- `SESSION_NAME` / `SESSION_DIR`:本地 session 文件名及所在目录。
- `USER_PHONE`:可选,预填手机号。
- `TWO_FA_PASSWORD`:可选,账号开启二步验证时使用。
- `GROUP_LINKS`:逗号分隔的群链接列表,可混合公开链接与 `https://t.me/+xxxx`。
- `REPORT_CHAT_LINK`:汇报消息要发送到的群/频道;留空时默认取 `GROUP_LINKS` 第一项。
- `TELEGRAM_BOT_TOKEN`Bot HTTP API Token。
- `KEYWORDS_FILE`:关键词配置路径,默认 `keywords.yaml`。
- `LOG_LEVEL``trace|debug|info|warn|error`,默认 `info`。
## 关键词配置
`keywords.yaml` 结构与旧版 Python 一致:
```yaml
keywords:
- name: promo
patterns:
- "推广"
- "广告"
regex: false
- name: join_request
patterns:
- "(?i)拉群"
- "(?im)^加好友"
regex: true
```
- `regex: false`:子串匹配,自动转为小写比较。
- `regex: true`:使用 JavaScript 正则。保留了 Python 示例中的 `(?i)`、`(?im)` 等内联修饰符,会自动拆解为对应的 `i/m/s` flags。
- 文件保存后会触发热加载,无需重启进程。
## 常用脚本
- `npm run dev`tsx 直接运行 `src/main.ts`。
- `npm run build`:编译到 `dist/`,配合 `npm run start` 运行。
- `npm run lint``tsc --noEmit` 类型检查。
- `npm run test`Vitest 单测,当前覆盖 `KeywordStore` 热加载逻辑。
- `npm run dev:inspect`:以 `node --inspect` 启动开发流程,便于 Chrome DevTools 调试。
- `npm run start:inspect`:对编译后的 `dist/main.js` 开启 Inspector适合线上问题排查。
## 注意事项
- user-bot 与汇报 Bot 都必须在 `REPORT_CHAT_LINK` 对应的群/频道里,且 Bot 拥有发言权限。
- Telegram 对频繁入群会触发 `FLOOD_WAIT_xx`,日志会提示需要等待的秒数。
- `sessions/*.session` 含账号授权信息,请妥善保管。
- 长期部署建议使用 `pm2 / systemd` 等守护方式并接入日志轮转。
## CDP 调试检查Chrome DevTools
1. 本地或服务器执行 `npm run dev:inspect`(开发态)或 `npm run start:inspect`生产态。Node 会输出 `Debugger listening on ws://127.0.0.1:<port>/...`,该端口是临时分配的,不会占用既有业务端口。
2. 在 Chrome 地址栏输入 `chrome://inspect`,点击 “Configure”将服务器 `IP:port`(若为远程需先通过 SSH 端口转发)加入可调试目标,然后点击 `inspect`。
3. 在 Sources 面板设置断点,依次验证以下关键流程:
- `loadConfig`:检查 `.env` 解析、会话目录创建与多群链接拆分。
- `createTelegramClient`:确认 `session` 落盘、验证码 / 2FA 输入路径。
- `KeywordStore`:在 `registerWatcher` 处模拟 `keywords.yaml` 修改,验证热加载是否触发。
- `GroupMonitor`:跟踪 `ensureJoined`、`watchGroup` 调用链,确保入群与群主识别逻辑正确。
- `Reporter`:在 `sendAlert` 断点检查 Markdown 转义与 Bot Token 使用。
4. 调试完成后可执行 `disconnect()`,或在终端 `Ctrl+C` 退出。若需复现问题,可结合 `console.profile`、`Performance` 面板导出火焰图。
## 服务器部署与 CI/CD
### 一次性初始化
1. 登录服务器(示例:`ssh atai@172.16.74.159`),确保 Node.js ≥ 18 与 npm 可用。
2. 安装 pm2如未安装`sudo npm install -g pm2`。
3. 创建运行目录:`mkdir -p /home/atai/services/qun-monitor`。
4. 拷贝 `.env.example` 为 `.env` 并填入真实参数;首次登录需要人工输入短信验证码。
### Gitea Workflow 自动部署
仓库内新增 `.gitea/workflows/deploy.yaml`,当 `main` 分支有推送时会执行:
1. `npm ci && npm run lint && npm run test && npm run build`,保证代码通过类型检查与单测。
2. `npm prune --omit=dev` 并将 `dist/ + node_modules + 环境模板 + README` 打包为 `qun-monitor-release.tar.gz`。
3. 通过 `appleboy/scp-action` 将制品上传到服务器(默认 `/home/atai/deployments/qun-monitor`)。
4. 使用 `appleboy/ssh-action` 在服务器解压至 `APP_DIR`(默认 `/home/atai/services/qun-monitor`),若检测到 `.env`,则:
- 自动安装 pm2若缺失
- `pm2 restart qun-monitor --update-env` 或 `pm2 start npm --name qun-monitor -- start`。
- `pm2 save` 持久化进程列表。
### CI/CD 所需机密
请在 Gitea 仓库 Settings → Secrets 中配置以下变量:
| Secret 名称 | 说明 |
|-------------|------|
| `DEPLOY_HOST` | 服务器 IP例如 `172.16.74.159` |
| `DEPLOY_PORT` | SSH 端口,默认 `22` 可省略 |
| `DEPLOY_USER` | SSH 用户名,例如 `atai` |
| `DEPLOY_PASSWORD` | 对应的登录密码 |
| `DEPLOY_APP_DIR` | (可选)部署目录,默认 `/home/atai/services/qun-monitor` |
| `DEPLOY_PACKAGE_DIR` | (可选)制品临时目录,默认 `/home/atai/deployments/qun-monitor` |
如果服务器到 Gitea 存在网络限制(如本次环境无法直接访问 10.23.73.251:443Workflow 将负责打包后 “推送” 到服务器,无需在服务器侧执行 `git pull`,避免占用已有进程端口或破坏现有代理设置。