Парсинг каналов Discord
Введение
Стандартным способом использования 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-ответ, отправленный сервером.
Кажется, это то, что мы ищем! Если мы сможем повторить этот эндпоинт и получить ответ, то мы можем быть достаточно уверены, что парсинг будет работать.
Для этого нам нужно посмотреть, что отправляется на сервер Discord при отправке запроса. Мы видим, что эндпоинт /api/v8/channels/<channelID>/messages?limit=50
запрашивается с некоторыми дополнительными заголовками. Authorization: mfa._Xf1ZjwM31....
похоже на то, что обычно используют веб-серверы для аутентификации пользователя.
Создадим простую команду 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-точка входа, но на данный момент я очень доволен этим простым подходом.