在Telegram群组运营中,“每日活跃用户数”是衡量社群健康度的核心指标。然而,Telegram Bot API并未提供类似“群组日活”的现成接口。许多开发者尝试通过官方文档寻找捷径,却发现只能获取成员总数、管理员列表等信息。那么,我们是否就无法用机器人统计活跃度了?答案是否定的。本文将结合官方API的能力边界,设计一套可靠的自建统计方案,让你用机器人准确掌握群组每日的真实活跃规模。
一、Telegram Bot API对群组数据的开放程度
要制定统计方案,必须先明确官方接口提供哪些信息。以下是与群组活跃度相关的几个关键接口:
- getChatMemberCount:返回群组总成员数,不区分在线与离线,无法反映“活跃”的语义。
- getChatMember:针对单个用户返回其成为成员的时间、角色、权限等,但不包含最近活跃时间。
- getChatAdministrators:返回管理员列表,与活跃度无直接关系。
- 消息更新(Update):这是唯一能反映用户行为的数据源。每当群组内有消息产生,机器人就会收到包含发送者ID与时间戳的更新对象。
可见,官方API本身不直接提供“活跃用户”定义,但消息事件提供了最自然的活性信号。因此,自建方案的核心思路就是:记录每个用户每日发消息的行为,进行去重统计。
二、统计方案设计:基于消息事件的日活计算
一个简单且稳健的设计如下:
- 机器人监听群组中的所有消息(包括文本、图片、视频等所有类型)。
- 对每条消息,提取用户ID(sender_chat_id或from.id)和消息时间(date字段,UTC时间戳)。
- 将“用户ID + 当日日期(转换为群组本地时区)”写入数据库,例如使用Redis、SQLite或PostgreSQL。
- 每日结束时(或实时查询),统计当天的去重用户数即为“每日活跃用户数”。
这种方案技术门槛低,且完全基于官方Bot API,无需额外权限。但要留意:
- 若群组人数众多,消息量大,需为数据库写入加分片或批处理优化。
- 若有多台机器人实例,需要保证数据合并一致性,建议使用带唯一约束的存储。
- 日期时区应统一,例如以UTC日期为准,或按群组所在时区换算,否则跨日统计会失真。
三、从零实现:核心步骤与代码示例
这里以Python + python-telegram-bot库为例,演示最小可行实现。
1. 接收消息并记录用户活动
from telegram.ext import Application, MessageHandler, filters
from datetime import datetime, timezone
import sqlite3
def record_activity(update, context):
# 只统计群组消息,忽略频道帖子和私聊
if update.effective_chat.type not in ("group", "supergroup"):
return
user = update.effective_user
if not user: # 某些匿名消息无用户
return
user_id = user.id
ts = update.effective_message.date # 消息时间(UTC)
day = ts.strftime("%Y-%m-%d") # 按UTC日;可改为本地时区
# 连接数据库(生产环境应使用连接池)
conn = sqlite3.connect("stats.db")
conn.execute("INSERT OR IGNORE INTO daily_activity (day, user_id) VALUES (?, ?)", (day, user_id))
conn.commit()
conn.close()
def main():
app = Application.builder().token("YOUR_TOKEN").build()
app.add_handler(MessageHandler(filters.ALL, record_activity))
app.run_polling()
2. 查询每日活跃用户数
def get_dau(day):
conn = sqlite3.connect("stats.db")
cur = conn.execute("SELECT COUNT(DISTINCT user_id) FROM daily_activity WHERE day = ?", (day,))
count = cur.fetchone()[0]
conn.close()
return count
3. 提供管理员查询命令
可添加指令/active,让管理员通过机器人私聊或群组命令查看某天活跃数。
from telegram.ext import CommandHandler
def cmd_active(update, context):
chat = update.effective_chat
args = context.args
if len(args) != 1:
update.message.reply_text("用法:/active YYYY-MM-DD")
return
day = args[0]
count = get_dau(day)
update.message.reply_text(f" 活跃用户数:")
四、进阶优化:提高统计准确性与实用性
上述基础版本可满足小型群组,但实际运行中还需处理以下问题:
- 忽略系统消息:如用户加入/离开、群组名变更等,应使用MessageHandler的filters.TEXT等过滤,或检查update.effective_message.sender_chat是否为None。
- 处理Bot自身消息:部分机器人会互相发送消息,可通过user.is_bot字段排除bot用户。
- 多日趋势图:定期汇总日活数据,输出周趋势或月趋势,便于直观分析。
- 实时统计:若内存数据库(如Redis)支持按自然日递减计数器,可做到近乎实时的日活统计。
- 权限控制:查询命令应仅允许群组管理员或指定用户执行,防止数据泄露。
五、重要局限与替代思路
必须坦诚地指出:通过消息事件统计的“活跃”仅仅代表“发过消息”,不包含未发言但持续在线的用户。TELEGRAM并不公开用户的在线状态,因此Bot API无法得知用户是否“潜伏”。若需要更精确的活跃定义,可结合以下方法:
- 统计每日点击过机器人内联按钮或命令的用户(这类交互亦属于活动)。
- 定期向用户发送消息,若消息送达则视为“在线”?其实Bot无法收到“已读”回执,不可靠。
- 对于频道,可借助Telegram官方的频道统计功能(仅限应用内,不开放API)。
如果群组规模大且要求高精度,可考虑使用Telegram企业版或第三方数据分析平台,它们通常通过客户端后台或用户授权方式获取更多数据。
六、总结
虽然Telegram Bot API没有直接提供“每日活跃用户数”接口,但通过监听消息事件并配合数据库去重统计,我们完全可以构建一套符合群组运营需求的自建方案。该方案成本低、易于实现,且不违反平台条款。希望本文的介绍能帮助你完成活力度量体系,让群组发展有据可依。