12 December 2018

Очень простой чат-бот для Telegram для самых маленьких

Rusonyx corporate blogPythonCloud computingCloud servicesMicroservices


Есть 100500 способов и инструментов создать простого serverless чат-бота для телеграм. А наш все-равно будет проще, хотя бы по числу кликов в интерфейсе. Сам бот будет написан на Python, а выполнятся будет на serverless движке Swifty.

Как и всегда в наших гайдах, никаких особых знаний питона или других языков программирования вам не потребуется. Нужно лишь умение запустить кое-что в командной строке. Если вы находитесь в России, то еще и VPN на вашем компьютере, так как потребуется достучаться до сервера телеграм.

Пока все стандартно — зарегистрируйте бота


Чтобы создать нового бота, нужно попросить другого бота это сделать. Откройте телеграм и найдите там бота @BotFather или откройте ссылку. Далее, наберите /newbot и следуйте инструкциям БотПапы. Для минимальной настройки вам нужно только дать боту display name и username. После создания бота вам будут выданы access token и URL. Сохраните их где-нибудь.

Бот


Для начала вам нужно зарегистрироваться в Swifty — нашей серверлесс платформе. Сделать это можно здесь. Затем зайдите в панель управления и сделайте следующее:

  1. Нажмите Functions -> New Function. Перейдите на вкладку From repo (Templates) и выберите репозиторий github.com/swiftycloud/swifty.demo, если он не выбран по-умолчанию. Это наш собственный репозиторий, в котором мы храним шаблоны функций.
  2. Выберите шаблон Simple Telegram Chatbot (python) и нажмите Next.
  3. Введите имя своего бота, например, swifty_bot (далее я буду использовать это название для ее обозначения) и нажмите Create.

Чтобы телеграм мог позвать функцию бота, нужно создать ей API ссылку. Перейдите на вкладку Triggers, нажмите Add Trigger -> REST API (URL). Сохраните получившуюся ссылку.

Затем, вам нужно дать функции бота доступ к access token, который вы получили от telegram. В Swifty есть специальная сущность — Account, которая позволяет безопасно хранить любые данные, например, связки логин-пароль или токены.

  1. Выберите Accounts -> Create Account. Используйте тип Telegram API, имя SWIFTYBOT (именно в uppercase) и токен, который вы получили от telegram.
  2. Выберите Functions -> swifty_bot -> Access -> Add. Выберите Accounts и аккаунт SWIFTYBOT. Теперь ваша функция имеет безопасный доступ к вашему access token.

Update. Обратите внимание! Имя SWIFTYBOT для аккаунта прописано в коде функции вот здесь:

BASE_URL = "https://api.telegram.org/bot{}".format(os.getenv('ACC_TELEGRAMSWIFTYBOT_TOKEN'))

Если вы хотите использовать другое имя аккаунта, то вам нужно поменять его и в коде функции. Например, если имя вашего аккаунта MYOWNBOT, то ваш код будет выглядеть так:

BASE_URL = "https://api.telegram.org/bot{}".format(os.getenv('ACC_TELEGRAMMYOWNBOT_TOKEN'))

Как формируется имя переменной окружения ACC_TELEGRAMMYOWNBOT_TOKEN, через которую функция получает свойство аккаунта, ровно как и любого другого ресурса в Swifty? Здесь:

  • ACC — идентификатор, что вы хотите обратиться к ресурсу типа Account;
  • TELEGRAM — тип аккаунта;
  • MYOWNBOT — имя аккаунта;
  • TOKEN — свойство аккаунта;

Код получившейся функции:

import json
import os
import sys
import requests

BASE_URL = "https://api.telegram.org/bot{}".format(os.getenv('ACC_TELEGRAMSWIFTYBOT_TOKEN'))

def Main(req):
    try:
        data = json.loads(req.body.encode())
        message = str(data["message"]["text"])
        chat_id = data["message"]["chat"]["id"]
        first_name = data["message"]["chat"]["first_name"]

        response = "Please /start, {}".format(first_name)

        if "start" in message:
            response = "Hello {}! Type /help to get list of actions.".format(first_name)
            
        if "help" in message:
            response = "/about - get information about Swifty"
            
        if "about" in message:
            response = ("Swifty is the serverless platform that allows startups, developers and enterprises to develop and run application backend with minimal time-to-market, costs and without infrastructure management.\n"
                                "Start creating your backend at\n"
                        "https://swifty.cloud")

        data = {"text": response.encode("utf8"), "chat_id": chat_id}
        url = BASE_URL + "/sendMessage"
        requests.post(url, data)

    except Exception as e:
        print(e)

    return {"statusCode": 200}, None

Это простейший бот, который умеет отвечать на команды /start, /help и /about. Можете также добавить любые свои команды и расширить его функционал по-желанию.

Подключаем функцию к боту


Теперь вам нужно сказать телеграму, по какой ссылке находится ваш бот. Вам нужно открыть командную строку и выполнить в ней следующую команду. При этом YOUR_API_URL нужно заменить на API ссылку, которую вы скопировали ранее, а YOUR_ACCESS_TOKEN на токен.

curl -XPOST https://api.telegram.org/botYOUR_ACCESS_TOKEN/setWebhook?url=YOUR_API_URL


Если все прошло хорошо, то вы увидите примерно следующее:

{
  "ok": true,
  "result": true,
  "description": "Webhook was set"
}

Если вы находитесь в России, то все пройдет хорошо только в том случае, если у вас включен VPN.

Можно проверять


Найдите в telegram бота с вашим именем и попробуйте выполнить пару команд, например, /start или /about. Если все работает — поздравляем. Если нет — пожалуйтесь здесь в комментарии или в нашем slack канале.

Как работает такой готовый бот можно посмотреть, если найти в телеграме нашего бота с именем swifty_test_bot. Спасибо.

Make your ideas come app, как говорят в swifty.cloud.
Tags:rusonyxserverlesstelegrampythonbotчат-ботчат-боты в телеграм
Hubs: Rusonyx corporate blog Python Cloud computing Cloud services Microservices
+18
29.4k 217
Comments 20