База данных и ТГ бот

В статье пойдет речь о запуске платформы на базе Telegram бота, предназначенной для взаимодействия с самыми разными сервисами, например с GitHub и Яндекс.Метрикой.

Платформа позволяет создавать плагины для работы с каждым из них. Вы сможете в один клик настроить оповещения о коммитах, pull-реквестах, закрытии issues из каждого репозитория в нужный чат и установить внешний вид этих оповещений. Вы даже можете попросить бота присылать вам свежую статистику из Яндекс.Метрики в удобное для вас время. Мы в команде CodeX используем данное решение уже несколько месяцев и не представляем себе, как можно было работать без этого.

Для взаимодействия с ботом вы можете воспользоваться нашим облачным решением или установить бота самостоятельно на своем сервере.

Облачное решение

Запуск бота на своем сервере

Для запуска CodeX.bot вам потребуется выполнить следующие действия:

  • установить дополнительные библиотеки для языка Python
  • клонировать наш репозиторий с кодом бота
  • зарегистрировать нового бота в Telegram
  • отредактировать файл конфигурации

Установка дополнительных библиотек

CodeX.bot написан на языке Python с использованием некоторых дополнительных библиотек. Вам нужно установить их, прежде чем начать работу:

Telegram бот на python aiogram #7 База данных для бота sqlite

Клонирование репозитория с кодом

Клонировать репозиторий CodeX.bot можно выполнив команду:

git clone [email protected]:codex-team/codex.bot.git

Для работы системы вам понадобится создать Telegram бота. Просто следуйте инструкции из статьи или официального руководства.

Конфигурация

Теперь вам необходимо настроить конфигурацию системы. Для этого переименуйте директорию local.sample в local и отредактируйте содержимое файла config.py в соответствии с вашими предпочтениями:

SERVER_HOST — адрес вашего сервера. Если вы пользуетесь прокси ngrok, он будет выглядеть приблизительно так: ‘http://9b812f5d.ngrok.io’. LOCAL_SERVER_PORT — порт, на котором будет запущен ваш локальный сервер. LOGS_FILENAME — адрес файла для логов. По умолчанию равен ‘logs/logs.log’. SSL_CERTIFICATE — содержимое SSL сертификата сервера. По уполчанию равен None. API_TOKEN — токен вашего Telegram бота через которого будет работать система. TELEGRAM_CALLBACK_URL — адрес, по которому CodeX.bot будет обрабатывать все сообщения от Telegram. Например: ‘https://9b812f5d.ngrok.io/telegramcallback’.

Установка Telegram Webhook

Telegram позволяет установить webhook для ботов. Это нужно для того, чтобы при каждом сообщении, отправленном в чат с ботом, Telegram устанавливал соединение с вашим сервером и передавал ему JSON с текстом и сервисной информацией. Поскольку Telegram работает только по протоколу HTTPS, вам понадобится SSL сертификат. Если у вас есть доверенный сертификат, то ничего дополнительно настраивать не придется, в случае использования самоподписанного сертификата, его нужно будет отправить при установке вебхука.

Сгенерировать сертификат можно следующей командой:

openssl req -new -x509 -nodes -newkey rsa:1024 -keyout server.key -out server.crt

Далее, openssl предложит вам заполнить несколько полей информации, важно указать поле FQDN равное адресу хоста-callback’а.

Для установки вебхука можно воспользоваться пакетом python-telegram-bot для Python.

import telegram TOKEN = » HOST = » # Параметр FQDN сертификата должен совпадать с данным адресом PORT = 8443 CERT = ‘path/to/ssl/server.crt’ bot = telegram.Bot(TOKEN) bot.setWebhook(webhook_url=’https://%s:%s/%s’ % (HOST, PORT, TOKEN), certificate=open(CERT, ‘rb’))

К счастью, CodeX.bot сделает установку вебхука за вас, если в настройках ему передать соответствующий параметр. Например:

SSL_CERTIFICATE = open(«/path/to/ssl/server.crt», ‘rb’)

Структура файловой системы

В файле local/db.py содержатся настройки базы данных, где CodeX.bot хранит всю необходимую информацию. По умолчанию у вас будет использоваться SQLite.

В файле components/core.py вы можете найти несколько глобальных функций, которые используются всеми компонентами системы:

  • send_to_chat — отправка сообщений в Telegram чат.
  • generate_hash — генерация уникальных идентификаторов для пользователей и чатов.
  • bgcolors — для вывода отладочной информации в консоль.

