如何使用discord.py开发关键词搜索随机图片的Discord指令
带关键词检索能力的Discord随机图指令实现
核心改造思路
- 把原硬编码猫猫主题的静态指令,改造为支持接收用户自定义关键词的动态指令,利用discord.py的参数捕获能力,完整获取用户在指令后输入的全部内容作为搜索关键词。
- 替换原写死单接口取固定主题图的逻辑,改为「关键词传参→批量拉取匹配的图片结果→随机选取1张返回」的流程,避免同一关键词返回固定内容。
- 保留原有Embed消息的渲染结构,仅将固定的标题、图片地址替换为动态获取的内容,无需重写整套消息发送逻辑。
可直接复用的代码实现
import random import aiohttp from discord.ext import commands async def image(self, ctx, *, keyword: str): # 先发送等待提示,避免接口响应慢时用户无感知 wait_tip = await ctx.send(f"正在搜索与「{keyword}」相关的随机图片...") # 构造搜索请求参数 request_params = { "query": keyword, "result_count": 20 } async with aiohttp.ClientSession() as session: # 调用支持关键词检索的图片接口 async with session.get("可传入关键词参数的图片服务接口地址", params=request_params) as resp: if resp.status != 200: await wait_tip.edit(content="图片搜索服务暂时不可用,请稍后重试") return search_data = await resp.json() # 从结果列表中随机选一条图片地址 try: random_img_url = random.choice(search_data["image_list"])["url"] except (IndexError, KeyError): await wait_tip.edit(content=f"未找到与「{keyword}」相关的图片,请更换关键词重试") return # 构造和原猫指令风格一致的Embed embed = discord.Embed( title=f"随机{keyword}图片", colour=discord.Colour.purple() ) embed.set_image(url=random_img_url) await wait_tip.edit(content=None, embed=embed)
开发注意事项
- 不要在指令逻辑中直接使用同步的
requests库发网络请求,这类阻塞型操作会卡住整个bot的消息处理流程,统一使用异步HTTP客户端发起请求。 - 指令参数必须使用
*, keyword: str的写法,这种写法会跳过参数分隔规则,把用户在指令后输入的所有文本(无论包含多少个单词)拼接为完整关键词传入,避免仅识别第一个单词的问题。 - 拉取搜索结果时建议一次获取10-30条匹配内容,再通过随机函数选一条返回,不要直接返回搜索结果的第一张,否则同一关键词的返回内容会完全固定,失去随机图的效果。
- 必须覆盖所有错误场景的兜底提示,包括接口请求失败、返回结果为空、关键词无匹配内容的情况,避免bot直接抛出报错影响使用。
内容的提问来源于stack exchange,提问作者JonaPoka
相关产品推荐
相关产品推荐

