Skip to content

Backend (grabber news, events from DonNTU) for Telegram Bot

License

Notifications You must be signed in to change notification settings

Yegorov/donntu-telegram

Repository files navigation

DonNTU Telegram

Описание

Граббер новостей для сайта университета ДонНТУ. Предоставляет простой HTTP API для получения новостей и событий. На основе этого бекенда сделан бот для мессенджера Telegram.

Особенности

  • позволяет просматривать новости, события из сайта ДонНТУ.
  • простой и не навязчивый дизайн сайта, выполненый в стиле Material.
  • реализован простой HTTP API.
  • реализован бот для мессенджера Telegram.
  • при обращении на сайт, API или к боту осуществляется запрос к своей БД, т. е. данные будут доступны даже когда сайт ДонНТУ может не работать.
  • добавление новостей производится по запросу на сайт с использованием HTTP Basic Authentication.
  • легко разворачивается на облачной платформе (PaaS).

Средства разработки (платформа, фреймворки, библиотеки)

В качестве платформы выбрана NodeJS, которая основана на JS-движке V8 (на котором работает Chrome). Главная особенность NodeJS, это асинхронное API для работы с сетью и файловой системой.

В качестве веб-фреймворка, был выбран Express (гибкий, минималистичный фреймворк), шаблонизатор Pug бывший (Jade), Bower для управления front-end зависимостями

Стоит отметить следующие библиотеки:

  • cheerio - предназначена для манипуляции с HTML (реализация jQuery для сервера)
  • request - простой HTTP клиент
  • sequelize - ORM для NodeJS, основана на обещаниях, поддерживающая такие СУБД: PostgreSQL, MySQL, MariaDB, SQLite and MSSQL.
  • moment - предназначена для манипуляции с датой
  • telegram-bot-api - простая Promise-обертка над Telegram Bot API

и другие, которые находятся в файле package.json, в секциях dependencies, devDependencies.

Почему JavaScript (NodeJS)?

Согласно рейтингу Github, наиболее популярный язык программирования по количеству создаваемых проектов - JavaScript. Т. е. на сегодняшний день (ноябрь 2016) NodeJS с языком JavaScript являются самыми передовыми технологиями, которые определили сами разработчики Open Source сообщества. К тому же NodeJS используется обычно в стартапах.

Также хотелось закрепить опыт в: JavaScript (последний большой/реальный проект на этом языке был VKManager), асинхронном программировании, проектированию реляционной БД и использование ее с помощью асинхронной ORM и конечно же разобраться в Telegram Bot API (в котором уже несколько раз внесли новые изменения)

Развертывание проекта

Так как проект получился очень большой, что не является хорошой практикой и его можно было бы разбить как минимум на три независимых проекта: граббер новостей, сайт для просмотра новостей с HTTP API и бот для Telegram. Но что сделано, то сделано и этим нужно как-то уметь пользоваться (даже через время и я могу забыть все тонкости настройки).

При развертывании локально, естественно не будет работать бот, так как он использует webhooks (события обновлений от Telegram), представленные в виде обычного POST-запроса на сайт. Почему? Как Telegram может отослать запрос на адрес https://localhost/?

Тут две проблемы:

  • домен localhost нужно как-то подписать SSL-сертификатом (Telegram использует только HTTPS-соединение), но Telegram разрешает использовать самоподписной сертификат

  • к домену localhost нельзя обратиться из Интернета. Он используется для обращения к самому себе (loopback).

При разработке в качестве СУБД использовалась SQLite (легковесная, встраиваемая СУБД). Это конечно является плюсом, так вам не нужно устанавливать MySQL-сервер.

Развертывание проекта локально

  1. Установите NodeJS (если он еще не установлен, иначе перейдите к пункту 3), скачайте его с оф. сайта

  2. Откройте терминал (консоль) и введите такие команды для проверки (символ $ - приглашение командной строки):

$ node -v
// тут будет написана версия NodeJS

$ npm -v
// тут будет написана версия NPM

Если будет сообщение об ошибки, например команда не найдена или что-то в этом роде, то дальнейшие шаги выполнять бессмысленно. По гуглите эту проблему и после того как ее решите переходите на следующий шаг.

  1. Склонируйте репозиторий или скачайте архив с исходным кодом, если у вас не установлен Git и перейдите в корневой каталог проекта.
$ git clone https://github.com/Yegorov/donntu-telegram.git
$ cd donntu-telegram
  1. Установите все переменные окружения:
  • для Windows: $ set MY_ENV_VAR=value
  • для Linux: $ export MY_ENV_VAR=value

