Найти в Дзене
Программист вещает

Полное руководство по созданию чат-бота с использованием Python и библиотеки Telebot

Этот код представляет собой бота для создания случайных комнат для общения в Telegram. Пользователи могут подключаться к комнатам и отправлять сообщения другим пользователям в той же комнате. В статье будет подробно описан каждый аспект кода, а также приведены скриншоты, иллюстрирующие работу различных функций бота. Импорты библиотек: import telebot
from telebot import types
import logging API_TOKEN = 'YOU_API_TOKEN
bot = telebot.TeleBot(API_TOKEN) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s') Классы и функции:
User: Класс для хранения информации о пользователе.
Room: Класс для хранения информации о комнатах.
find_room(): Функция для поиска комнаты или создания новой.
create_main_markup(): Функция для создания клавиатуры с основными кнопками. class User:
def __init__(self, chat_id):
self.chat_id = chat_id
self.room = None
class Room:
def __init__(self):
self.users = [] def find_room():
for room_id, room in rooms.i
Оглавление

Описание кода

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

Интерфейс бота
Интерфейс бота

Основные компоненты

Импорты библиотек:

import telebot
from telebot import types
import logging
  1. Настройка API токена:
API_TOKEN = 'YOU_API_TOKEN
bot = telebot.TeleBot(API_TOKEN)
  1. Логирование:
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')

Классы и функции:
User: Класс для хранения информации о пользователе.
Room: Класс для хранения информации о комнатах.
find_room(): Функция для поиска комнаты или создания новой.
create_main_markup(): Функция для создания клавиатуры с основными кнопками.

Краткий обзор функциональности бота

  • Команда /start: Подключает пользователя к случайной комнате.
  • Кнопка 🔗 Подключиться: Подключает пользователя к новой комнате или присоединяет к существующей с одним пользователем.
  • Кнопка ❌ Отключиться: Отключает пользователя из текущей комнаты.
  • Кнопка 👥 Онлайн: Показывает количество пользователей, которые в данный момент онлайн.

Подробное описание кода

1. Классы User и Room

class User:
def __init__(self, chat_id):
self.chat_id = chat_id
self.room = None
class Room:
def __init__(self):
self.users = []
  • User: Инициализация пользователя с его ID чата и комнатой (по умолчанию None).
  • Room: Инициализация комнаты с пустым списком пользователей.

2. Функция find_room

def find_room():
for room_id, room in rooms.items():
if len(room.users) == 1:
return room
new_room = Room()
rooms[len(rooms) + 1] = new_room
return new_room
  • Функция ищет комнату с одним пользователем или создает новую комнату, если таких нет.

3. Функция create_main_markup

def create_main_markup():
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.row(types.KeyboardButton('🔗 Подключиться'), types.KeyboardButton('❌ Отключиться'))
markup.row(types.KeyboardButton('👥 Онлайн'))
return markup
  • Создает клавиатуру с кнопками для подключения, отключения и просмотра онлайна.

4. Команды и обработчики сообщений

@bot.message_handler(commands=['start']) def start_command(message):
chat_id = message.chat.id user = users.get(chat_id, User(chat_id))
users[chat_id] = user

if user.room:
bot.send_message(chat_id, "Вы уже в комнате.", reply_markup=create_main_markup())
return
room = find_room()
room.users.append(user)
user.room = room

logging.info(f"User {chat_id} connected. Room {id(room)} now has {len(room.users)} user(s).")

if len(room.users) == 2:
for u in room.users:
bot.send_message(u.chat_id, "Пользователь подключился. Начинайте общение.", reply_markup=create_main_markup())
else:
bot.send_message(chat_id, "Ожидаем другого пользователя...", reply_markup=create_main_markup())
  • Команда /start создает/подключает пользователя к комнате.
@bot.message_handler(func=lambda message: message.text in ['🔗 Подключиться', '❌ Отключиться', '👥 Онлайн']) def handle_buttons(message):
if message.text == '🔗 Подключиться':
start_command(message)
elif message.text == '❌ Отключиться':
disconnect_command(message)
elif message.text == '👥 Онлайн':
online_command(message)
  • Обработчик кнопок: подключение, отключение и отображение онлайна.

5. Отправка сообщений

@bot.message_handler(content_types=['text', 'video', 'voice', 'audio', 'photo']) def handle_message(message):
chat_id = message.chat.id user = users.get(chat_id)

if not user or not user.room or len(user.room.users) < 2:
bot.send_message(chat_id, "Сообщение некому отправить.", reply_markup=create_main_markup())
return
recipient = user.room.users[0] if user.room.users[1].chat_id == chat_id else user.room.users[1]

logging.info(f"Message from user {chat_id} to user {recipient.chat_id}. Type: {message.content_type}")

if message.content_type == 'text':
bot.send_message(recipient.chat_id, message.text)
elif message.content_type == 'video':
bot.send_video(recipient.chat_id, message.video.file_id)
elif message.content_type == 'voice':
bot.send_voice(recipient.chat_id, message.voice.file_id)
elif message.content_type == 'audio':
bot.send_audio(recipient.chat_id, message.audio.file_id)
elif message.content_type == 'photo':
bot.send_photo(recipient.chat_id, message.photo[-1].file_id, caption=message.caption)
  • Обработка входящих сообщений и отправка их соответствующим пользователям из комнаты.

Проверить работу бота можно тут -> @datingsng_bot