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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:43:15