Найти в Дзене
Электрообзор

Телеграм бот своими руками на Django.

Это статья том, как создать свой телеграмм бот на базе farmework Django. Пошагово, начиная с выбора платформы размещения, обоснования причин такого выбора, разворачивания проекта django и так далее. Итак начнем с выбора метода общения с ботом. Существует два метода обмена сообщениями меду вашим сервером и ботом. Один из них называется polling - когда ваш сервер будет опрашивать Телеграмм в бесконечном цикле. Большинство обзоров, о том как создать бота, используют именно этот метом общения с Телеграмм. Второй это web hook - когда сам Телеграмм оповестит ваш сервис, в случае активности в вашем чат боте. И отправит вам request. Мне нравится больше второй метод. Не вижу смысла постоянно дергать Телеграм и тратить ресурсы своего сервера. Для построения своего бота буду избегать использования новомодных библиотек типа telegram_bot, *gram и прочие. Для общения буду использовать Bot API. Так с методом определились. Теперь определимся где разместить свой север. Для того что бы Телеграм бот д
Оглавление

Father bot
Father bot

Это статья том, как создать свой телеграмм бот на базе 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 смотрите здесь Инструкция. Здесь я буду приводить краткие выдержки.

Регистрация Чат Бота.

Теперь создадим бота. Ищите в телеграмм группу:

-2

Стартуем

Список команд бота.
Список команд бота.
Вводим команду.
Вводим команду.

Называем своего бота.

Теперь придумайте username
Теперь придумайте username

Придется помучиться. Так самые топовые заняты.

Теперь вы счастливый обладатель ключа.
Теперь вы счастливый обладатель ключа.

Можно настраивать сервер на обмен сообщениями с Телеграм.

Напишем свой чат бот.

Для этого в проекте создадим 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

Получаем ответ

Ответ бота на сообщение /start
Ответ бота на сообщение /start

Отправляем сообщение

Привет, бот.

Ответ бота
Ответ бота

Друзья, это статья находится в процессе написания. Поэтому она будет обновляется по мере наличия у меня свободного времени. По моему плану, и вашим запросам. Поэтому пишите Ваши вопросы. Буду отвечать на ваши вопросы и дополнять статью.