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




