CoderCastrov logo
CoderCastrov
Парсинг

Парсинг каналов Discord

Парсинг каналов Discord
просмотров
2 мин чтение
#Парсинг

Введение

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

Discord

Недавно я подписался на канал Discord и хотел бы получать уведомления в Telegram, когда появляется новое сообщение. Причина использования прокси от Discord к Telegram заключается в том, что я чаще проверяю Telegram. Кроме того, канал Discord доступен только для подписчиков, и я хотел бы автоматически делиться сообщениями, которые я получаю, в Telegram Group с моими друзьями.

Я начал с чтения документации на веб-сайте https://discord.com/developers/docs/resources/channel. Документация была предназначена исключительно для Discord Bots. Проблема заключалась в том, что я не мог добавить своего бота в канал Discord, который я хотел парсить. Это оставило мне только один вариант - использовать свою учетную запись, хотя существует риск ее блокировки (https://support.discord.com/hc/en-us/articles/115002192352-Automated-user-accounts-self-bots-).

С чего начать: веб-приложение или приложение для настольного компьютера?

Я вспомнил, что у Discord есть веб-приложение, и с использованием Google Chrome всегда проще отслеживать вкладку сети с помощью встроенных в него инструментов разработчика. После входа в систему я перешел в канал, который хотел спарсить. Во вкладке сети отображаются следующие запросы. messages?limit=50 кажется немного интересным. При нажатии на него отображается json-ответ, отправленный сервером.

Response from discord API

Кажется, это то, что мы ищем! Если мы сможем повторить этот эндпоинт и получить ответ, то мы можем быть достаточно уверены, что парсинг будет работать.

Для этого нам нужно посмотреть, что отправляется на сервер Discord при отправке запроса. Мы видим, что эндпоинт /api/v8/channels/<channelID>/messages?limit=50 запрашивается с некоторыми дополнительными заголовками. Authorization: mfa._Xf1ZjwM31.... похоже на то, что обычно используют веб-серверы для аутентификации пользователя.

Request headers sent to API

Создадим простую команду curl, чтобы попробовать ее протестировать. И действительно, мы получаем ответ, содержащий json-объект с последними сообщениями!

curl https://discord.com/api/v8/channels/<channelID>/messages?limit=50 -H "Authorization: mfa._Xf1ZjwM3l..."

Следующим шагом будет настройка планировщика, который будет запускаться каждую минуту или около того, чтобы опрашивать эндпоинт. Логика получения последнего сообщения проста. Мы сохраняем локальную переменную последнего идентификатора latestId. Сравнивая первый элемент в json-ответе response[0].id, если есть несоответствие, мы знаем, что сообщение новое. Затем мы обновляем latestId с response[0].id и продолжаем опрос.

Ограничения

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

В будущем может измениться API-точка входа, но на данный момент я очень доволен этим простым подходом.