You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用python-telegram-bot v20.x监控Telegram频道新用户?

问题解决:用python-telegram-bot v20.x追踪Telegram频道新成员

先明确可行性

机器人无法检测用户主动订阅频道的行为——Telegram频道是广播机制,用户自主点击订阅的操作不会向机器人推送任何事件通知。只有当频道管理员手动添加成员时,才会生成系统消息,机器人才能捕获到该事件。

针对管理员手动加人的代码修复

你原代码是针对群组编写的,频道的消息结构存在差异,需要做两处调整:

  1. 频道的系统消息存储在update.channel_post中,而非update.message
  2. 需要使用ChannelPostHandler处理频道消息,而非MessageHandler

同时要确保机器人在频道内拥有读取消息、管理频道的权限,否则无法获取系统消息。

修改后的代码示例:

from telegram import Update
from telegram.ext import Application, ContextTypes, filters, ChannelPostHandler

TOKEN = "MY_BOT_TOKEN"

async def handle_added_members(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    channel_post = update.channel_post
    if channel_post.new_chat_members:
        for user in channel_post.new_chat_members:
            print(f"管理员手动添加了用户: @{user.username} (ID: {user.id})")

app = Application.builder().token(TOKEN).build()
# 替换为ChannelPostHandler处理频道的状态更新事件
app.add_handler(ChannelPostHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, handle_added_members))
app.run_polling()

想追踪所有订阅者(包括主动加入的)怎么办?

这种场景只能通过定期查询频道数据实现,但存在以下局限:

  • 使用getChatMemberCount:可每隔一段时间查询一次成员总数,对比历史数值判断是否有新增,但无法获取具体用户信息。该API调用限制较宽松,适合做粗略统计。
  • 使用getChatMemberList:能获取具体成员信息,但调用频率限制严格(每分钟仅允许几次调用),且仅对成员数少于10000的频道有效,成员过多时无法获取完整列表。

定期查询成员数的示例代码:

from telegram import Update
from telegram.ext import Application, ContextTypes, JobQueue
import asyncio

TOKEN = "MY_BOT_TOKEN"
CHANNEL_ID = "-100XXXXXXXXX"  # 填写你的频道ID,格式为-100开头
last_count = 0

async def check_subscriber_change(context: ContextTypes.DEFAULT_TYPE):
    global last_count
    try:
        chat_info = await context.bot.get_chat(CHANNEL_ID)
        current_count = chat_info.member_count
        if last_count != 0 and current_count > last_count:
            print(f"新增了 {current_count - last_count} 个订阅者")
        last_count = current_count
    except Exception as e:
        print(f"查询失败: {str(e)}")

async def main():
    app = Application.builder().token(TOKEN).build()
    # 每5分钟查询一次(可根据需求调整间隔)
    app.job_queue.run_repeating(check_subscriber_change, interval=300, first=10)
    await app.run_polling()

if __name__ == "__main__":
    asyncio.run(main())

总结

  • 仅管理员手动添加成员的事件可被机器人捕获,用户主动订阅频道的行为无法检测
  • 主动订阅的追踪只能通过定期查询数据实现,无法获取具体用户信息,且存在API调用限制

内容的提问来源于stack exchange,提问作者AslanPAPA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:15