Как создать чат между пользователем в телеграм боте и посетителем сайта?

Для создания чата между пользователем в телеграм-боте и посетителем сайта можно использовать Django и Telegram Bot API.

  1. Создайте Django-приложение:
  • Установите Django, если его у вас еще нет: pip install django
  • Создайте новый проект Django: django-admin startproject mysite
  • Перейдите в папку проекта: cd mysite
  • Создайте новое приложение Django: python manage.py startapp chat
  1. Настройте Django-приложение:
  • В файле mysite/settings.py добавьте chat в список INSTALLED_APPS
  • В файле mysite/urls.py добавьте маршрут для приложения chat
  1. Создайте модели базы данных:
  • В файле chat/models.py создайте модели User и Message для хранения информации о пользователях и сообщениях:
   from django.db import models
   
   class User(models.Model):
       telegram_id = models.CharField(max_length=255)
       username = models.CharField(max_length=255)
       first_name = models.CharField(max_length=255)
       last_name = models.CharField(max_length=255)
       created_at = models.DateTimeField(auto_now_add=True)
       updated_at = models.DateTimeField(auto_now=True)
   
   class Message(models.Model):
       user = models.ForeignKey(User, on_delete=models.CASCADE)
       text = models.TextField()
       created_at = models.DateTimeField(auto_now_add=True)
  • Примените миграции для создания таблиц в базе данных: python manage.py makemigrations и python manage.py migrate
  1. Создайте веб-страницы для отправки и просмотра сообщений:
  • В файле chat/views.py создайте вьюхи для отображения страниц и обработки данных:
   from django.shortcuts import render, redirect
   from .models import User, Message
   
   def home(request):
       if request.method == 'POST':
           text = request.POST.get('text')
           user, _ = User.objects.get_or_create(
               telegram_id=request.POST.get('telegram_id'),
               defaults={
                   'username': request.POST.get('username'),
                   'first_name': request.POST.get('first_name'),
                   'last_name': request.POST.get('last_name')
               }
           )
           Message.objects.create(user=user, text=text)
           return redirect('home')
       else:
           users = User.objects.all()
           return render(request, 'chat/home.html', {'users': users})
  • Создайте шаблон home.html в папке chat/templates/chat/ для отображения страницы:
   <!DOCTYPE html>
   <html>
   <head>
       <title>Chat</title>
   </head>
   <body>
       <h1>Chat</h1>
       <form method="post">
           {% csrf_token %}
           <input type="hidden" name="telegram_id" value="{{ user.telegram_id }}" required>
           <input type="hidden" name="username" value="{{ user.username }}" required>
           <input type="hidden" name="first_name" value="{{ user.first_name }}" required>
           <input type="hidden" name="last_name" value="{{ user.last_name }}" required>
           <input type="text" name="text" placeholder="Enter your message" required>
           <button type="submit">Send</button>
       </form>
       <hr>
       <h2>Recent messages:</h2>
       {% for user in users %}
           <h3>{{ user.username }}</h3>
           {% for message in user.message_set.all %}
               <p>{{ message.text }} ({{ message.created_at }})</p>
           {% endfor %}
       {% empty %}
           <p>No messages yet.</p>
       {% endfor %}
   </body>
   </html>
  • В файле mysite/urls.py добавьте маршрут для вьюхи home
  1. Создайте телеграм-бота и подключите его к Django:
  • Создайте нового бота через BotFather в Telegram и получите токен доступа
  • Установите библиотеку python-telegram-bot: pip install python-telegram-bot
  • В файле chat/views.py импортируйте необходимые классы для работы с телеграм-ботом:
   from django.conf import settings
   from telegram import Update, Bot
   from telegram.ext import CallbackContext, CommandHandler, MessageHandler, Filters, Updater
  • В файле chat/views.py добавьте функцию для обработки входящих сообщений от телеграм-бота:
   def telegram_webhook(request):
       bot = Bot(token=settings.TELEGRAM_BOT_TOKEN)
       update = Update.de_json(request.body, bot)
       dispatcher = Dispatcher(bot, None, workers=0)
       dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))
       dispatcher.process_update(update)
       return HttpResponse()
  • В файле chat/urls.py создайте маршрут для вебхука телеграм-бота:
   from django.urls import path
   from .views import telegram_webhook
   
   urlpatterns = [
       path('telegram-webhook/', telegram_webhook, name='telegram_webhook'),
   ]
  • В файле mysite/urls.py добавьте маршрут для включения маршрутов из chat/urls.py
  1. Настройте вебхук телеграм-бота:
  • Запустите Django-сервер: python manage.py runserver
  • Через curl или другое средство отправьте POST-запрос на http://yourdomain.com/telegram-webhook/ с параметрами url и certificate.
  1. Добавьте кнопку для чата на вашем сайте:
  • Вставьте следующий HTML-код на нужную страницу вашего сайта:
   <script src="https://telegram.org/js/telegram-widget.js?11" async></script>
   <script data-telegram-login="{{ telegram_bot_username }}" data-size="large" data-auth-url="/telegram-login/" data-request-access="write" data-userpic="false" data-onauth="onTelegramAuth(user)" data-radius="0" data-mode="popup"></script>
  • Через переменную telegram_bot_username передайте веб-приложению имя вашего телеграм-бота
  • Создайте вьюху для обработки запроса авторизации пользователя через Telegram:
   from django.http import JsonResponse
   
   def telegram_login(request):
       telegram_id = request.GET.get('id')
       username = request.GET.get('username')
       first_name = request.GET.get('first_name')
       last_name = request.GET.get('last_name')
       return JsonResponse({'telegram_id': telegram_id, 'username': username, 'first_name': first_name, 'last_name': last_name})
  • В файле chat/urls.py добавьте маршрут для вьюхи telegram_login

Теперь вы создали чат между пользователем в телеграм-боте и посетителем вашего сайта. Ваши пользователи могут отправлять сообщения через форму на странице вашего сайта и видеть последние сообщения от других пользователей. Они также могут получать входящие сообщения от вашего телеграм-бота, которые затем будут отображаться на странице чата. Таким образом, обеспечивается двухсторонняя коммуникация между пользователями в телеграм-боте и посетителями вашего сайта.