# 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 раз в какой-то промежуток времени