---
# System prepended metadata

title: news-telegram-bot

---

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