Discord机器人遇NSFW标记meme无响应问题求助
问题分析与修复方案
你的机器人触发“应用未响应”的核心原因有两个:
- Discord交互请求存在3秒超时限制,如果首次抓取到NSFW内容后,重新调用接口的耗时超出这个阈值,就会触发超时提示。
- 当前代码仅重试一次,且重试后未再次校验内容是否仍为NSFW,同时没有提前完成所有内容抓取就尝试响应,极易触发超时。
修复思路
- 先循环抓取内容,直到拿到非NSFW帖子(或达到重试上限),确保发送响应前已准备好合规内容。
- 优化函数逻辑,减少重复代码,避免多次重复解析JSON。
修复后的代码
@client.tree.command(name='random-reddit-meme', description='指定子版块时直接写名称,不用加"r/"') async def random_reddit_meme(interaction: discord.Interaction, subreddit: str=None): def get_valid_meme(subreddit_name, max_retries=5): # 设置重试上限,避免无限循环 for _ in range(max_retries): target_sub = subreddit_name if subreddit_name else 'dankmemes' r = requests.get(f'https://meme-api.com/gimme/{target_sub}') res = r.json() # 检查是否非NSFW且接口返回有效内容 if not res.get('nsfw', False) and res.get('url'): return res, target_sub # 多次重试失败后返回空值 return None, None # 先获取合规的meme内容 meme_data, target_sub = get_valid_meme(subreddit) if not meme_data: await interaction.response.send_message('多次尝试后仍未获取到合规内容,请稍后再试') return # 生成嵌入消息 em = discord.Embed(url=meme_data['postLink']) em.set_image(url=meme_data['url']) em.add_field( name='Meme', value=f'来自: r/{target_sub} 作者: {meme_data["author"]} \n\n {meme_data["title"]}' ) # 发送响应 await interaction.response.send_message(embed=em)
关键优化点
- 新增
get_valid_meme函数,循环抓取直到拿到非NSFW内容,最多重试5次(可按需调整)。 - 先完成所有内容抓取与验证,再发送交互响应,彻底规避超时问题。
- 增加接口返回有效性检查,防止接口报错导致程序异常。
- 简化代码结构,减少重复的JSON解析与变量赋值操作。
内容的提问来源于stack exchange,提问作者Noa
相关产品推荐
相关产品推荐

