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
相关产品推荐
相关产品推荐

