C# Discord Bot连接Discord API时触发Newtonsoft.Json.JsonReaderException错误
解决Discord Bot连接时的Newtonsoft.Json.JsonReaderException问题
首先,这个错误的核心原因其实很直观:你看到的<字符是HTML标签的开头,说明Discord.Net在尝试解析Discord API的响应时,收到的不是预期的JSON数据,而是一段HTML(通常是错误页面,比如401未授权、网络拦截页面)。这就是为什么你没直接处理JSON却遇到了JSON解析错误——Discord.Net底层会自动处理API的请求和响应解析,出问题的是这个环节。
下面是一步步的排查和解决方法:
1. 优先检查Bot Token是否正确
这是最常见的原因:
- 确保你复制的是Discord开发者门户中Bot页面的Token,而不是OAuth2页面的Client Secret,两者完全不同
- 检查Token有没有多余的空格、换行或者遗漏字符,复制时尽量用右键复制按钮,避免手动选中出错
2. 排查网络或代理问题
如果你的网络有代理、防火墙或者VPN,可能会导致请求被拦截,返回了代理服务器的错误HTML页面:
- 尝试关闭代理、防火墙,或者切换到其他网络(比如手机热点)重新测试
- 确认你的网络可以正常访问Discord的API服务
3. 检查版本兼容性
你使用的.NET Core 2.2已经停止官方支持,Discord.Net 2.1.1和它的兼容性可能存在潜在问题:
- 建议升级你的项目到.NET Core 3.1或更高版本(比如.NET 6/7这类LTS版本更稳定)
- 同时可以尝试调整Discord.Net的版本,比如升级到2.4.x(和.NET Core 3.1兼容的稳定版本),或者确认当前版本的依赖是否正确安装
4. 增加日志和异常捕获,获取更多细节
你可以在代码里添加全局异常捕获,看看更完整的错误信息,帮助定位问题:
修改你的MainAsync方法如下:
public async Task MainAsync() { try { Client = new DiscordSocketClient(); Client.Log += Log; var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"; await Client.LoginAsync(TokenType.Bot, token); await Client.StartAsync(); await Task.Delay(-1); } catch (Exception ex) { Console.WriteLine($"=== 全局异常信息 ==="); Console.WriteLine(ex.ToString()); if (ex.InnerException != null) { Console.WriteLine($"\n=== 内部异常信息 ==="); Console.WriteLine(ex.InnerException.ToString()); } } }
运行后,控制台会输出更完整的异常链,可能会显示API返回的具体错误内容。
5. 检查Discord开发者门户的Bot设置
- 确认你的Bot已经被邀请到目标服务器,并且拥有足够的权限(至少需要Send Messages等基础权限)
- 如果是新创建的Bot,检查是否在开发者门户的Bot页面开启了必要的Privileged Gateway Intents(比如Server Members Intent、Presence Intent),虽然Discord.Net 2.1.1可能还没强制要求,但部分场景下缺少会导致异常
内容的提问来源于stack exchange,提问作者Bouncer
相关产品推荐
相关产品推荐

