Some checks are pending
CI Deploy / build-test-deploy (push) Waiting to run
群监控(GramJS 版)
使用 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 Token(Bot 必须已经在汇报群内)
快速开始
- 安装依赖:
npm install - 配置环境变量:
填写下方参数;
cp .env.example .envSESSION_DIR会自动创建并持久化*.session文件。 - 配置
keywords.yaml(示例见下节)。 - 启动:
首次登陆会提示输入手机号验证码及二步验证密码(若有)。
npm run dev # tsx 直接运行 TypeScript # 或 npm run build && npm run start
环境变量说明
API_ID/API_HASH:来自 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 一致:
keywords:
- name: promo
patterns:
- "推广"
- "广告"
regex: false
- name: join_request
patterns:
- "(?i)拉群"
- "(?im)^加好友"
regex: true
regex: false:子串匹配,自动转为小写比较。regex: true:使用 JavaScript 正则。保留了 Python 示例中的(?i)、(?im)等内联修饰符,会自动拆解为对应的i/m/sflags。- 文件保存后会触发热加载,无需重启进程。
常用脚本
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)
- 本地或服务器执行
npm run dev:inspect(开发态)或npm run start:inspect(生产态)。Node 会输出Debugger listening on ws://127.0.0.1:<port>/...,该端口是临时分配的,不会占用既有业务端口。 - 在 Chrome 地址栏输入
chrome://inspect,点击 “Configure”,将服务器IP:port(若为远程需先通过 SSH 端口转发)加入可调试目标,然后点击inspect。 - 在 Sources 面板设置断点,依次验证以下关键流程:
loadConfig:检查.env解析、会话目录创建与多群链接拆分。createTelegramClient:确认session落盘、验证码 / 2FA 输入路径。KeywordStore:在registerWatcher处模拟keywords.yaml修改,验证热加载是否触发。GroupMonitor:跟踪ensureJoined、watchGroup调用链,确保入群与群主识别逻辑正确。Reporter:在sendAlert断点检查 Markdown 转义与 Bot Token 使用。
- 调试完成后可执行
disconnect(),或在终端Ctrl+C退出。若需复现问题,可结合console.profile、Performance面板导出火焰图。
服务器部署与 CI/CD
一次性初始化
- 登录服务器(示例:
ssh atai@172.16.74.159),确保 Node.js ≥ 18 与 npm 可用。 - 安装 pm2(如未安装):
sudo npm install -g pm2。 - 创建运行目录:
mkdir -p /home/atai/services/qun-monitor。 - 拷贝
.env.example为.env并填入真实参数;首次登录需要人工输入短信验证码。
Gitea Workflow 自动部署
仓库内新增 .gitea/workflows/deploy.yaml,当 main 分支有推送时会执行:
npm ci && npm run lint && npm run test && npm run build,保证代码通过类型检查与单测。npm prune --omit=dev并将dist/ + node_modules + 环境模板 + README打包为qun-monitor-release.tar.gz。- 通过
appleboy/scp-action将制品上传到服务器(默认/home/atai/deployments/qun-monitor)。 - 使用
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:443),Workflow 将负责打包后 “推送” 到服务器,无需在服务器侧执行 git pull,避免占用已有进程端口或破坏现有代理设置。
Description
Languages
TypeScript
100%