Telegram боти стали незамінним інструментом для автоматизації завдань, надання інформації та взаємодії з користувачами. У цьому покроковому гайді ми розглянемо, як створити свого першого Telegram бота за допомогою Python та бібліотеки python-telegram-bot
. Навіть якщо ви новачок у програмуванні, цей посібник допоможе вам зрозуміти основи та запустити свого бота всього за кілька кроків.
Перший крок — це створення бота в Telegram. Для цього:
@BotFather
/newbot
Ніколи не публікуйте ваш токен бота публічно. Це ключ доступу до вашого бота, який може бути використаний зловмисниками.
Перед початком розробки потрібно налаштувати середовище:
Створіть віртуальне середовище та встановіть необхідні пакети:
# Створення віртуального середовища
python -m venv venv
# Активація середовища
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate
# Встановлення бібліотеки
pip install python-telegram-bot
Створіть файл bot.py
та додайте базовий код:
import logging
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackContext, MessageHandler, Filters
# Налаштування логування
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
# Обробник команди /start
def start(update: Update, context: CallbackContext) -> None:
keyboard = [
[InlineKeyboardButton("📚 Допомога", callback_data='help')],
[InlineKeyboardButton("ℹ️ Про бота", callback_data='about')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
'Привіт! Я ваш перший Telegram бот.\n'
'Оберіть опцію нижче:',
reply_markup=reply_markup
)
# Обробник текстових повідомлень
def echo(update: Update, context: CallbackContext) -> None:
update.message.reply_text(f"Ви написали: {update.message.text}")
def main() -> None:
# Введіть токен, отриманий від @BotFather
updater = Updater("YOUR_TOKEN_HERE")
dispatcher = updater.dispatcher
# Додавання обробників
dispatcher.add_handler(CommandHandler("start", start))
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
# Запуск бота
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
Перш ніж перейти до розширених можливостей, важливо розуміти основні концепції розробки Telegram ботів:
Розглянемо детально кожну з розширених можливостей, які можна додати до вашого бота для покращення користувацького досвіду та функціональності.
Інлайн клавіатура - це потужний інструмент для створення інтерактивного інтерфейсу в Telegram. На відміну від звичайних команд, кнопки інлайн клавіатури:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CommandHandler, CallbackQueryHandler
def help_command(update: Update, context: CallbackContext) -> None:
keyboard = [
[
InlineKeyboardButton("📝 Команди", callback_data='commands'),
InlineKeyboardButton("ℹ️ Про бота", callback_data='about')
],
[
InlineKeyboardButton("⚙️ Налаштування", callback_data='settings'),
InlineKeyboardButton("📊 Статистика", callback_data='stats')
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
'Оберіть розділ довідки:',
reply_markup=reply_markup
)
При розробці меню навігації, намагайтеся групувати пов'язані опції разом та обмежуйте кількість кнопок до 6-8 на одному рівні для кращого користувацького досвіду.
Telegram боти можуть працювати з різними типами медіафайлів: фотографіями, відео, документами, аудіо та голосовими повідомленнями. При роботі з медіафайлами важливо враховувати:
from telegram.ext import MessageHandler, Filters
def handle_photo(update: Update, context: CallbackContext) -> None:
# Отримуємо найбільшу версію фото
photo = update.message.photo[-1]
# Зберігаємо фото
file = photo.get_file()
file.download('user_photo.jpg')
# Відправляємо відповідь
update.message.reply_text(
f"Фото збережено!\n"
f"Розмір: {photo.width}x{photo.height}\n"
f"File ID: {photo.file_id[:20]}..."
)
База даних є важливою частиною будь-якого бота, який потребує зберігання інформації про користувачів або їх дії. SQLite - це легка, вбудована база даних, яка ідеально підходить для невеликих та середніх ботів. Переваги SQLite:
import sqlite3
from datetime import datetime
def init_db():
conn = sqlite3.connect('bot_database.db')
c = conn.cursor()
# Створюємо таблицю користувачів
c.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
last_name TEXT,
joined_date TIMESTAMP
)
''')
Для великих проектів з високим навантаженням рекомендується використовувати більш потужні бази даних, такі як PostgreSQL або MongoDB, які краще масштабуються та підтримують більше одночасних з'єднань.
Планувальник завдань (Job Queue) дозволяє автоматизувати різні дії бота, такі як:
from telegram.ext import JobQueue
from datetime import time
def schedule_daily_message(context: CallbackContext) -> None:
context.bot.send_message(
chat_id='YOUR_CHAT_ID',
text='Це щоденне повідомлення!'
)
def schedule_jobs(job_queue: JobQueue) -> None:
# Відправка повідомлення кожен день о 10:00
job_queue.run_daily(
schedule_daily_message,
time(hour=10, minute=0)
)
Безпека є критично важливим аспектом розробки Telegram бота. Розглянемо основні практики безпеки:
Ніколи не зберігайте токен бота безпосередньо в коді. Використовуйте змінні середовища:
# .env файл
BOT_TOKEN=your_bot_token_here
# Python код
import os
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv('BOT_TOKEN')
Обмежте доступ до адміністративних команд за допомогою декораторів:
def admin_required(func):
def wrapper(update: Update, context: CallbackContext):
user_id = update.effective_user.id
if user_id not in ADMIN_IDS:
update.message.reply_text("Доступ заборонено!")
return
return func(update, context)
return wrapper
@admin_required
def admin_command(update: Update, context: CallbackContext):
# Код для адміністраторів
pass
Реалізуйте обмеження на кількість запитів від користувача:
from collections import defaultdict
from datetime import datetime, timedelta
rate_limit = defaultdict(list)
def rate_limit_check(user_id: int, limit: int = 5, window: int = 60) -> bool:
now = datetime.now()
# Видаляємо старі записи
rate_limit[user_id] = [t for t in rate_limit[user_id]
if now - t < timedelta(seconds=window)]
if len(rate_limit[user_id]) >= limit:
return False
rate_limit[user_id].append(now)
return True
Приклад інтеграції з зовнішнім API для отримання погоди:
import requests
def get_weather(city: str) -> str:
API_KEY = os.getenv('WEATHER_API_KEY')
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric"
try:
response = requests.get(url)
data = response.json()
if response.status_code == 200:
temp = data['main']['temp']
desc = data['weather'][0]['description']
return f"Погода в {city}: {temp}°C, {desc}"
else:
return "Не вдалося отримати дані про погоду"
except Exception as e:
return f"Помилка: {str(e)}"
Реалізація підтримки різних мов:
from typing import Dict
translations: Dict[str, Dict[str, str]] = {
'uk': {
'welcome': 'Вітаємо!',
'help': 'Довідка',
'settings': 'Налаштування'
},
'en': {
'welcome': 'Welcome!',
'help': 'Help',
'settings': 'Settings'
}
}
def get_text(key: str, lang: str = 'uk') -> str:
return translations.get(lang, translations['uk']).get(key, key)
Розширене логування для відстеження помилок та активності:
import logging
from logging.handlers import RotatingFileHandler
def setup_logging():
# Налаштування логування
logger = logging.getLogger('bot')
logger.setLevel(logging.INFO)
# Ротація логів
handler = RotatingFileHandler(
'bot.log',
maxBytes=1024 * 1024, # 1MB
backupCount=5
)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = setup_logging()
# Використання
logger.info('Бот запущено')
logger.error('Помилка: %s', str(error))
При розробці Telegram бота дотримуйтесь наступних рекомендацій:
Для постійної роботи бота потрібно розмістити його на сервері. Популярні варіанти:
Безкоштовний хостинг для невеликих проектів з простим деплоєм
Надійний хостинг з повним контролем над сервером
Спеціалізований хостинг для Python проектів
Власний віртуальний сервер для повного контролю
Створення Telegram бота — це захоплюючий процес, який відкриває безліч можливостей для автоматизації та взаємодії з користувачами. Цей покроковий гайд допоможе вам створити свого першого бота навіть без досвіду програмування. Пам'ятайте про безпеку, регулярно оновлюйте залежності та документуйте свій код.