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

如何用Discord.js统计服务器单日发送的消息总量?

实现Discord服务器单日消息总量统计

核心思路是通过channel.history()遍历服务器所有文本频道,筛选指定日期范围内的消息并累加总数,以下是适配新手的分步实现方案:

关键步骤说明

  1. 权限配置:机器人必须开启message_content、guilds、messages这三项Intents,同时在服务器中赋予机器人「读取消息历史」权限
  2. 时间范围限定:通过datetime模块计算目标日期的0点起始时间和次日0点结束时间,用这两个时间作为消息筛选的边界
  3. 频道遍历:仅处理服务器内的文本频道,跳过语音、分类、论坛等非文本类频道
  4. 消息统计:对每个文本频道调用channel.history(),指定时间范围后遍历所有符合条件的消息并计数

完整代码示例(基于Discord.py)

import discord
from datetime import datetime, timedelta
from discord.ext import commands

# 配置机器人权限
intents = discord.Intents.default()
intents.message_content = True
intents.guilds = True
intents.messages = True

# 初始化机器人
bot = commands.Bot(command_prefix='!', intents=intents)

# 定义统计命令,输入格式为!count_daily_messages 2024-05-20
@bot.command()
async def count_daily_messages(ctx, date_str: str):
    # 解析输入日期,处理格式错误
    try:
        target_date = datetime.strptime(date_str, "%Y-%m-%d").date()
    except ValueError:
        await ctx.send("请输入正确的日期格式:YYYY-MM-DD,例如2024-05-20")
        return
    
    # 计算当日时间区间
    start_time = datetime.combine(target_date, datetime.min.time())
    end_time = start_time + timedelta(days=1)
    
    total = 0
    channel_count = 0

    # 遍历所有文本频道
    for channel in ctx.guild.channels:
        if isinstance(channel, discord.TextChannel):
            channel_count += 1
            print(f"正在统计频道:{channel.name}")
            
            # 遍历频道内符合时间范围的消息
            async for _ in channel.history(after=start_time, before=end_time, limit=None):
                total += 1

    await ctx.send(f"服务器{target_date}当日总消息量:{total}条\n共统计{channel_count}个文本频道")

# 启动机器人,替换为你的TOKEN
bot.run("你的机器人TOKEN")

注意事项

  • 如果服务器消息量极大,统计过程可能耗时较长,控制台会输出当前统计的频道名称用于查看进度
  • 若遇到Discord API速率限制,可在遍历消息的循环中加入await asyncio.sleep(1)来降低请求频率
  • 确保机器人已加入目标服务器,且拥有对应频道的消息历史读取权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:03