Граббер новостей для сайта университета ДонНТУ. Предоставляет простой 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.
Согласно рейтингу 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-сервер.
-
Установите NodeJS (если он еще не установлен, иначе перейдите к пункту 3), скачайте его с оф. сайта
-
Откройте терминал (консоль) и введите такие команды для проверки (символ
$
- приглашение командной строки):
$ node -v
// тут будет написана версия NodeJS
$ npm -v
// тут будет написана версия NPM
Если будет сообщение об ошибки, например команда не найдена или что-то в этом роде, то дальнейшие шаги выполнять бессмысленно. По гуглите эту проблему и после того как ее решите переходите на следующий шаг.
- Склонируйте репозиторий или скачайте архив с исходным кодом, если у вас не установлен Git и перейдите в корневой каталог проекта.
$ git clone https://github.com/Yegorov/donntu-telegram.git
$ cd donntu-telegram
- Установите все переменные окружения:
- для Windows:
$ set MY_ENV_VAR=value
- для Linux:
$ export MY_ENV_VAR=value
Приложение использует такие переменные окружения:
HOST
, по умолчанию: localhostPORT
, по умолчанию: 3000NODE_ENV
: по умолчанию: developmentMYSQL_CONNECTION_STRING
(!) используется только при NODE_ENV=production (mysql://user:pass@host:port/db)SECRET_UPDATE_PATH
, по умолчанию: updatedbADMIN_USERNAME
(!) для запуска граббераADMIN_PASSWORD
(!) для запуска граббераTELEGRAM_BOT_TOKEN
, если не указано, то бот отключен
- Установите все зависимости (фреймоворки, библиотеки, которые использует проект). Для этого выполните команду:
$ npm install
// Ход установки
- Запустите приложение. Для этого выполните команду:
$ 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
-
Откройте браузер и перейдите по адресу, который будет написан в терминале.
-
Перейдите по адресу
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
Больше изображений БД, можно найти здесь
- Docs NodeJS
- Docs NPM
- Node.js для начинающих
- Node Hero - Getting Started With Node.js Tutorial
- A Beginner’s Guide to npm — the Node Package Manager
- Promise
- JavaScript Promises: an Introduction
- «Грабим» с помощью Node.js
- Node, Postgres, and Sequelize
- Sequelize, the JavaScript ORM, in practice
- Creating An AngularJS Application With Sequelize – Part 1
- Docs Bower
- Bower: зачем фронтенду нужен менеджер пакетов
- Bower — подробное руководство
- How it feels to learn JavaScript in 2016
А также Telegram Bot API:
Приложение распространяются по лицензии GPL.
Приложение поставляется по принципу "AS IS" ("как есть"). Вы используете данное программное обеспечение на свой страх и риск. Автор не несет ответственности за любой причененный вред данным приложением.
License (GPL) Copyright (c) 2016 Yegorov A.
Вы можете прислать Pull-request, если хотите внести свой вклад в проект.
Свои вопросы вы можете задать здесь. Также можете написать свой вопрос на yegorov0725@yandex.ru