GitHub – reboxer/discord-oauth2: Discord’s OAuth2 API wrapper.

Introduction

Discord allows you to create applications using their OAuth2 login socket and their API (Application Programming Interface). This is useful to create messaging channels, storing data, creating login-services and interacting with people using the Discord Application, providing utilities and entertainment. The Discord API is documented on the discord docs, which may be found here.

Class constructor

One parameter is passed to the class constructor:

Contributing

All contributions are welcome.

Discord oauth2 flow

Step 3, calling from axios, tried passing data as depicted below and JSON.stringified() always get a 400 error. Perhaps there are headers required?

{
“method”: “POST”,
“url”: “https://discordapp.com/api/oauth2/token“,
“data”: {
“client_id”: “#############6944”,
“client_secret”: “**********************************”,
“code”: “hOA6snQVHePUKB9eyjq2Bxf6CDusfz”,
“grant_type”: “authorization_code”,
“redirect_uri”: “https://stardust.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
}
}

2021-03-01T23:36:58.188Z ERROR Token for (hOA6snQVHePUKB9eyjq2Bxf6CDusfz, j349qxcnz5.execute-api.us-east-1.amazonaws.com/Prod, Request failed with status code 400) failed: %s

================================================================================================

const params = {
method: ‘POST’,
url: ${urls.oauthToken},
data: {
client_id: DISCORD_CLIENT_ID,
client_secret: DISCORD_CLIENT_SECRET,
code: code,
grant_type: ‘authorization_code’,
redirect_uri: COGNITO_REDIRECT_URI,
},
};
const response = axios(params).then(check)

Discord slash api?

Коротко о разнице в подходах между основным WebSocket-протоколом и Discord Slash API для тех, кто уже писал своих ботов, — на вебсокетах можно (и нужно) слушать все сообщения в чате, независимо от того, упоминали там вашего бота или нет. Это открывает широкие возможности для взаимодействия по сбору статистики, для модерирования контента, для описания взаимодействия с пользователями в свободной форме, даже без явного упоминания, и т. д.

Боты же, реализующие Discord Slash commands, получают в запрос только команду, написанную пользователем в специальном формате, но не слышат остальной трёп в канале. Эта разница отражена в названии взаимодействия — команда должна начинаться со слеша, и синтаксис выглядит привычным для многих мессенджеров — например, `/дай фотку:котика`.

Discord?

Discord — это многим известный мессенджер, бесплатный до определённых пределов. Он позволяет без особых технических навыков построить коммьюнити по какой-то теме. В основном, конечно, это геймерские сообщества, именно так себя Discord и позиционирует — встроенная функциональность для трансляции игр и прочие навороты.

Ими, впрочем, дело не ограничивается — на Хабре пробегали статьи про жизнь небольших контор в этом мессенджере, также там заседают алготрейдеры с «Реддита» и много кто ещё. В определённой степени эта популярность вызвана открытым API для написания ботов.

В настоящий момент существует два API для ботов на этой платформе. Одно, ставшее классическим, основано на вебсокетах. Второе Discord открыл в конце 2020 года — и им можно пользоваться на чистом REST.

Изначально я наткнулся на статью про Python и AWS, но просто скопировать её было бы слишком скучно для понимания и погружения, поэтому пришлось читать документацию самостоятельно.

Discord-oauth2

A really simple to use module to use discord’s OAuth2 API.

Events

In the Eris Library, client extends the events modules and the client is passed to the RequestHandler so it’s able to emit events, this modified RequestHandler extends events so it can emit the same events.

There are only two events, debug and warn.

Generateauthurl(object)

Dynamically generate an OAuth2 URL.

Takes an object with the following properties:

clientId: Your application’s client id. Can be omitted if provided on the client constructor.

prompt: Controls how existing authorizations are handled, either consent or none (for passthrough scopes authorization is always required).

scope: The scopes requested in your authorization url, can be either a space-delimited string of scopes, or an array of strings containing scopes.

redirectUri: Your URL redirect uri. Can be omitted if provided on the client constructor.

responseType: The response type, either code or token (token is for client-side web applications only). Defaults to code.

How to create an application

Creating an application is easy, simply follow these steps:

Installing

npm install discord-oauth2

Options

Since the module uses a modified version of Eris’s request handler, it takes the same options, all of them default to the default Eris REST options if no options are passed.

Request handler options:

Others, you can pass these options to the class constructor so you don’t have to pass them each time you call a function:

Overview

In this tutorial, I will teach you how to implement Discord Oauth in node.js. This tutorial is intended for people who have not used Discord Oauth before.

Revoketoken(access_token, credentials)

access_token: The access token to revoke.

credentials: The base64 encoded credentials string of your application.

Returns a promise which resolves in an empty object if successful.

Setting up a discord oauth2 login on my website (with php?)

So I’m having troubles learning how to set up a login through discord on my site. I’ve been browsing for literally hours and haven’t been able to find anything I understand…

At the moment, I have created the discord application, giving me a client ID and client secret, as well as a link back to my localhost:

https://discordapp.com/api/oauth2/authorize?client_id=550631359337594881&redirect_uri=http://localhost&response_type=code&scope=identify

At the moment I have it set up to redirect from a button to that URL, which then sends me to discord to accept. It then returns me to http://localhost?code=CODE_HERE

However, I don’t know what I am supposed to do with this code. I am trying to set it up so that it will show the person’s username with hashtag thing, and their profile picture.

