Это статья том, как создать свой телеграмм бот на базе farmework Django.
Пошагово, начиная с выбора платформы размещения, обоснования причин такого выбора, разворачивания проекта django и так далее.
Итак начнем с выбора метода общения с ботом. Существует два метода обмена сообщениями меду вашим сервером и ботом.
Один из них называется polling - когда ваш сервер будет опрашивать Телеграмм в бесконечном цикле. Большинство обзоров, о том как создать бота, используют именно этот метом общения с Телеграмм.
Второй это web hook - когда сам Телеграмм оповестит ваш сервис, в случае активности в вашем чат боте. И отправит вам request.
Мне нравится больше второй метод. Не вижу смысла постоянно дергать Телеграм и тратить ресурсы своего сервера.
Для построения своего бота буду избегать использования новомодных библиотек типа telegram_bot, *gram и прочие. Для общения буду использовать Bot API.
Так с методом определились. Теперь определимся где разместить свой север. Для того что бы Телеграм бот достучался до вашего сервера вам нужен выделенный IP адрес. Который можно арендовать у вашего провайдера.
Рассмотрим это на на моем примере. Аренда выделенного IP, у моего домашнего провайдера на момент публикации статьи, составляет 200 руб. в месяц. Не говоря уже о том, что потребуется железо, где необходимо разместить ваш проект. И если вы решите использовать свой домашний комп для размещения вашего приложения, то вам придется держать его постоянно включенным. Поэтому этот вариант я отмел.
И остановился на аренде виртуального сервера. Стоимость аренды в месяц сервера с выделенным IP, поддержкой 24/7 составляет 166 руб. в месяц. Это самое конкурентное предложение на это момент на рынке, на момент публикации статьи.
Кстати поддержка мне очень понадобилась. Сам новичок в деле настройки серверов, поэтому возникали часто проблемы в настройке сервера, в решении которых мне помогла техническая поддержка.
Плюс там там сразу куча сервисов под рукой. Домены, ДНС, Сертификаты (они кстати вам понадобятся) и так далее.
Мое мнение - поднимать бота на своем компе смысла нет.
Развернем проект Django и настроем сервер.
Развернул VPS - виртуальный персональный сервер за пару минут.
Для работы с сервером нам потребуется программа удаленного управления.
Использовал Putty, WinSCP. Программы доступны в интернете. Вы сможете без труда их скачать воспользовавшись поиском.
Заходим в Putty.
Развернем python и postgresql, программу управления приложениями Gunicorn
Вставляем команды в окно терминала и нажимаем enter.
sudo apt update sudo apt install python3-pip python3-dev libpq-dev postgresql
и веб-сервер Nginx
postgresql-contrib nginx curl
В Postgres стандартно применяется аутентификация peer authentication. Настроим ее командой.
sudo -u postgres psql
Создадим базу данных под проект:
CREATE DATABASE myproject;
Для взаимодействия с Телеграм вам потребуется SSL сертификаты. Для выпуска которых потребуется доменное имя. (Пример доменного имени - myproject.ru, myproject.com и прочие). Теоретически можно использовать самовыпущенный сертификат OpenSSL. Которые можно выпустить не имея доменного имени, а только IP адрес. Как это настроить описано в этой статье.
Изначально, я попытался выпустить такой сертификат. Сертификат выпустил. Но к сожалению этот сертификат Телеграм так и не принял.
Поэтому я заказал доменное имя для своего проекта прямо на платформе в пару кликов. Стоимость 160 руб. в год. И тогда без проблем получил бесплатные сертификаты Let's Encript. Это сделать очень просто используя эту инструкцию.
Подробную инструкции по настройке сервера и развертывания проекта Django смотрите здесь Инструкция. Здесь я буду приводить краткие выдержки.
Регистрация Чат Бота.
Теперь создадим бота. Ищите в телеграмм группу:
Стартуем
Называем своего бота.
Придется помучиться. Так самые топовые заняты.
Можно настраивать сервер на обмен сообщениями с Телеграм.
Напишем свой чат бот.
Для этого в проекте создадим Python файл bot_analisys.py.
# Анализируем входящее сообщение
import json
import requests
class bot_message_analysis():
'''Анализируем сообщение бота'''
def __init__(self, content):
self.content = content
self.token = '6949XXXXXX:AAH6FJ2IXXXXXXXXXXWXXXXXXXXXX-XXXXX'
json_string = json.dumps(self.content).encode('utf8')
print(json_string.decode('utf8'))
def analysis(self):
'''Аналидируем сообщение'''
with open("telegram_request.txt", "w") as file:
'''сохраянем запрос в неизменном виде'''
file.write(str(json.dumps(self.content)))
with open("text_request.txt", "w") as file:
'''сохраянем запрос в неизменном виде'''
file.write(str(self.content['message']['text']))
chat_id = self.content['message']['chat']['id']
from_first_name = self.content['message']['from']['first_name']
if self.content['message']['text'] == '/start':
msg = 'Привет, ' + str(from_first_name)
else:
msg = 'Привет, ' + str(from_first_name) + '. Я не понял твоего сообщения.'
url = f'https://api.telegram.org/bot' + self.token + '/sendMessage'
params = {
'chat_id': chat_id,
'text': msg,
}
print(params)
response = requests.get(url, params=params)
Настроем контроллер Django в файле view.py
from django.http import HttpResponse
import json
from myff_bot import bot_analisys as bot_a
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def webhook(request):
if request.method == 'GET':
# response = request.GET.get('param_name')
# Обработка GET-запроса
print('Get')
elif request.method == 'POST':
print('Post')
try:
json_string = json.loads(request.body)
except:
pass
new_bot = bot_a.bot_message_analysis(json_string)
text_message = new_bot.analysis()
return HttpResponse('Response', status=200)
Пропишем маршрут в файле urls:
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import static
from myff_bot.views import index, webhook
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('myff_bot/', index),
path('myff_bot/webhook/', webhook),
path('admin/', admin.site.urls)
Регистрация Webhook
curl -F "url=https://myproject.ru/webhook/" https://api.telegram.org/bot6949XXXXXX:AAH6FJ2IXXXXXXXXXXWXXXXXXXXXX-XXXXX/setWebhook
Команда проверки статуса webhook. Запускаем из браузера.
Строка запроса - https://api.telegram.org/bot6949XXXXXX:AAH6FJ2IXXXXXXXXXXWXXXXXXXXXX-XXXXX/getWebhookInfo
Команда для удаления webhook.
curl -X https://api.telegram.org/bot6949XXXXXX:AAH6FJ2IXXXXXXXXXXWXXXXXXXXXX-XXXXX/deleteWebhook
Проверка работы бота.
Теперь проверим работоспособность бота.
Отправляем сообщение.
/start
Получаем ответ
Отправляем сообщение
Привет, бот.
Друзья, это статья находится в процессе написания. Поэтому она будет обновляется по мере наличия у меня свободного времени. По моему плану, и вашим запросам. Поэтому пишите Ваши вопросы. Буду отвечать на ваши вопросы и дополнять статью.