正在向Discord频道发送消息



我想要实现的目标:

每当console_app.exe被外部程序执行时,我想在Discord频道上发送消息,所以我决定使用纯rest:

我通过https://discord.com/developers/applications创建了APP

我有ClientId和ClientSecret,现在我想从代码登录并在特定通道上发送消息

我正在获得令牌,没有问题的响应,如:

{
"access_token": "6qrZcUqja781...HBFG",
"token_type": "Bearer",
"expires_in": 604800,
"scope": "identify connections"
}

但当我尝试发送消息(函数WriteMessage(时,由于某种原因,我是Unauthorized

整个代码:

private static readonly RestClient client = new RestClient("https://discord.com");
public string Perform()
{
client.Authenticator = new HttpBasicAuthenticator(_config.ClientId, _config.ClientSecret);
var token = GetToken();
client.Authenticator = null;
return WriteMessage(token);
}

private string GetToken()
{
var signInRequest = new RestRequest("/api/v6/oauth2/token", Method.POST);
signInRequest.AddHeader("content-type", "application/x-www-form-urlencoded");
signInRequest.AddParameter("grant_type", "client_credentials");
signInRequest.AddParameter("scope", "identify connections");
var result = client.Execute<AuthResult>(signInRequest);
return result.Data.access_token;
}

private string WriteMessage(string token)
{
var request = new RestRequest("/api/v8/channels/.../messages", Method.POST);
request.AddHeader("Authorization", $"Bearer {token}");
//request.AddHeader("Authorization", $"{token}");

var msg = new DiscordMessage
{
content = "Test",
nonce = "78714914815023104",
tts = false
};
request.AddJsonBody(msg);
IRestResponse response = client.Execute(request);
var content = response.Content;
Console.WriteLine(response.StatusCode); // Unauthorized
Console.WriteLine(response.Content);
return content;
}

我可能做错了什么?

使用这个在github上非常流行的C#API可能更容易:https://github.com/discord-net/Discord.Net

从头开始编写授权可能会很痛苦。

花几分钟试试图书馆是值得的,也许它只是起作用。你会想阅读自述文件,因为还有4个附加的nuget包可能会让你感兴趣。

以下是使用Discord.NET 的解决方案

public DiscordWrapper(string token)
{
_token = token;
}
public async Task SendMessage()
{
_client = new DiscordSocketClient();
await _client.LoginAsync(TokenType.Bot, _token);
await _client.StartAsync();
// this is important
// found it here:
// https://github.com/discord-net/Discord.Net/issues/1100
_client.Ready += _client_Ready;
await Task.Delay(-1);
}
private async Task _client_Ready()
{
var guild = _client.GetGuild(7....3); // guild id
var channel = guild.GetTextChannel(79034....63); // channel id
await channel.SendMessageAsync("my_message");
Environment.Exit(0);
}

最新更新