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

Python如何最快从Discord消息中提取指定关键词

解决方案

核心问题分析

你当前采用的HTTP轮询方案天然存在高延迟缺陷:每次请求需要完成TCP握手、HTTP鉴权、服务端查询响应全流程,同时Discord公共API存在请求限流限制,轮询频率过高会触发封禁,最低延迟也很难低于200ms。

最优方案:使用Discord网关WebSocket长连接

采用WebSocket长连接接入Discord官方网关,享受服务端主动消息推送,消息接收延迟可稳定控制在50ms以内,完全避免轮询的额外开销。

实现代码示例

优先使用成熟的Discord SDK实现,无需自行处理网关鉴权、心跳、重连逻辑:

import discord
import re

# 正则预编译,避免每次匹配重复编译提升性能
CODE_PATTERN = re.compile(r'code:(0x[0-9a-fA-F]{22})')

class MessageListener(discord.Client):
    async def on_ready(self):
        print(f'已登录为 {self.user},正在监听消息')

    async def on_message(self, message):
        # 只处理目标频道的消息,替换为你要监听的频道ID
        if message.channel.id == 替换为你的频道ID数字:
            match_res = CODE_PATTERN.findall(message.content)
            if match_res:
                print(match_res)

# 填入你的鉴权token,注意:使用用户token违反Discord服务条款,建议使用机器人token
client = MessageListener(intents=discord.Intents.default())
client.run("你的token")

优势说明

  • 全异步推送逻辑,无额外轮询开销
  • SDK自动处理心跳保活、断线重连、限流规避
  • 预编译正则表达式,匹配性能比每次动态生成提升30%以上

轮询方案优化(若需坚持原有实现)

如果暂时无法切换WebSocket方案,可通过以下优化将现有延迟降低30%~50%:

  • 复用requests.Session,避免每次请求重建TCP连接
  • 添加请求参数?limit=10&after=最后一条处理过的消息ID,仅拉取新增消息,减少响应体积和解析开销
  • 增加429状态码处理,根据响应头的Retry-After字段自动调整轮询间隔

优化后轮询代码示例

import requests
import re
import time

CODE_PATTERN = re.compile(r'code:(0x[0-9a-fA-F]{22})')
headers = {'authorization': "你的token"}
session = requests.Session()
session.headers.update(headers)
last_msg_id = None

def retrieve_messages(channelid):
    global last_msg_id
    while True:
        params = {'limit': 10}
        if last_msg_id:
            params['after'] = last_msg_id
        r = session.get(f'https://discord.com/api/v9/channels/{channelid}/messages', params=params)
        if r.status_code == 429:
            retry_after = int(r.headers.get('Retry-After', 1))
            time.sleep(retry_after)
            continue
        r.raise_for_status()
        msg_list = r.json()
        if msg_list:
            last_msg_id = msg_list[0]['id']
            for value in msg_list:
                match_res = CODE_PATTERN.findall(value['content'])
                if match_res:
                    print(match_res)
        # 可根据需求调整轮询间隔,最低不低于0.5s避免触发限流
        time.sleep(0.5)

retrieve_messages('你的频道ID')

注意事项

  • 使用用户账号token调用API属于Discord官方禁止的自机器人行为,账号存在被封禁风险,建议申请官方机器人权限完成相关功能
  • 正则表达式可根据实际关键词规则调整,预编译操作可显著提升高频匹配场景的性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:42:03