Приложение использует такие переменные окружения:

  • HOST, по умолчанию: localhost
  • PORT, по умолчанию: 3000
  • NODE_ENV: по умолчанию: development
  • MYSQL_CONNECTION_STRING (!) используется только при NODE_ENV=production (mysql://user:pass@host:port/db)
  • SECRET_UPDATE_PATH, по умолчанию: updatedb
  • ADMIN_USERNAME (!) для запуска граббера
  • ADMIN_PASSWORD (!) для запуска граббера
  • TELEGRAM_BOT_TOKEN, если не указано, то бот отключен
  1. Установите все зависимости (фреймоворки, библиотеки, которые использует проект). Для этого выполните команду:
$ npm install
// Ход установки
  1. Запустите приложение. Для этого выполните команду:
$ npm start
// Вывод лога, например
// App launch on http://localhost:3000

Возможно в Windows будет ошибка связанная с миграцией БД, это можно решить двумя способами:

  • в файле package.json изменить строчку "postinstall": "bower install && sequelize db:migrate --url=$MYSQL_CONNECTION_STRING" на "postinstall": "bower install && sequelize db:migrate"

  • запустить миграцию вручную командой: node_modules\.bin\sequelize db:migrate

  1. Откройте браузер и перейдите по адресу, который будет написан в терминале.

  2. Перейдите по адресу http://localhost:3000/updatedb для добавления новостей в БД.

Скриншоты приложения находятся здесь

Развертывание проекта на Dokkur

Dokkur – молодой PaaS из России (подробнее на Хабре), достойная альтернатива Heroku.

Поддерживаемые языки:

  • Ruby
  • JavaScript (NodeJS)
  • Clojure
  • Python
  • Java
  • Scala
  • PHP
  • Go

Поддерживаемые БД:

  • SQLite
  • CouchDB
  • Elasticsearch
  • MariaDB
  • Memcached
  • Mongo
  • MySQL
  • Nats
  • Postgres
  • RabbitMQ
  • Redis
  • RethinkDB

На оф. сайте есть даже документация на русском языке

Цены на использование сравнительно нормальные.

Тариф XS подходит для начального развертывания проекта, имеет такие характеристики:

  • 256 MB RAM
  • 25% от 1 CPU Core
  • 1 GB встроенной памяти SSD
  • Безлимитный трафик
  • Бесплатный SSL для домена yourapp.dokkurapp.com
  • 1 бесплатная БД

Цена в месяц: 1$ ≈ 26 UAH ≈ 65 RUB. Бесплатных тарифов нет, но как сказали в тех. поддержки блокировать аккаунт при отрицательном счете (до -100$) не будут. Оперативная тех. поддержка, общение происходит в чате (история сохраняется, а если пользователь вышел недождавшись ответа, то пересылается на почту).

Пошаговое описание развертывания приложения в PaaS Dokkur, можно найти здесь

Описание структуры проекта и схема БД

Структура проекта:

│   .gitignore
│   app.js
│   bower.json
│   LICENSE
│   package.json
│
├───api
│       index.js
│
├───config
│       config.json
├───docs
│   └───img
│       app_img.md
│       db_img.md
│       dokkur_deploy.md
│
├───grabber
│       additionToDB.js
│       index.js
│
├───migrations
│       20160926162914-create-news.js
│       20160926170033-create-tags.js
│       20160926170115-create-updates.js
│       20160926175643-create-tags-in-news.js
│       20161007213851-create-events.js
│
├───models
│       events.js
│       index.js
│       news.js
│       tags.js
│       tags_in_news.js
│       updates.js
│
├───public
│   ├───images
│   │       donntu-telegram.png
│   │
│   └───stylesheets
│           style.css
│
├───routes
│       apiV1.js
│       index.js
│       telegram.js
│
├───telegram
│       index.js
│
├───test
│       test.js
│
└───views
        error.pug
        index.pug
        layout.pug
        page.pug

Схема БД:

schema_db

Больше изображений БД, можно найти здесь

Ссылки

А также Telegram Bot API:

Лицензия

Приложение распространяются по лицензии GPL.

Приложение поставляется по принципу "AS IS" ("как есть"). Вы используете данное программное обеспечение на свой страх и риск. Автор не несет ответственности за любой причененный вред данным приложением.

License (GPL) Copyright (c) 2016 Yegorov A.

Сотрудничество и вопросы

Вы можете прислать Pull-request, если хотите внести свой вклад в проект.

Свои вопросы вы можете задать здесь. Также можете написать свой вопрос на yegorov0725@yandex.ru

About

Backend (grabber news, events from DonNTU) for Telegram Bot

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published