В файле main.py содержится код запуска системы. Запуск выполняется в следующем порядке:

  • Подключение файла вывода логов.
  • Установка вашего сервера в качестве webhook для Telegram бота.
  • Загрузка плагинов, описанных в глобальной конфигурации.
  • Запуск веб-сервера, получающего оповещения от Telegram бота.
Еще по теме:  Как разместить Телеграмм бота на сервере

В файле modules/core/server.py находится код веб-сервера, который обрабатывает сообщения от Telegram и передает их нужным плагинам, вызывая у них метод telegram_command:

Разработчик плагина сам устанавливает какие команды обрабатывать. Например, модуль ответственный за Github оповещения принимает команду /github_start примерно так:

def telegram_command(self, message): if ‘/github_start’ in message.text: .

Плагин может самостоятельно принимать оповещения от сторонних сервисов в специальном методе set_rules:

def __init__(self): self.module_name = ‘github’ self.uri_prefix = ‘/github’ def set_rules(self, app): app.add_url_rule(‘%s/test’ % self.uri_prefix, ‘%s_test’ % self.module_name, test) app.add_url_rule(‘%s/’ % self.uri_prefix, ‘%s_callback’ % self.module_name, callback, methods=[«POST»])

Подробнее работу основных плагинов рассмотрим в следующей статье.

If you like this article, share a link with your friends

Read more

We talk about interesting technologies and share our experience of using them.

Источник: codex.so

Вступление

Заикнулся в присутствии нового коллеги о своем блоге, первый его вопрос был “что за блог?”, а второй “а телеграм канал у тебя есть?”. Поймал себя на мысли неужели я стал ретроградом. Когда начался хайп вокруг влогов и Youtube каналов я остался верен теплому ламповому формату текстовых статей, так и сейчас, считаю что нет необходимости иметь свой Telegram канал, но задача меня заинтересовала.

Вокруг Telegram ботов сейчас много шумихи, как завести своего бота или канал написано в официальной документации. Не хотелось делать что-то надуманное, только ради “попробовать” и я решил что более менее полезной задачей будет уведомление о новых статьях в этом же блоге и только потом понял, что в принципе, мою реализацию можно использовать для любой RSS ленты c небольшими правками под себя.

Обзор

  • Вступление
  • Наивная реализация или тупой бот
  • Используем простую БД или чуть более умный бот
  • Прикручиваем РСУБД или умеренно сообразительный бот
  • Заключение

Наивная реализация или тупой бот

Первое что нужно сделать это создать бота и получить API токен.

Недолго думая, я взял самую популярную либу-обертку для ботов Telegram — gem telegram-bot-ruby и наваял следующий код:

Что же тут происходит? Все очень просто, вот здесь:

require ‘rss’ require ‘telegram/bot’

подключаем библиотеки для работы с RSS и Telegram, а вот здесь:

token = ENV[‘TELEGRAM_BOT_API_KEY’]

Здесь я использую переменные окружения (Environment variables), чтобы это работало, перед запуском скрипта нужно выполнить в командной строке export TELEGRAM_BOT_API_KEY=123456789 , где вместо 123456789 нужно вставить собственно токен. Использование переменных окружения один из двенадцати факторов приложения согласно — Adam Wiggins

Затем, с помощью строчки:

