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

Discord机器人遇NSFW标记meme无响应问题求助

问题分析与修复方案

你的机器人触发“应用未响应”的核心原因有两个:

  1. Discord交互请求存在3秒超时限制,如果首次抓取到NSFW内容后,重新调用接口的耗时超出这个阈值,就会触发超时提示。
  2. 当前代码仅重试一次,且重试后未再次校验内容是否仍为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:52:42