Для автоматизации процесса сбора информации нам потребовался бот Discord, боту необходимо в определенное время писать команды и читать его ответы.
Для решения задачи другой бот не подходит, у Discord строгое ограничение на взаимодействие между ботами, выходом стала веб версия Discord, на которой нужно авторизоваться, открыть канал и написать команду.
Основная проблема - hCaptcha при первом открытии веб версии с нового IP, в нашем случае проект работает на хостинге и из инстурментов только SSH консоль ( нет возможности открыть браузер и пройти первую авторизацию).
Для решения этой задачи используем Node JS и Puppeteer (высокоуровневый API для управления браузерами на основе Chromium), выбор именно этого API обусловлен ограничениеми хостинга Node v16 и NPM v8, на других версиях есть другие варианты схожего ПО.
Структура программы:
Приложение (скрипт index.js) -- | HTTP сервер для чтения внешних команд -- | Браузер на основе Puppeteer
Состав файлов:
Файлы приложения:
- Основной файл приложения "index.js"
- Загрузка внешних команд, файл "handler/index.js"
- Команды для работы с веб сервером, файл "btncommands/web_comand.js"
Алгоритм работы приложения, файл "index.js":
1. Запуск приложения
1.1. Приложение открывает 3000 порт на адресе 127.0.0.1
1.2. Если порт занят, значит уже запущен другой экземпляр
1.3. Порт открыт - это первичный запуск. Продолжаем загрузку файлов с функциями
2. Загрузка внешних файлов с функциями "handler/index.js", файл содержит инструкцию как загрузить команды из файлов(в демо только 1 файл)
3. Запуск HTTP сервера на 3000 порту
4. Ожидание веб команд
Алгоритм подачи команды, файл "btncommands/web_comand.js"
1. Написать команду "type_bot" через веб запрос, вид команды "127.0.0.1:3000?task=type_bot"
2. Если не нужно проходить капчу, то после ввода команды браузер закроется
2.1. Если нужно вводить капчу, то браузер остается на той же странице и к странице можно обратиться через команды
- "127.0.0.1:3000?task=pageclick&cid=x_y" - щелкнуть мышкой по координатам
- "127.0.0.1:3000?task=pagescren" - сделать снимок экрана в локальной папке
- "127.0.0.1:3000?task=closepage" - закрыть браузер
2.2. Через команду pageclick нужно открыть капчу, выбрать нужные элементы и нажать кнопку подтверждения. Координаты элементов не меняются, их достаточно вычислить один раз.