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

使用用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:12:14