使用用户Token通过Rust的Serenity库获取Discord消息时认证失败求助
问题原因与解决方案
核心原因
Serenity的Client::builder默认适配机器人Token,直接传入个人用户Token会触发网关认证失败——Discord对用户账号和机器人账号的网关认证逻辑完全不同。另外必须注意:Discord官方明确禁止使用个人用户Token进行自动化操作,违反服务条款会导致账号永久封禁。
修复步骤
1. 启用用户认证模式
在构建Client时显式指定使用用户会话认证,这是解决InvalidAuthentication的关键:
let mut client = Client::builder(USER_TOKEN, GatewayIntents::GUILD_MESSAGES) .user_auth() // 开启用户账号认证模式 .event_handler(handler) .await .expect("Error creating client");
2. 补充必要的网关权限
确保请求的网关权限覆盖消息监听需求,添加MESSAGE_CONTENT权限以获取消息内容:
GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT
3. 验证Token格式
个人用户Token以Nz...或类似格式开头,不要添加Bot 前缀,也不要包含多余空格或换行。
合规提醒
使用个人用户Token开发自动化工具属于违规行为,Discord的反作弊系统会检测此类操作。合法的替代方案:
- 申请机器人账号,请求频道管理员授权机器人访问目标频道
- 使用Discord Webhook功能接收频道消息(仅需频道管理员配置)
完整修改后的main.rs
use event::*; use serenity::{all::GatewayIntents, Client}; #[allow(unused)] mod event; #[tokio::main] async fn main() { const USER_TOKEN: &str = "MY_AUTHORIZATION_TOKEN"; let config = load_config(); let handler = Handler { channel: "1170190720754274415" }; let mut client = Client::builder(USER_TOKEN, GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT) .user_auth() .event_handler(handler) .await .expect("Error creating client"); if let Err(why) = client.start().await { println!("Client error: {:?}", why); } }
内容的提问来源于stack exchange,提问作者Nayrosk
相关产品推荐
相关产品推荐

