Telegram

Введение

Привет, друзья! Меня зовут Евгений, и сейчас я хочу вам показать мир Telegram ботов, используя Dokkur.

Это описание покажет вам, как создать простой echo-бот для Telegram с использованием WebHooks на Python и развернуть его на Dokkur в течение нескольких минут. Эти инструкции также дадут вам достаточно информации, чтобы использовать Dokkur наилучшим образом.

Мы создадим расширяемое приложение, так что если вы хотите, вы можете добавить свои собственные классы/рутинги. Несмотря на то, что приложение выполняет только echo-команду, она содержит основу для масштабирования. Это достигается наличием отдельного места для хранения классов, ресурсов и настроек.

Внимание! Из-за того, что бот довольно простой, он не покрыт тестами, но мы вам настоятельно рекомендуем использовать для этого py.test. Если вам нужна помощь в работе с тестами для ботов, то напишите нам, и мы вам поможем написать новый бот или обновить существующий.

Заметьте, что если вы не хотите копировать код отсюда, то вы можете склонировать GitHub репозиторий.

Итак, давайте начнем!

Убедитесь, что у вас уже есть:

  1. Dokkur аккаунт.
  2. SSH ключи, добавленные в ваш аккаунт.
  3. Python версии 2.7, установленный локально. - следуй инструкциям по установке на OS X, Windows, и Linux.
  4. Setuptools и Pip, установленные локально. Следуй инструкциям по установке Python (см. выше).
  5. Virtualenv, установленный локально. Выполни это с помощью команды pip install virtualenv.
  6. Аккаунт в Telegram.
  7. Банановый молочный коктейль, чтобы в конце отпраздновать свой успех (обязательно!).

Регистрируем бот в Telegram

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

Напиши:

/newbot

Бот попросит ввести name и identifier для твоего бота. После BotFather даст token, который будет использоваться позже в статье.

Пишем бот, используя Python

Создадим файл requirements.txt, который состоит из этой информации:

certifi==2016.2.28 
falcon==1.0.0
future==0.15.2
gunicorn==19.3.0
peewee==2.8.1
python-mimeparse==1.5.2
python-telegram-bot==4.3.2
six==1.10.0
urllib3==1.16
wheel==0.24.0

Мы определяем зависимости нашего бота, которые теперь можно установить, выполнив команду
pip install -r requirements.txt

Теперь нам надо создать папку app, а в ней две папки: classes и resources.

В папке app создадим файл settings.py и вставим туда эти строки:

import telegram
BOT_TOKEN = 'your_bot_token'
WEBHOOK_URL = 'your_dokkur_url/HOOK'
bot = telegram.Bot(token=BOT_TOKEN)

Вместо your_bot_token вставьте тот token, который присвоил BotFather нашему боту при регистрации.

Вместо your_dokkur_url мы позже добавим ссылку на приложение в Dokkur, когда создадим его.

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

В папке classes создаем файл chat.py и вставляем туда эти строки:

from ..settings import bot

class Chat(object):

def __init__(self, chat_id, text=''):
self.chat_id = chat_id
self.text = text

# main process method
def process(self):
bot.sendMessage(chat_id=self.chat_id, text=u"> {}".format(self.text))

Здесь мы только что создали класс Chat для работы с текстом, который бот будет возвращать обратно.

Давайте продолжим и создадим несколько файлов в папке resources: hook.py, main.py и set-webhook.py.

Файл hook.py должен содержать следующее:

import telegram
import json
import traceback
from ..classes import Chat

class HookResource(object):
def on_post(self, req, resp):
try:
body = req.stream.read()
body_decoded = body.decode("utf-8")
json_body = json.loads(body_decoded)

update = telegram.Update.de_json(json_body)

chat_id = update.message.chat.id
text = update.message.text

chat = Chat(chat_id, text)
chat.process()

except Exception as e:
traceback.print_exc()

В файл main.py вставим:

import falcon

class MainResource(object):
def on_get(self, req, resp, **params):
resp.body = u'hi, i\'m a bot'
resp.status = falcon.HTTP_200
resp.content_type = 'text/html'

И наконец, в файл set-webhook.py скопируем эти строки:

import falcon
from ..settings import WEBHOOK_URL, bot

class SetWebhookResource(object):
def __init__(self):
self.bot = bot

def on_get(self, req, resp, **params):
s = self.bot.setWebhook(WEBHOOK_URL)
if s:
resp.body = 'ok'
resp.status = falcon.HTTP_200
else:
resp.body = 'an error occured'
resp.status = falcon.HTTP_500

Отлично! Компоненты classes и resources готовы. Теперь мы создадим файл в папке app и назовем его main.py. В нем будет осуществляться импорт ресурсов, созданных нами ранее.

import falcon
from resources import HookResource, SetWebhookResource, MainResource

api = falcon.API()
api.add_route('/', MainResource())
api.add_route('/HOOK', HookResource())
api.add_route('/set_webhook', SetWebhookResource())

Наш бот почти готов. Теперь надо создать новое приложение на Dokkur.

Создаем новое приложение на Dokkur

  1. Отрой личный кабинет, перейди в раздел Personal apps (левое меню)
  2. Нажми на кнопку ⨁, чтобы открыть интерфейс New App
  3. Введи название приложения (Внимание! Используй только латинские буквы в нижнем регистре и цифры, например, myapp007), выбери доступный и подходящий инстанс для хранения, выбери шаблон Custom App и нажми на кнопку Create App.

Поздравляю! Ваше приложение создано. А сейчас надо его опубликовать, но сделаем это чуть позже.

Обновляем WebHook URL

Мы создали новое приложение на Dokkur, и теперь можно вставить ссылку вместо your_dokkur_url в файле settings.py.

Переходим в веб-версию Dokkur, выбираем только что созданное приложение в списке Personal Apps, переходим в секцию Domains, копируем url и вставляем в файл settings.py.

Устанавливаем Dokkur Toolbelt

На этом шаге вы должны установить Dokkur Toolbelt, что даст вам доступ к Dokkur Command Line Interface (CLI).

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

Публикуем Telegram бот на Dokkur

Чтобы опубликовать бот на Dokkur, нам надо создать файл Procfile со следующей строкой:

web: gunicorn app.main:api --workers 4

Добавим также файл runtime.txt и напишем там

python-2.7.10
Это установит, какую версию Python использовать.

Чтобы окончательно опубликовать ваш код на Dokkur, надо создать Git репозиторий:

git init
git add .
git commit -m 'Initial commit.'

Затем переходи к следующему.

  1. Перейди в раздел Settings, скопируй git url из секции Git URL.
  2. Перейди в Dokkur Toolbelt и запусти следующую команду:

    git remote add dokkur git_url
    Вместо git_url вставь ссылку, которую скопировал из веб-версии.

  3. Запушь свое приложение:
    git push dokkur master
    Если хочешь опубликовать в другую ветку, то:
    git push dokkur yourbranch:master

Ура! Твое приложение опубликовано! Перейди по ссылке yourappname.dokkurapp.com в браузере.

Если ты уже начал отмечать своим банановым молочным коктейлем, то заканчивай! Поторопился ты. Нам надо еще протестировать бот в Telegram.

Зайди в Telegram и открой час с BotFather. Нам ты найдешь ссылку на своего бота в Telegram. Перейди по ней и попробуй пообщаться с ботом.

Это должно выглядить примерно вот так:

Telegram Bot

Поздравляю! Теперь ты спокойно можешь выпить банановый молочный коктейль!

Спасибо за внимание. Если вдруг остались какие-нибудь вопросы, то не стесняйся и пиши мне на почту eugene@dokkur.com.