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

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模块实现媒体链接的正则匹配
  • 新增附件优先、链接兜底的媒体资源获取逻辑
  • 从附件或链接中自动提取文件名,避免固定名称覆盖已有文件
  • 捕获具体异常信息,方便调试排查问题
  • 增加未找到有效媒体内容的提示反馈

注意事项

  1. 确保已安装依赖包:pip install requests discord.py
  2. 提前创建images文件夹,或在代码开头添加import os; os.makedirs('images', exist_ok=True)实现自动创建
  3. 正则表达式中的媒体格式后缀可根据需求自行增减,比如添加.svg等格式

内容的提问来源于stack exchange,提问作者Abdur Rafay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:25:26