rss = RSS::Parser.parse(‘https://doam.ru/feed.xml’, false)

сохраняем в объект rss всю RSS ленту моего блога (я точно знаю что у меня там только 10 записей, поэтому не боюсь никаких переполнений или задержек).

После этого мы создаем бот клиента, обходим каждый item внутри rss и отправляем его ссылку в канал Telegram.

Таким образом, при каждом запуске скрипта в канал будет отправляться 10 сообщений с одинаковыми ссылками. Я использую бота, хотя для такого же функционала, например, в Slack я бы использовал Incoming Hooks.

Кстати, чтобы бот мог слать сообщения в канал, его нужно добавить в администраторы этого канала.

На этом этапе я понял что нужно хранить состояние постов, т.е. запоминать информацию какие записи уже отправлены в канал, а какие еще нет.

Используем простую БД или чуть более умный бот

На самом деле новая версия бота растянулась на 55 строк кода, и вот он целиком:

Опять же приведу разбор этого кода по кусочкам далее по тексту.

require ‘telegram/bot’ require ‘rss’ require ‘sdbm’ require ‘json’ require ‘logger’

Я использую теже две библиотеки что и раньше rss и telegram , затем подключаю sdbm это встроенная либа Ruby, которая предоставляет простое хранилище типа ключ-значение (key-value), в качестве ключей или значений могут выступать только строки. Далее я подключаю json , чтобы легко кодировать объекты в строки и декодировать обратно. И еще одной библиотекой является logger , который предоставляет простой способ для отладки.

logger = Logger.new(STDOUT) if ENV[‘TELEGRAM_BOT_API_KEY’].nil? logger.fatal «Environment variable TELEGRAM_BOT_API_KEY not set!» exit 1 else token = ENV[‘TELEGRAM_BOT_API_KEY’] end rss = RSS::Parser.parse(‘https://doam.ru/feed.xml’, false)

Сперва делаем простые вещи, создаем объект для логирования и сетим переменную окружения.

Устанавливаем переменную окружения в этот раз мы чуть сложнее. Вначале мы проверяем что ENV пустая и если это так то выбрасываем ошибку через логгер и выходим из программы c использованием exit кода 1, в обратном случае, если переменная не пустая, записываем её значение в переменную, которую мы будем использовать в дальнейшем.

Парсинг RSS ленты происходит таким же образом как и ранее.

Еще по теме:  Как войти в Телеграмм если нет доступа в Телеграмм

SDBM.open ‘doam_posts.db’ do |posts|

Далее, этой строчкой мы открываем нашу базу данных, которая является просто файлами в нашей файловой системе, в случае если базы не существует она будет создана с нуля.

rss.items.each do |item| key = item.link.href title = item.title.content published = item.published.content # next if posts[key] if posts.has_key?(key) logger.info «Post exist in DB will not rewrite» else posts[key] = JSON.dump( title: title, published: published, sended: 0 ) end end

И после этого мы начинаем первый цикл: обходим все полученные rss итемы, записываем ссылки, заголовок и дату публикации соответственно в переменные key, title и published. Проверяем есть ли в нашей базе ключ с таким же значением как наш и если есть просто выводим в лог текст, что не будем ничего перезаписывать (это нужно только на этапе отладки, но вообще не обязательно), в обратном случае, если в базе нет записи с таким ключом мы генерируем json строку и записываем её в базу. В качестве ключа я выбрал URL, так как они обеспечивают уникальность, всегда написаны в одном регистре и латиницей.

Следующим шагом я создаю объект типа Hash и прохожусь по всем записям которые есть в базе. С помощью hash[k] = JSON.parse(v) я делаю парсинг строки значения и создаю вложенные хеши. Затем проверяю значение поля sended , если там 0 то генерирую текст и отправляю его в канал, после чего перезаписываю объект cо значением 1, чтобы не отправить эту же запись при следующем запуске.

На самом деле это не совсем рабочая версия кода, я почему-то не закоммитил тот момент когда довел работу с SDBM до ума. Можете попробовать сами понять что здесь не так.

Теперь уже я решил попробовать задеплоить мой код на Heroku и выполнить его там. С использоавнием раннера задач все получилось, да только вот Heroku не сохраняет файлы между запусками задачи (да и вообще). Так что мое решение с SDBM является быстрым и простым, но может быть использовано только как selfhosted.

Прикручиваем РСУБД или умеренно сообразительный бот

Пост становится довольно длинным, но вы же вместе сомной прошли все этапы разработки этого бота и уже в курсе дела, поэтому привожу код обновленной версии:

Здесь проделывается точно такая же работа: иницилизируются необходимые компоннеты, синхронизируется rss лента и локальная база данных и отправляются ссылки на записи которые числятся в базе как “неотправленные”. Только в качестве базы используется PostgreSQL и все это обернуто в класс и методы. Метод initialize выполняется при вызове метода new на объекте класса DoamTelegramBot , остальные методы нужно вызывать отдельно. И чтобы выполнить всё правильно, я создал каталог bin в который положил файл с именем doam_bot и содержимым:

В котором я указываю что для выполнения скрипта нужно использовать язык Ruby, подключаю созданный мной класс через файл app.rb , создаю объект telegram и передаю в него урл для парсинга и id канала, вызываю методы sync и send . После чего я заливаю код на Heroku и создаю периодическую задачу, например раз в сутки. И если за сутки появились новые записи то в мой канал придет уведомление, уже без моего содействия в автоматическом режиме.

Заключение

Полностью это маленькое приложение можно посмотреть у меня в gitlab (для этого нужно залогиниться в gitlab.com). Лицензия пока не указана, но она MIT, т.е. можете править и использовать в своих целях. Если будет время я хотел бы прикрутить еще несколько функций, например отправку не только в телеграм но и другие сервисы, а также решить проблему первого запуска, когда база наполняется новыми записями с флагом “не отправлено” но неизвестно точно какие записи уже были отправлены в канал. В любом случае готов рассмотреть ваши Merge Requests.

  • Поблагодарить автора
  • Telegram канал

Источник: doam.ru

Как запустить бот Telegram с PHP

Если вы читаете это, вы знаете, что чат-боты являются одной из самых больших технологических тенденций 2016 года.

Еще по теме:  В Телеграмме автоматически скачиваются файлы на телефон Айфон

Революция ботов — это не только искусственный интеллект. Бот может быть инструментом в вашем мессенджере с простым интерфейсом чата, который может использоваться для расширения функциональности сайтов или служб или даже может быть автономным приложением. Боты дешевле в разработке и проще в установке, а еще одна замечательная особенность заключается в том, что мессенджеры можно использовать на любом типе устройств — ноутбуках, смартфонах и планшетах. Вот почему сейчас все без ума от ботов.

И самый большой мессенджер с открытым API бота — Telegram .

Что мы будем делать

В этой статье мы создадим простой секундомер бота Telegram. Я покажу вам, как создать своего бота, подключиться к аналитике, написать некоторый код и, наконец, добавить своего бота в магазин ботов.

Создать бота с BotFather

Первым шагом к созданию бота является регистрация учетной записи вашего бота в Telegram. И для этого есть бот, который называется BotFather . Просто добавьте его в свой список контактов, и вы сможете создавать и настраивать ботов Telegram, просто набрав команду /newbot и следуя инструкциям BotFather.

BotFather работает Telegram

После регистрации вашего нового бота вы получите поздравительное сообщение с авторизационным токеном. В ближайшее время мы будем использовать этот токен для авторизации бота и отправки запросов в API бота.

Позже вы можете использовать BotFather для добавления описаний или фотографий в профили ваших ботов, регенерировать токены, устанавливать списки команд для использования, удалять учетные записи и так далее. Чтобы получить полный список команд, просто наберите /help в чате, чтобы получить список команд BotFather.

Подключитесь к Botan Analytics

В API Telegram Bots нет встроенной аналитики, но важно знать, сколько у вас пользователей, как они действуют и какие команды они запускают чаще. Конечно, мы можем собирать эту информацию, используя наш собственный движок, но если мы хотим сосредоточиться на функциональности ботов, а не на метриках, нам просто нужно использовать готовое решение.

И есть простой инструмент для подключения вашего бота к аналитике, который называется Botan . Он основан на яндекс AppMetric и полностью бесплатен. Используя Botan, вы можете сегментировать свою аудиторию, получать информацию о профилях пользователей, получать наиболее часто используемые команды и получать красивые графики прямо в своем мессенджере, например:

График Bot Analytics

Для начала вам нужно зарегистрировать своего бота в Botan и получить токен. И снова, вы можете сделать это с ботом, BotanioBot:

Регистрация бота в Telegram

Просто нажмите кнопку «Добавить бота» на диалоговой клавиатуре, введите ник своего бота, и вы получите токен бота. Теперь Botanio готов отслеживать ваши бот-события, и вы можете получать статистику по пользователям, сеансам, времени хранения и событиям прямо в своем мессенджере.

Создать и зарегистрировать SSL Webhook

В Telegram есть два способа получать сообщения от ваших пользователей: длинные опросы и веб-хуки.

Диаграмма API Telegram

По сути, при длительном опросе вам необходимо запрашивать новые сообщения у API, а при веб-крюках вы устанавливаете обратный вызов, который будет вызывать API Telegram, если новое сообщение поступит от пользователя. Я предпочитаю использовать webhooks, потому что это похоже на общение в реальном времени, поэтому в этой статье мы также будем использовать этот метод. Теперь нам нужно выбрать URL обратного вызова для нашего webhook, который должен быть достигнут по протоколу HTTPS, и нам нужно установить его действительно безопасным, поэтому спрячьте свой скрипт в секретном пути, как сказано в руководстве:

Если вы хотите убедиться, что запрос Webhook исходит от Telegram, мы рекомендуем использовать секретный путь в URL, например, https://www.example.com/ . Поскольку никто не знает маркер вашего бота, вы можете быть уверены, что это мы.

Если ваш сертификат SSL является доверенным, все, что вам нужно сделать, это открыть этот URL в вашем браузере:

https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]

В противном случае вы должны создать самозаверяющий сертификат. Вот пример команды для Linux для него:

openssl req -newkey rsa:2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj «/C=IT/ST=state/L=location/O=description/CN=yourdomain.com»

И не забудьте открыть порт SSL:

sudo ufw allow 443/tcp

Чтобы проверить сертификат и установить для своего домена webhook доверие, необходимо загрузить сертификат открытого ключа:

Источник: coderlessons.com

Рейтинг
( Пока оценок нет )
Загрузка ...