Как выгрузить базу данных с тематиками и каналами в Telegram бот
Если у вас есть база данных с таблицами, где каждая тематика содержит список каналов с названием, количеством подписчиков и ссылкой, возникает логичный вопрос: как организовать удобный выбор в Telegram боте? Пользователь должен сначала выбрать тематику, а затем - конкретный канал. Решение требует создания веб-приложения с использованием HTTP-запросов и API Telegram. В этой статье мы подробно разберём, как реализовать такую архитектуру.
Архитектура решения: веб-приложение + Telegram Bot API
Для динамического вывода данных из базы в Telegram бот необходимо промежуточное звено - веб-приложение (backend). Оно обрабатывает запросы от бота, выполняет SQL-запросы к базе и возвращает структурированный ответ. Бот, в свою очередь, использует Inline Keyboard (инлайн-кнопки) для пошагового выбора.
Необходимые компоненты
- Серверная часть (Python, Node.js, PHP) - принимает POST-запросы от Telegram и взаимодействует с базой данных.
- База данных (MySQL, PostgreSQL, SQLite) - хранит таблицы с тематиками и каналами.
- Telegram Bot API - отправляет сообщения, обновляет клавиатуру и обрабатывает callback-запросы.
Пошаговая реализация выбора тематики и канала
Шаг 1: Структурирование базы данных
Приведите ваши 5 таблиц к единому формату. Например, создайте таблицу categories (тематики) и channels (каналы) со связью по category_id. Поля: id, name, subscribers, link, category_id. Это упростит SQL-запросы.
Шаг 2: Создание веб-приложения с эндпоинтами
Вам понадобятся как минимум два эндпоинта:
/get_categories- возвращает список тематик./get_channels?category_id=X- возвращает список каналов для выбранной тематики.
Пример на Python (Flask):
from flask import Flask, request, jsonify
import sqlite3
app = Flask(__name__)
@app.route('/get_categories')
def get_categories():
conn = sqlite3.connect('database.db')
cur = conn.cursor()
cur.execute('SELECT id, name FROM categories')
categories = cur.fetchall()
conn.close()
return jsonify(categories)
@app.route('/get_channels')
def get_channels():
category_id = request.args.get('category_id')
conn = sqlite3.connect('database.db')
cur = conn.cursor()
cur.execute('SELECT name, subscribers, link FROM channels WHERE category_id=?', (category_id,))
channels = cur.fetchall()
conn.close()
return jsonify(channels)
if __name__ == '__main__':
app.run()Шаг 3: Настройка Telegram бота
Используйте библиотеку python-telegram-bot или aiogram. При команде /start бот запрашивает список тематик через HTTP-запрос к вашему веб-приложению, затем формирует InlineKeyboardMarkup. Каждая кнопка содержит callback_data с category_id.
Шаг 4: Обработка выбора тематики
Когда пользователь нажимает кнопку, Telegram отправляет callback-запрос на ваш сервер. В обработчике вы:
- Получаете
category_idиз callback_data. - Делаете запрос к эндпоинту
/get_channels?category_id=.... - Формируете новую клавиатуру с названиями каналов и ссылками.
- Отправляете пользователю обновлённое сообщение с кнопками.
Использование request-библиотек
Для выполнения HTTP-запросов из кода бота используйте библиотеку requests (Python) или axios (Node.js). Пример на Python:
import requests
response = requests.get('http://ваш-сервер/get_categories')
categories = response.json()Аналогично для получения каналов: requests.get(f'http://ваш-сервер/get_channels?category_id={cat_id}').
Альтернативный способ: Inline Query без веб-приложения
Если база данных небольшая, можно встроить данные прямо в код бота (в виде словаря). Но при изменении данных потребуется перезапуск бота. Для динамических данных веб-приложение - единственный правильный путь.
Таким образом, вы получаете полностью интерактивного Telegram бота, который позволяет пользователю последовательно выбирать тематику и канал, а также сразу переходить по ссылке. Это решение масштабируется на любое количество таблиц и записей.