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
相关产品推荐
相关产品推荐

