tg-channel-bot/PLAN_MULTI_ACCOUNT.md

3.0 KiB
Raw Permalink Blame History

多协议号监控 - 实施计划

背景

客户频道太多一个号装不下Telegram 限制约500个群/频道),需要多个协议号分摊监控,所有消息汇总到同一个数据库。

当前架构

  • 单号登录(手机号+验证码)
  • 单个 TelegramClient
  • 单个 session 文件userbot.session
  • SQLite 数据库存消息

目标架构

  • 多号同时在线(协议号 StringSession 导入)
  • 多个 TelegramClient 并行运行
  • 每个号可配独立代理IP
  • 所有消息存同一个数据库
  • 管理员通过任意一个号发指令控制

实施步骤

第1步数据库改造

文件database.py

  • 新增 accounts 表:
    accounts (
      id, session_name, session_string, phone, nickname,
      proxy_type, proxy_host, proxy_port,
      is_active, max_chats, created_at
    )
    
  • watched_chats 表新增 account_id 字段(哪个号监控哪个群)
  • messages 表已有 chat_id,不用改
  • 新增 CRUD 函数add_account, remove_account, get_accounts, get_active_accounts

第2步协议号导入

文件bot.py交互菜单

  • 新增菜单选项「7. 账号管理」子菜单:
    • a. 添加协议号(输入 session 字符串)
    • b. 添加直登号(手机号+验证码,现有逻辑)
    • c. 查看所有账号(在线状态、监控群数)
    • d. 设置代理(给某个号配代理)
    • e. 删除账号
    • f. 返回

第3步多Client并行

文件bot.pydo_run

  • 启动时从数据库读取所有 active 账号
  • 每个账号创建一个 TelegramClient
    from telethon.sessions import StringSession
    
    # 协议号
    client = TelegramClient(
        StringSession(session_string),
        api_id, api_hash,
        proxy=('socks5', host, port)  # 如果配了代理
    )
    
    # 直登号(现有方式)
    client = TelegramClient(session_file, api_id, api_hash)
    
  • 所有 client 注册相同的 handler
  • 用 asyncio.gather 同时运行所有 client

第4步群分配策略

  • /join 时自动分配给监控群最少的号
  • 或手动指定:/join <群链接> <账号ID>
  • /list 显示每个群由哪个号监控

第5步指令路由

  • 管理员私聊任意一个号都能发指令
  • 所有号的 handler 共享同一套指令逻辑
  • 搜索从统一数据库查,不区分哪个号采集的

第6步代理支持

文件config.py

  • 新增 DEFAULT_PROXY 配置(可选)
  • 每个账号可单独配代理,覆盖默认值
  • 支持 SOCKS5 / HTTP 代理

文件改动清单

文件 改动
database.py 新增 accounts 表 + CRUD + watched_chats 加 account_id
bot.py 多client启动 + 账号管理菜单 + 群分配 + StringSession 支持
config.py DEFAULT_PROXY 配置
requirements.txt 加 pysocks代理支持

风控注意

  • 每个号绑定独立IP不共用
  • 只读监控,不发消息
  • 加群间隔控制(不要同时大量加群)
  • 每个号最多监控 400 个群(留余量)