Discord bot发送Reddit memes报协程未等待错误,该如何修复?
问题解决思路
1. 修复协程未等待的核心报错
你定义的meme是async异步函数,调用异步函数必须加await关键字,否则不会实际执行函数逻辑,只会返回一个协程对象,这就是你收到的报错的直接原因。
原代码中的memes = meme()需要修改为memes = await meme()
2. 修复函数无返回值问题
你当前的meme函数仅执行了打印标题的操作,没有任何返回值,就算修复了调用问题,最后发送的内容也会是None。如果需要发送梗图,需要返回你取到的submission的图片链接。
3. 适配异步运行环境
你用到的praw是同步库,直接放在Discord.py的异步事件循环中调用会阻塞整个Bot的运行,建议替换为异步的Reddit SDK asyncpraw。
修复后参考代码
import discord import asyncpraw # 初始化异步Reddit客户端 reddit = asyncpraw.Reddit( client_id='#', client_secret='#', user_agent='Discord bot' ) async def get_meme(): subreddit = await reddit.subreddit('memes') # 取热榜前10条中未置顶的图片类投稿 async for submission in subreddit.hot(limit=10): if not submission.stickied and submission.post_hint == 'image': return submission.url # 指令触发逻辑请放在Discord.py的on_message事件回调函数内 if message.content.startswith('Plz meme'): meme_url = await get_meme() if meme_url: await message.channel.send(meme_url) else: await message.channel.send("暂时获取不到梗图,请稍后再试")
额外注意事项
- 你的原代码里
import Discord大小写错误,正确导入语句为import discord,否则会触发导入报错 - 要确保Reddit客户端的
client_id、client_secret参数填写正确,否则会出现权限校验失败的问题 - 指令判断逻辑必须放在Discord.py的
on_message事件回调函数内,不能直接写在全局作用域,否则无法获取到message对象
内容的提问来源于stack exchange,提问作者Abdurrahman A
相关产品推荐
相关产品推荐

