# news-telegram-bot [ToC] Использованные библиотеки: * axios * jsdom * node-fetch * telegraf Для работы с телеграмом используется библиотека **telegraf.js**. Для отправки GET запросов на сайты используются библиотеки **node-fetch.js** и **axios.js**. Для парсинга используется библиотека **JSDOM.js** > Для московского политеха ## Структура проекта ```graphviz digraph Structure { nodesep=1.0 node [fontname=Verdana fontsize=40] Project->{"index.js" app tmp} app->{"app.js" configs controllers news parsing posting} configs-> {"admins.json" "news.json" "statup.json"} controllers -> {newPost} newPost -> {" index.js"} news->{"news.js" "post.js"} parsing -> {"newsList.js" "newsParse.js"} posting -> {" index.js"} } ``` ## Project -> index.js Главный запускаемый файл. Не содержит логики, кроме запуска функции, импортируемой из app.js ## Project -> tmp Каталог для временных файлов. Ко временным файлам относятся файлы постов, которые отправляют админы ## Project -> app Каталог, содержащий все основную логику ## Project -> app -> app.js Файл, содержащий функцию start, которая запускает бота. Подключает все другие модули ## Project -> app -> config Каталог, содержащий файлы настроек ## Project -> app -> config -> admins.json Содержит список id админов ## Project -> app -> config -> news.json Содержит список новостей, которые уже были запощены ## Project -> app -> config -> startup.json Содержит токен для работы бота и id канала, в который нужно постить новости ## Project -> app -> controllers Каталог, который содержит сцены для telegraf ## Project -> app -> controllers -> newPost -> index.js Содержит сцену для обработки команды **/post**. Сначала используется обработчик, который пытается получить от пользователя файл с расширением **.md** или **.html** Далее запрашивается подтверждение. Если оно получено, то бот отправляет новый пост в канал ## Project -> app -> news Каталог, представляющий из себя модуль моделей новости и работы с ними ## Project -> app -> news -> post.js Содержит класс, который представляет из себя модель 1 поста бота ## Project -> app -> news -> news.js Содержит класс, который представляет из себя модель новости. Конструктор принимает полный текст новости, который был уже распаршен, обложку новости и вложения. Текст и вложения разбиваются на посты, учитывая ограничения телеграмма по кол-ву символов и вложений. Т.е. новость состоит из отдельных постов ## Project -> app -> parsing Каталог, представляющий из себя модуль загрузки и парсинга данных со сторонних сайтов В общем случае, алгоритм такой 1) Отправка запроса на сайт с помощью **node-fetch.js** 2) Получение ответа, который содержит html страницу 3) Построение DOM дерева (можно сказать, что эмуляция браузера) при помощи jsdom.js 4) Получение данных из DOM дерева при помощи работы с селекторами, как в браузере 5) Обработка полученных данных ## Project -> app -> parsing -> newsList.js Содержит функцию, возвращающую список **НОВЫХ** новостей. Так же содержит логику отслеживания уже запощенных новостей ## Project -> app -> parsing -> newsParse.js Содержит функцию загрузки и парсинга страницы новости. Возвращает объект, в котором есть ссылку на обложку новости, текст новости с форматирование в режиме HTML и вложения: изображения и документы ## Project -> app -> posting Каталог, представляющий из себя модуль постинга ## Project -> app -> posting -> index.js Содержит: * (PostNews) функцию постинга новости, принимающая на вход ссылку на новость * (PostNewNews) функцию проверки на наличие новых новостей и их постинга * (Start) функцию запуска цикла запуска функции PostNewNews раз в какой-то промежуток времени