Discord.py imageapprove命令适配链接式媒体保存需求求助
Discord.py 命令扩展:支持保存链接式媒体文件
原代码仅能处理消息中的附件媒体,无法识别消息内容里的媒体链接(如Discord媒体链接、动图/视频链接),以下是在不大幅重写的前提下的修改方案:
修改思路
- 优先检查回复消息的附件,有附件则沿用原逻辑
- 无附件时,从消息内容中提取符合格式的媒体链接(支持图片、动图、视频常见后缀)
- 优化文件名生成逻辑,避免固定文件名导致的文件覆盖
修改后的代码
import re import requests import shutil from discord.ext import commands # 替换成你的用户ID my_id = 123456789012345678 @bot.command() async def imageapprove(ctx): try: # 仅允许指定ID用户使用 if ctx.author.id != my_id: return # 获取回复的目标消息 message = await ctx.channel.fetch_message(ctx.message.reference.message_id) media_url = None filename = None # 优先处理消息附件 if message.attachments: attachment = message.attachments[0] media_url = attachment.url filename = attachment.filename else: # 用正则匹配消息内容中的媒体链接 # 支持的格式后缀可按需增减 media_pattern = re.compile(r'https?://\S+\.(png|jpg|jpeg|gif|mp4|webm)') match = media_pattern.search(message.content) if match: media_url = match.group() # 从链接末尾提取文件名 filename = media_url.split('/')[-1] if not media_url or not filename: await ctx.send('未找到可保存的媒体内容') return # 确保images文件夹已存在,可添加os.makedirs('images', exist_ok=True)自动创建 save_path = f'images\\{filename}' # 下载并保存媒体文件 res = requests.get(media_url, stream=True) with open(save_path, 'wb') as f: shutil.copyfileobj(res.raw, f) await ctx.send(f'媒体已保存:{filename}') print(f'已保存文件:{save_path}') except Exception as e: await ctx.send('操作出错了') print(f'Error(imageapprove command): {str(e)}')
关键修改点说明
- 导入
re模块实现媒体链接的正则匹配 - 新增附件优先、链接兜底的媒体资源获取逻辑
- 从附件或链接中自动提取文件名,避免固定名称覆盖已有文件
- 捕获具体异常信息,方便调试排查问题
- 增加未找到有效媒体内容的提示反馈
注意事项
- 确保已安装依赖包:
pip install requests discord.py - 提前创建
images文件夹,或在代码开头添加import os; os.makedirs('images', exist_ok=True)实现自动创建 - 正则表达式中的媒体格式后缀可根据需求自行增减,比如添加
.svg等格式
内容的提问来源于stack exchange,提问作者Abdur Rafay
相关产品推荐
相关产品推荐

