如何在C#中通过API动态读取Telegram机器人所在群组的用户消息(不使用getUpdates方法)
解决方案:使用Webhook替代getUpdates实现精准消息接收
当然可以实现!完全不用依赖getUpdates方法,**Webhook(网络钩子)**就是解决这个问题的最优方案——它能让Telegram主动把你关心的消息推送到你的服务器,而非让你去轮询所有消息,从根源上降低了解析和入库的复杂度。
核心原理
getUpdates是轮询模式,你得主动去拉取所有消息然后自己过滤;而Webhook是推送模式:你给Telegram提供一个可访问的服务器URL,当有新的消息(或其他更新)产生时,Telegram会自动把更新数据以POST请求的形式发送到这个URL。你只需要在服务器端对接收到的内容做针对性过滤即可,不用处理无关消息。
具体实现步骤
设置Webhook
调用Telegram Bot API的setWebhook接口,把你的服务器接收地址告诉Telegram。比如用curl命令:curl -F "url=https://your-domain.com/telegram-webhook" https://api.telegram.org/bot<你的BotToken>/setWebhook注意:你的服务器必须支持HTTPS,且端口建议用443、80、88或8443(Telegram官方支持的端口);开发阶段可以用内网穿透工具把本地服务暴露到公网。
处理推送的消息
当有用户在群组发消息时,Telegram会向你的Webhook URL发送一个JSON格式的Update对象。你可以在服务器端直接解析这个对象,只提取你需要的群组用户消息:- 过滤条件:检查
chat.type是否为group或supergroup(确保是群组消息);检查message.from.is_bot是否为false(确保是真人用户发送的消息)。 - 提取字段:比如用户ID、用户名、消息内容、群组ID等,直接用于入库操作。
- 过滤条件:检查
简单代码示例(Python Flask)
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/telegram-webhook', methods=['POST']) def handle_telegram_webhook(): # 接收Telegram推送的更新数据 update_data = request.get_json() # 只处理包含消息的更新 if 'message' in update_data: message = update_data['message'] chat_info = message['chat'] sender_info = message['from'] # 过滤:仅处理群组/超级群组中的非机器人用户消息 if chat_info['type'] in ['group', 'supergroup'] and not sender_info['is_bot']: # 提取你需要的字段 user_id = sender_info['id'] username = sender_info.get('username', '未设置用户名') group_id = chat_info['id'] message_text = message.get('text', '非文本消息(如图片/语音)') # 这里写你的数据库插入逻辑 print(f"群组[{group_id}] 用户[{username}({user_id})] 发送:{message_text}") # 必须返回200响应给Telegram,否则它会重复推送 return jsonify({'status': 'success'}) if __name__ == '__main__': # 开发阶段临时用自签名证书,正式环境请使用正规SSL证书 app.run(ssl_context='adhoc', port=8443)
关键注意事项
- 确保你的服务器能稳定接收Telegram的POST请求,不要有防火墙拦截。
- 每次处理完请求后,务必返回200状态码的响应,否则Telegram会认为推送失败,重复发送相同的更新。
- 如果需要处理大量消息,建议在服务器端做异步处理,避免阻塞请求响应。
这种方式完全避开了getUpdates需要遍历所有消息的麻烦,你可以在接收环节就精准过滤出目标消息,直接进行数据库插入操作,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者ashok




