Discord.js V12如何拉取30天内旧embed消息并累加其字段中的数值
实现方案
以下方案默认针对Discord场景实现(embed是Discord通用消息组件,如果你使用其他平台,对应调整平台API调用逻辑即可)
一、前置准备
- 确保你使用的机器人账号拥有对应频道的
查看消息、读取消息历史权限 - 安装基础依赖库(以Python + discord.py 技术栈为例):
pip install discord.py
二、核心功能逻辑
可以参考以下逻辑开发:
- 监听指定的手动触发命令,比如
!统计30天数值 - 计算30天对应的时间阈值:用当前时间减去30天的时间差
- 拉取指定频道内时间晚于该阈值的所有历史消息
- 遍历所有消息,筛选出带有embed结构的消息
- 定位到embed中你需要提取数字的目标字段(需要提前确认目标字段的固定名称或者索引位置,比如固定是embed的第2个字段,或者字段名是「提交数值」)
- 提取字段内容中的数字,做格式校验后累加到总和变量
- 所有消息遍历完成后,返回最终的累加结果
示例代码片段:
import discord from datetime import datetime, timedelta intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): if message.content == '!统计30天数值': # 计算30天前的时间节点 thirty_days_ago = datetime.now() - timedelta(days=30) total = 0 # 替换为你要统计的目标频道ID target_channel = client.get_channel(1234567890) # 拉取30天内的所有历史消息 async for msg in target_channel.history(after=thirty_days_ago, limit=None): if msg.embeds: embed = msg.embeds[0] # 替换为你实际的目标字段匹配逻辑,这里示例取name为「数值」的字段 for field in embed.fields: if field.name == '数值': try: num = int(field.value.strip()) total += num except ValueError: # 非数字内容直接跳过 continue await message.channel.send(f'最近30天的数值总和为:{total}') client.run('你的机器人Token')
三、定时执行配置
如果你需要每30天自动执行一次,不需要手动触发命令,可以额外配置定时任务:
- 安装定时任务依赖:
pip install apscheduler - 在代码中配置周期任务,每30天自动执行上述统计逻辑,结果可以发送到指定的通知频道
注意事项
- 如果频道历史消息量极大,建议分批次拉取,避免触发平台API限流
- 提取数字时一定要加异常捕获,避免遇到非数字格式的内容导致程序崩溃
- 提前确认embed的结构没有变动,避免字段位置/名称调整后提取错误
内容的提问来源于stack exchange,提问作者Mathias AC
相关产品推荐
相关产品推荐

