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

如何通过API实现Discord机器人发送图片 附代码排查报错问题

Discord机器人调用猫图API发图问题解答

初始化代码校验

你贴的第一段导入+客户端初始化代码语法无硬伤,但存在3个冗余导入:json、random、replit.db在当前功能中完全没有被调用,可以直接删除,减少不必要的依赖加载。
另外注意新版discord.py(v2.0+)必须显式开启消息意图,否则无法接收用户发送的消息内容,你原来的初始化写法在新版库下会直接失效。

核心功能问题解答

1. 实现思路是否正确

整体逻辑链路是对的:监听用户消息→匹配触发指令→调用猫图API拿资源地址→把地址发回频道,这个思路没有问题。

2. 运行报错根因

你写的get_pic()函数解析接口返回值的逻辑错误:The Cat API的图片搜索接口返回值是数组格式,不是直接的键值对对象,你直接调用.json()['url']会触发KeyError——因为数组对象不存在url这个键。

3. 是否需要API密钥

这个接口支持无密钥调用,个人小机器人使用完全足够,只是有默认的请求频率限制;如果后续需要更高请求配额、或者要调用接口的收藏、投票等高级功能,再申请对应API密钥即可。

修正后可运行完整代码

import discord
import os
import requests

# 开启消息内容意图,新版discord.py必填
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

def get_pic():
    api_resp = requests.get('https://api.thecatapi.com/v1/images/search')
    # 接口请求失败时直接抛出异常,方便排查问题
    api_resp.raise_for_status()
    pic_list = api_resp.json()
    # 接口返回的是图片数组,取第一个元素的url字段
    return pic_list[0]['url']

@client.event
async def on_ready():
    print(f"登录成功,机器人账号:{client.user}")

@client.event
async def on_message(message):
    # 跳过机器人自己发的消息,避免触发死循环
    if message.author == client.user:
        return

    # 匹配触发指令
    if message.content.startswith('pls catto'):
        cat_pic_url = get_pic()
        # 直接发送图片链接,Discord会自动加载图片预览
        await message.channel.send(cat_pic_url)

# 从环境变量读取机器人TOKEN运行
client.run(os.environ['TOKEN'])

额外注意事项

  • 运行前必须去Discord开发者后台,对应机器人的「Bot」设置页,打开Message Content Intent开关,否则无法读取用户发的消息内容
  • 如果部署在Replit平台,记得在环境变量配置页正确填写TOKEN字段,值为你的机器人令牌
  • 直接发URL会自动触发图片预览,如果需要更美观的卡片式消息,可以用discord.Embed把图片嵌进去发送

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:24:32