I am currently using HTML, CSS, JS, and PHP on the site, but I think I might need to use something else, but I don’t know how to set that up, or what it is I need. I am running my local server with XAMPP. I’d prefer if it is just PHP, but I’m open to other options.

Does anyone know how I can convert the code to a username image?

Thanks in advance!

Tokenrequest(object)

Takes an object with the following properties:

clientId: Your application’s client id. Can be omitted if provided on the client constructor.

clientSecret: Your application’s client secret. Can be omitted if provided on the client constructor.

scope: The scopes requested in your authorization url, can be either a space-delimited string of scopes, or an array of strings containing scopes.

redirectUri: Your URL redirect uri. Can be omitted if provided on the client constructor.

grantType: The grant type to set for the request, either authorization_code or refresh_token.

code: The code from the querystring (grantType authorization_code only).

What can an application do?

  • Use your Discord account to safely login to your guild’s website
  • Display who’s online or in-game on your website or forum
  • Automatically join private Discord servers or gain new roles based on external website permissions
  • Other neat things.

Yandex cloud functions

Я не буду подробно останавливаться на описании интерфейса консоли Yandex Cloud. Типичный жизненный цикл Serverless-функций — это обрабатывать входящие обращения, иногда уже отсортированные Gateway API, и отдавать результат. Биллинг потом спишет копеечку за время работы функции.

Отдельно оговорюсь, что в интернете я наткнулся на интереснейшее обсуждение реализации бота на стандартном для Discord WebSocket-протоколе, который завязывался на Amazon API Gateway, умеющем преобразовывать каждое WebSocket-сообщение в отдельный вызов Serverless-функции.

Итак, в консоли Yandex Cloud создаём новую функцию, среда выполнения — Node.js 14, время выполнения — 3 секунды (про него объясню позднее), доступная память — минимальная — 128 МБ.

Начинаем писать мало-мальски работающий код:

Базовый сценарий:

Начнём с простого — заставим эту связку минимально работать. Нужно отвечать на команду /дай с параметром фотку:<тип> соответствующей картинкой. Варианта будет три — котик, собакен или случайная из двух.

Новый план!

Если делать всё по-взрослому — такой запрос от функции к функции следует передавать, используя брокер сообщений или другие механизмы, которые могут служить триггером для функций в облаке. Мне показалось, что для такого простого и нетребовательного проекта это уже слишком, можно обойтись запросом POST в один конец, не дожидаясь его результата.

Я не был уверен, успеет ли этот запрос отработать, не оптимизирует ли его какой-то из внутренних механизмов облака, — но нет, вполне себе рабочий вариант. Конечно, мы не узнаем, дошёл ли запрос и как был обработан — но, повторюсь, на практике в этом месте проблем у меня не возникло или они были пренебрежимо малы.

Итоги

Главный вопрос, который может возникнуть при прочтении: «Зачем?».

Я отвечаю на него: «Чтобы не следить за сервером». Как только Yandex Cloud добавит в Gateway API возможность удержания WebSocket-сообщений — я попробую переписать и WebSocket-бота (который начинает спамить котиками при слишком бурном и не очень цензурном общении в чате) на Serverless.

Иногда нужен контроль, иногда страшно, что функция слишком бодро масштабируется, иногда есть виртуалка, на которой вполне хватит места на ещё-один-докер-с-js-процессом-внутри. Но рано или поздно за этим придётся следить — переносить процесс, данные, добавлять мониторинг, обновлять систему, наконец.

Кстати, про «дёшево» — это, как правило, второй возникающий вопрос. Посчитаем по прайсу.

При тарификации вычислительных ресурсов (ГБ × час) учитывается объём памяти, выделенный для функции, и время выполнения функции. 

На июль 2021 г. 1 миллион вызовов стоит 10 ₽, ГБ*час стоит 3,42 ₽, а исходящий трафик — 0,96 ₽ за гигабайт.

Среднее оплачиваемое время выполнения этих функций (из отчёта Yandex Cloud):

Медленная функция: 1200 мсБыстрая: 200 мс

Итого: 1,4 с на обработку одного запроса.

Прикинем стоимость миллиона котиков:

3,42 × (128 / 1024) × (1200 / 3600 / 1000) × 1 000 000 10 × (1 000 000 / 1 000 000) = 152,5 ₽

Но — приятный подарок — первый миллион запросов, первые 10 ГБ × час в месяц и первые 10 ГБ исходящего трафика не тарифицируются.

Из моей личной практики (на канале в 400 человек, где у бота есть клуб преданных фанатов): он ни разу не вышел в платный режим. Даже с учётом вакханалии на 1 апреля, когда он показывал, а затем оперативно удалял чуть-чуть NSFW-шные картинки, которые «случайно» попали в его базу.

Для меня это уже не первый раз, когда Serverless-решение оказалось дешевле, но главное — гораздо проще в поддержке , чем стандартный подход.

Неважно, что вы делаете — планировщик задач, торгового бота или такой проект на коленке, — прежде чем писать ещё_один_демон_за_которым_надо_следить, подумайте, возможно Serverless подойдёт вам больше.

Хорошей пятницы!

Похожее:  Магазин аккаунтов VK [АКТИВ] ВЫСОЧАЙШЕГО качества! ТОП категории в наличии! ✅15-17 | 18-25 | 25-60 | Москва 18-30✅

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *