Discord Python中tasks.loop()内get_channel无法工作的问题
Discord Bot get_channel 循环任务无响应问题解决
核心问题分析
你的get_users循环任务完全没执行(连打印都没输出),根源是任务函数参数错误:
tasks.loop装饰的后台任务不需要ctx(命令上下文)参数,你定义的get_users(ctx)要求传入ctx,但启动时get_users.start()没传参,导致任务内部触发异常却没被捕获,直接静默失败。- 另外
await ctx.send(channel)本身也不成立,ctx不存在,且channel是对象不能直接发送。
修复步骤及代码示例
1. 修正任务函数参数与逻辑
去掉多余的ctx参数,明确指定消息发送的目标频道,同时添加异常判断:
import discord from discord.ext import commands, tasks # 启用所有意图(确保Discord开发者后台也开启了服务器成员意图) intents = discord.Intents.all() client = commands.Bot(command_prefix=get_prefix, intents=intents, help_command=None) @tasks.loop(seconds=5) # 测试用5秒,实际改为60秒 async def get_users(): # 获取指定频道 channel = client.get_channel(1082719335375720448) if not channel: print("错误:未找到指定频道") return # 获取并打印频道成员 members = channel.members print(f"当前频道成员列表:{[m.name for m in members]}") # 发送成员列表到目标频道(可选) member_names = ", ".join([m.name for m in members]) await channel.send(f"当前在线成员:{member_names}") # 为任务添加错误捕获,便于排查问题 @get_users.error async def get_users_error(error): print(f"任务执行出错:{str(error)}") @client.event async def on_ready(): await client.tree.sync() print("Bot已成功连接Discord") # 启动循环任务,无需传参 get_users.start() # 自定义前缀函数(示例) def get_prefix(client, message): return "!" # 替换为你的Bot令牌 client.run("YOUR_BOT_TOKEN")
2. 确保成员缓存正常
要成功获取channel.members,必须满足:
- 代码中启用了
intents.members(Intents.all()已包含) - 在Discord开发者后台的Bot页面,开启「服务器成员意图」和「消息内容意图」(如果需要处理消息)
- Bot在目标服务器内,且服务器成员已被缓存(大型服务器可能需要额外调用
await channel.guild.fetch_members()主动拉取)
3. 关于on_ready中偶发成功的原因
on_ready中直接调用get_channel能成功,是因为此时Bot已就绪,上下文明确;但第二次调用失效可能是缓存未完全加载,或者频道ID有误(需确认ID是否正确)。
内容的提问来源于stack exchange,提问作者AimBought
相关产品推荐
相关产品推荐

