LukinterLab
LukInterLab

LukInterLab- -LukInterLab

profile-pic

регистрация на сайте с помощью телеграмм бота

15 июня 2025 г. 7:23
Изображение поста
Я помогу вам реализовать регистрацию Telegram-бота для вашего веб-сайта. Давайте разберем это на этапы: 1. Сначала давайте проверим существующую структуру проекта, чтобы понять, куда нам следует добавить нашу новую функциональность. Запустим инструмент Давайте сначала проверим текущую requirements.txt чтобы увидеть, какие зависимости у нас есть: Прочитайте файл: requirements.txt Теперь давайте проверим структуру пользовательского приложения, так как именно там нам нужно будет реализовать функцию регистрации: Ran tool Я помогу вам реализовать регистрацию Telegram-бота. Вот что нам нужно сделать:

Я помогу вам реализовать регистрацию Telegram-бота для вашего веб-сайта. Давайте разберем это на этапы:

1. Сначала давайте проверим существующую структуру проекта, чтобы понять, куда нам следует добавить нашу новую функциональность.

Запустим инструмент
Давайте сначала проверим текущую requirements.txt чтобы увидеть, какие зависимости у нас есть:

Прочитайте файл: requirements.txt
Теперь давайте проверим структуру пользовательского приложения, так как именно там нам нужно будет реализовать функцию регистрации:

Ran tool
Я помогу вам реализовать регистрацию Telegram-бота. Вот что нам нужно сделать:

1. Сначала давайте добавим необходимые зависимости в requirements.txt:

 

python-telegram-bot==20.8

python-dotenv==1.0.1

2. Теперь давайте создадим файл конфигурации Telegram-бота:

import os
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from django.conf import settings
from dotenv import load_dotenv
from .models import TelegramUser

# Загружать переменные среды
load_dotenv()

