You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord机器人Meme命令突然失效,JSON解码异常报错求助

解决Discord Meme机器人请求Reddit API失败的问题

嘿,我之前碰到过完全一样的情况!你的猜测没错——这确实是Reddit的API限制导致的。现在Reddit会拒绝没有合法User-Agent请求头的请求,直接返回HTML页面(也就是你看到的text/html类型错误),而不是预期的JSON数据,这就导致了解码失败的问题。

核心问题分析

你遇到的两个错误本质上是同一个原因:

  • ContentTypeError:Reddit返回了HTML页面而非JSON,aiohttp无法按JSON格式解码
  • JSONDecodeError:请求被拦截后返回空内容或非JSON文本,导致JSON解析失败

解决方案

只需要在请求Reddit时添加合法的User-Agent请求头,同时优化代码提升稳定性:

1. 添加User-Agent请求头

修改cs.get请求部分,加上headers参数:

async with cs.get(
    f'https://www.reddit.com/r/{subreddit}/new.json?sort=hot',
    headers={'User-Agent': 'Discord Meme Bot/1.0 (your-discord-username)'}) as r:

Reddit要求User-Agent能标识你的应用,格式可以是应用名称/版本号 (联系方式),随便填个合理的内容就行,比如你的机器人名字+版本,或者你的用户名。

2. 优化随机选择逻辑

原来用random.randint(0,25)可能碰到子版块帖子不足25条的情况,导致索引越界,换成random.choice()更安全:

posts = res['data']['children']
if not posts:
    await ctx.send("哎呀,这个子版块现在没找到任何梗图!")
    return
post = random.choice(posts)

3. 添加异常处理

避免请求失败或数据结构异常导致机器人崩溃,加上try-except块:

async def meme(self,ctx):
    '''get a random meme from reddit!'''
    subreddits = ['dankmemes', 'memes','meme', 'wholesomememes', 'comedyheaven','pewdiepiesubmissions', 'KidsAreFuckingStupid','cursedcomments','HolUp','blursedimages','rareinsults']
    subreddit = random.choice(subreddits)
    async with aiohttp.ClientSession() as cs:
        try:
            async with cs.get(
                f'https://www.reddit.com/r/{subreddit}/new.json?sort=hot',
                headers={'User-Agent': 'Discord Meme Bot/1.0 (your-username)'}) as r:
                res = await r.json()
                posts = res['data']['children']
                if not posts:
                    await ctx.send("哎呀,这个子版块现在没找到任何梗图!")
                    return
                post = random.choice(posts)
                url = post['data']['url']
                title= post['data']['title']
                embed = discord.Embed(title = title,description=f"Meme for {ctx.author}")
                embed.set_image(url=url)
                embed.set_footer(text = f'Image from r/{subreddit}')
                await ctx.send(embed=embed)
        except Exception as e:
            await ctx.send("抱歉,获取梗图的时候出错了!")
            print(f"Meme command error: {e}")

为什么突然失效?

Reddit最近加强了对未标识请求的拦截,之前可能允许无UA的请求,但现在不行了——这就是你的命令突然失效的原因。

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

火山引擎 最新活动