You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在C#中通过API动态读取Telegram机器人所在群组的用户消息(不使用getUpdates方法)

解决方案:使用Webhook替代getUpdates实现精准消息接收

当然可以实现!完全不用依赖getUpdates方法,**Webhook(网络钩子)**就是解决这个问题的最优方案——它能让Telegram主动把你关心的消息推送到你的服务器,而非让你去轮询所有消息,从根源上降低了解析和入库的复杂度。

核心原理

getUpdates是轮询模式,你得主动去拉取所有消息然后自己过滤;而Webhook是推送模式:你给Telegram提供一个可访问的服务器URL,当有新的消息(或其他更新)产生时,Telegram会自动把更新数据以POST请求的形式发送到这个URL。你只需要在服务器端对接收到的内容做针对性过滤即可,不用处理无关消息。

具体实现步骤

  1. 设置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官方支持的端口);开发阶段可以用内网穿透工具把本地服务暴露到公网。

  2. 处理推送的消息
    当有用户在群组发消息时,Telegram会向你的Webhook URL发送一个JSON格式的Update对象。你可以在服务器端直接解析这个对象,只提取你需要的群组用户消息:

    • 过滤条件:检查chat.type是否为groupsupergroup(确保是群组消息);检查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

火山引擎 最新活动