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

Discord图片提取机器人在线但无响应问题求助(附代码)

问题:Discord机器人无法自动检测并下载频道图片

我编写了一段Python代码用于提取Discord频道中的图片,但无法正常运行。启动程序后机器人显示在线,但完全不响应消息,预期功能是频道内有消息发送时,机器人自动检测并下载其中的图片。

代码如下:

from discord.ext import commands
import discord
import uuid
import requests
import shutil

#intents = discord.Intents.default()
#intents.message_content = True
client = commands.Bot(command_prefix='.')

def send_discord_message():
    url = "https://discord.com/api/v9/channels/1095975130758393868/messages"
    payload = {
        'content': "/generate description:world"
    }
    header = {
        'authorization': 'mytoken'
    }
    requests.post(url, data=payload, headers=header)


@client.event
async def on_ready():
    print("Bot is ready")


@client.command()
async def save(ctx):
    try:
        url = ctx.message.attachments[0].url
    except IndexError:
        print("Error: No attachments")
        await ctx.send("No attachments detected!")
    else:
        if url[0:26] == "https://cdn.discordapp.com":
            r = requests.get(url, stream=True)
            imageName = str(uuid.uuid4()) + '.jpg'
            with open(imageName, 'wb') as out_file:
                print('Saving image: ' + imageName)
                shutil.copyfileobj(r.raw, out_file)
        else:
            print("Link is not valid")

client.run('Y2MzI5MzQ0NDE2Nw.GRfQle.Cf9gubsAH5AnPcRVibGBxfatL26IbnOU')

解决方法

1. 启用消息内容意图(Intents)

Discord.py 2.0及以上版本必须显式开启message_content意图,否则机器人无法读取消息内容。

  • 取消代码中相关注释并修改:
intents = discord.Intents.default()
intents.message_content = True
client = commands.Bot(command_prefix='.', intents=intents)
  • 前往Discord开发者门户的机器人页面,找到"Privileged Gateway Intents",开启Message Content Intent开关。

2. 添加自动监听消息的逻辑

当前代码只有手动触发的.save命令,没有自动检测新消息的功能,需要添加on_message事件:

@client.event
async def on_message(message):
    # 忽略机器人自身发送的消息,避免循环
    if message.author.bot:
        return
    # 遍历消息中的所有附件
    for attachment in message.attachments:
        # 筛选图片格式的附件
        if attachment.filename.endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
            # 生成唯一文件名并保存
            image_name = f"{uuid.uuid4()}.{attachment.filename.split('.')[-1]}"
            await attachment.save(image_name)
            print(f"已保存图片: {image_name}")
    # 必须保留此语句,否则已有的命令会失效
    await client.process_commands(message)

3. 修复.save命令的潜在问题

优化链接判断逻辑,并增加异常处理:

@client.command()
async def save(ctx):
    try:
        url = ctx.message.attachments[0].url
    except IndexError:
        print("错误:没有附件")
        await ctx.send("未检测到附件!")
    else:
        # 更稳妥的Discord CDN链接判断方式
        if "cdn.discordapp.com" in url:
            try:
                r = requests.get(url, stream=True)
                r.raise_for_status()  # 检查请求是否成功
                image_name = f"{uuid.uuid4()}.jpg"
                with open(image_name, 'wb') as out_file:
                    shutil.copyfileobj(r.raw, out_file)
                print(f"已保存图片: {image_name}")
                await ctx.send(f"图片已保存:{image_name}")
            except requests.exceptions.RequestException as e:
                print(f"下载失败:{e}")
                await ctx.send("图片下载失败!")
        else:
            print("链接无效")
            await ctx.send("无效的图片链接!")

4. 检查机器人权限

确保机器人在目标频道拥有以下权限:

  • 读取消息/查看频道
  • 读取消息历史
  • 发送消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:03:30