Чего я хочу достичь:
Я хочу отправлять сообщения на канал Discord всякий раз, когда console_app.exe запускается внешней программой, поэтому я решил использовать чистый отдых:
Я создал приложение через https://discord.com/developers/applications
У меня есть 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;
}
Что я могу делать неправильно?
@sunero4 Я пробовал такие прицелы, как bot
identify bot
, но ни один из них не работал :/
@Axelly Это приложение или бот? Документы Discord API различают их. Вы хотите отправить сообщение от имени пользователя? Или вы хотите отправить сообщение как бот?
@jandrew Мне нужно что-нибудь, что позволит мне запустить мое консольное приложение, и оно отправит сообщение на канал - что мне попробовать использовать? бот или приложение?
Вы можете попробовать использовать Fiddler, чтобы изучить отправляемый вами запрос. Может быть, посмотрев на сам запрос, вы сможете понять, не упущено ли что-то.
Вы можете отправить сообщение, используя другие средства, чтобы попасть в API Discord? Такие инструменты, как Почтальон, могут помочь вам убедиться, что ваши ключи/токен работают, прежде чем вы попытаетесь выполнить их в консольном приложении.
из документов видно, что вы должны подключиться к шлюзу, прежде чем публиковать сообщение. Я полагаю, вы сделали это где-то еще?
@timur нет, не делал, это весь код. Спасибо. Я попробую это в ближайшее время
Возможно, будет проще использовать этот C# API, который довольно популярен на github: https://github.com/discord-net/Discord.Net
Написание авторизации с нуля может быть болезненным.
Стоит потратить несколько минут, чтобы попробовать библиотеку, возможно, она просто работает. Вы захотите прочитать файл readme, так как есть 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);
}
Возможно, вы запрашиваете что-то, выходящее за рамки ваших возможностей? Если вашей единственной областью действия является «определение соединений», я думаю, это может быть проблемой.