# Настройка ведения журнала
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Отправьте сообщение при выполнении команды /пуск."""
    user = update.effective_user
    await update.message.reply_text(
        f'Привет, {user.first_name}! Я бот для регистрации на сайте LukInterLab.\n'
        'Для регистрации отправьте мне команду /register'
    )

async def register(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Управлять процессом регистрации."""
    user = update.effective_user
    
    # Проверьте, зарегистрирован ли пользователь уже
    if TelegramUser.objects.filter(telegram_id=user.id).exists():
        await update.message.reply_text(
            'Вы уже зарегистрированы на сайте!'
        )
        return

    # Создать нового пользователя
    try:
        TelegramUser.objects.create(
            telegram_id=user.id,
            username=user.username,
            first_name=user.first_name,
            last_name=user.last_name
        )
        await update.message.reply_text(
            'Регистрация успешно завершена! Теперь вы можете войти на сайт, используя свой Telegram ID.'
        )
    except Exception as e:
        logger.error(f"Error during registration: {e}")
        await update.message.reply_text(
            'Произошла ошибка при регистрации. Пожалуйста, попробуйте позже.'
        )

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Отправьте сообщение при выполнении команды /справки."""
    await update.message.reply_text(
        'Доступные команды:\n'
        '/start - Начать работу с ботом\n'
        '/register - Зарегистрироваться на сайте\n'
        '/help - Показать это сообщение'
    )

def run_bot():
    """Start the bot."""
    # Создайте приложение
    application = Application.builder().token(os.getenv('TELEGRAM_BOT_TOKEN')).build()

    # Добавление обработчиков
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("register", register))
    application.add_handler(CommandHandler("help", help_command))

    # Start the Bot
    application.run_polling() 

3. Обновим модели пользователей, включив в них информацию о пользователях Telegram:

from django.db import models
from django.contrib.auth.models import User

# Создавайте свои модели здесь.

class TelegramUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
    telegram_id = models.BigIntegerField(unique=True)
    username = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True, null=True, blank=True )

    def __str__(self):
        return f"{self.first_name} {self.last_name} ({self.telegram_id})"

    class Meta:
        verbose_name = "Telegram User"
        verbose_name_plural = "Telegram Users"

4. Создадим пользовательский сервер аутентификации для Telegram:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from .models import TelegramUser

class TelegramBackend(ModelBackend):
    def authenticate(self, request, telegram_id=None, **kwargs):
        try:
            telegram_user = TelegramUser.objects.get(telegram_id=telegram_id)
            if telegram_user.user:
                return telegram_user.user
            return None
        except TelegramUser.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None 

5. Обновим представления для обработки аутентификации Telegram:

from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import TelegramUser
from .auth import TelegramBackend

# Создавайте свои просмотры здесь.

def telegram_login(request):
    if request.method == 'POST':
        telegram_id = request.POST.get('telegram_id')
        if telegram_id:
            user = authenticate(request, telegram_id=telegram_id)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                messages.error(request, 'Неверный Telegram ID или пользователь не зарегистрирован.')
        else:
            messages.error(request, 'Пожалуйста, введите ваш Telegram ID.')
    return render(request, 'Users/telegram_login.html')

@login_required
def profile(request):
    try:
        telegram_user = TelegramUser.objects.get(user=request.user)
        return render(request, 'Users/profile.html', {'telegram_user': telegram_user})
    except TelegramUser.DoesNotExist:
        return render(request, 'Users/profile.html')

6. Создадим необходимые шаблоны:

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">
                    <h3 class="text-center">Вход через Telegram</h3>
                </div>
                <div class="card-body">
                    {% if messages %}
                        {% for message in messages %}
                            <div class="alert alert-{{ message.tags }}">
                                {{ message }}
                            </div>
                        {% endfor %}
                    {% endif %}
                    
                    <form method="post">
                        {% csrf_token %}
                        <div class="form-group">
                            <label for="telegram_id">Telegram ID:</label>
                            <input type="text" class="form-control" id="telegram_id" name="telegram_id" required>
                            <small class="form-text text-muted">
                                Введите ваш Telegram ID, который вы получили после регистрации через бота.
                            </small>
                        </div>
                        <div class="text-center mt-3">
                            <button type="submit" class="btn btn-primary">Войти</button>
                        </div>
                    </form>
                    
                    <div class="mt-4">
                        <p class="text-center">
                            Еще не зарегистрированы? 
                            <a href="https://t.me/your_bot_username" target="_blank">
                                Зарегистрируйтесь через Telegram бота
                            </a>
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %} 

7. Давайте создадим шаблон профиля:

{% extends 'base.html' %}

{% block content %}
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">
                    <h3 class="text-center">Профиль пользователя</h3>
                </div>
                <div class="card-body">
                    {% if telegram_user %}
                        <div class="row">
                            <div class="col-md-6">
                                <h5>Информация о пользователе:</h5>
                                <p><strong>Имя:</strong> {{ telegram_user.first_name }}</p>
                                <p><strong>Фамилия:</strong> {{ telegram_user.last_name }}</p>
                                <p><strong>Telegram ID:</strong> {{ telegram_user.telegram_id }}</p>
                                <p><strong>Telegram Username:</strong> @{{ telegram_user.username }}</p>
                                <p><strong>Дата регистрации:</strong> {{ telegram_user.created_at|date:"d.m.Y H:i" }}</p>
                            </div>
                        </div>
                    {% else %}
                        <p class="text-center">Информация о Telegram не найдена.</p>
                    {% endif %}
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %} 

8. Давайте обновим конфигурацию URL-адресов:

from django.urls import path
from . import views

app_name = 'users'

urlpatterns = [
    path('telegram-login/', views.telegram_login, name='telegram_login'),
    path('profile/', views.profile, name='profile'),
] 

9. Наконец, давайте обновим основные настройки проекта, чтобы включить наш пользовательский сервер аутентификации:

AUTHENTICATION_BACKENDS = [
    'Users.auth.TelegramBackend',
    'django.contrib.auth.backends.ModelBackend',
]

Теперь, когда мы настроили все необходимые компоненты, вот что вам нужно сделать, чтобы регистрация Telegram-бота заработала:

1. Создайте нового Telegram-бота с помощью BotFather (https://t.me/botfather) и получите токен бота.

2. Создайте файл `.env` в корневом каталоге вашего проекта и добавьте токен бота:
```
TELEGRAM_BOT_TOKEN=ваш_бот_токен_ здесь
```

3. Запустите миграции, чтобы создать новые таблицы базы данных:
``bash
python manage.py makemigrations
python manage.py перенести
```

4. Запустить Telegram-бота в отдельный терминал:
``Баш
питон manage.py раковины
>>> от пользователей.telegram_bot импортирует run_bot
>>> run_bot()
```

Система теперь поддерживает:
1. Регистрация через Telegram-бота с помощью команды "/register"
2. Войдите на веб-сайт, используя Telegram ID
3. Страница профиля пользователя с информацией о Telegram
4. Безопасная аутентификация с использованием Telegram ID

Пользователи могут:
1. Запустить бота с помощью "/start"
2. Зарегистрироваться с помощью `/register`
3. Получить свой Telegram ID от бота
4. Используйте этот идентификатор для входа на веб-сайт

Бот автоматически создаст запись пользователя Telegram, когда кто-то зарегистрируется, и затем он сможет использовать свой идентификатор Telegram для входа на веб-сайт.

Хотите ли вы, чтобы я более подробно объяснил какую-либо часть реализации или внес какие-либо коррективы в код?

Пока комментариев нет.

Оставьте коментарий