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

Discord.py机器人仅导出4名成员至TXT文件的问题求助

Discord.py机器人仅导出少量成员数据的解决办法

问题根因

你的机器人只导出4个成员,核心问题是Intents权限未正确配置、未主动获取全量成员,再加上代码里重复初始化客户端的冗余操作导致的,下面一步步修复:

1. 补全Intents配置

Discord.py默认不会自动同步服务器成员列表,必须手动开启members意图,还要在Discord后台开对应权限:

  • 代码里加一行intents.members = True
  • 去Discord开发者后台,找到你的机器人应用,进入「Bot」页面,把「Server Members Intent」和「Presence Intent」都打开(后者可选,但开了更稳妥)

修正后的Intents代码段:

intents = discord.Intents.default()
intents.message_content = True
intents.members = True  # 新增:启用成员获取权限

2. 删掉冗余的客户端实例

你同时初始化了discord.Client和commands.Bot,这俩会冲突,留commands.Bot就行,毕竟你是用命令触发功能:

# 删掉这行没用的:client = discord.Client(intents=intents)
bot = commands.Bot(command_prefix='/', intents=intents)

3. 主动拉取所有成员

server.members只存机器人缓存里的成员(一般是在线或刚活跃过的),要拿到服务器所有476个成员,得用await server.fetch_members(limit=None)来主动拉取:

4. 优化角色遍历逻辑(可选)

原代码只写入那些有"Division"角色且该角色后面还有其他角色的成员,如果成员没这个角色,或者"Division"是最后一个角色,就不会被写入。要是你想把所有成员都记录下来,哪怕没对应角色,就调整下逻辑(看下面完整代码)。

修复后的完整代码

import discord
import os
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
intents.members = True  # 启用成员意图

bot = commands.Bot(command_prefix='/', intents=intents)
token = os.environ['bot_token_justwait']
server_id = 你的服务器ID  # 这里务必填正确的服务器ID

@bot.event
async def on_ready():
    print(f'登录成功:{bot.user}')

@bot.command(name='update')
async def update_member_list(ctx):
    if ctx.channel.name != "testarmee":
        return
    await ctx.send("正在拉取成员信息...")
    server = bot.get_guild(server_id)
    # 拉取所有成员,包括离线的
    all_members = await server.fetch_members(limit=None).flatten()
    # 用utf-8编码避免特殊字符乱码
    with open("memberlist.txt", "w", encoding='utf-8') as f:
        for member in all_members:
            if member.bot:
                continue
            # 倒序遍历角色
            roles = [r for r in member.roles][::-1]
            next_role = "无对应角色"
            # 找Division之后的角色
            for i in range(len(roles) - 1):
                if "Division" in roles[i].name:
                    next_role = roles[i+1].name
                    break
            # 写入成员信息
            line = f"{member.mention}: {member.display_name}, {next_role}\n"
            f.write(line)
    await ctx.send("成员数据已保存到文件!")

bot.run(token)

额外注意点

  • 确保机器人在服务器里有查看成员的权限
  • 如果只想要有"Division"角色的成员,那导出数量少可能是因为大部分成员没这个角色,这时候可以把next_role的默认值去掉,只有找到Division角色才写入
  • 加encoding='utf-8'是为了避免成员名字里的特殊字符写入文件时乱码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:13:15