Колись думали про те, як створити бота в телеграм на Python? Чи хотілося вам мати свого маленького робота, який може допомагати з буденними справами або просто розважити жартом чи цікавим коментарем?
Уявіть, що ви можете створити власного помічника в Telegram — який відповідає на повідомлення, грає у вікторини чи навіть надсилає меми за командою! 🤖
Сьогодні ми навчимося саме цьому — створимо справжнього Telegram-бота мовою Python.
Ви побачите, як кілька рядків коду можуть оживити програму, що спілкується з людьми, реагує на команди й може бути такою креативною або серйозною, як ви захочете!
Практика. Як створити бота в телеграм на Python
1: Перш за все знайдіть у пошуку BotFather – головного бота телеграм. Переконайтеся, що біля його імені є блакитна галочка, яка означає, що він справжній, а не підробка

2: Натисніть Start на панелі внизу. Бот видасть список доступних команд.

3: Створити нового бота можна кількома способами : написавши /newbot або клікнувши на меню Open і далі Create a new Bot. У мене вже є кілька створених, які ви бачите на фото:

4: Введіть ім’я, опис і натисніть створити. Ім’я має закінчуватися на bot.


5: Натисніть на нового бота. У налаштуваннях бота ви побачите ключ (пізніше він нам знадобиться), також Edit Info, Commands, MiniApps. Почнемо з Edit Info: відкрийте це меню, додайте картинку для бота


Зайдіть у Commands і додайте дві команди start, help


Готуємо бота
6: Тепер створюємо код! У файл додайте токен та ім’я бота з налаштувань телеграма. Зверніть увагу, що ми прописуємо токен у коді лише для тренувальних програм!
from typing import Final
TOKEN : Final[str] = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'
BOT_USERNAME : Final[str] = '@ITFutureInUABot'
🔹 Final у Python — це спеціальна анотація типів із модуля typing, яка вказує, що змінну (або метод, або клас) не можна перевизначати чи змінювати. Final каже іншим розробникам: ❗ “Ця змінна — постійна, її не можна змінювати або перевизначати.”
🤔💭 Подумайте:
❓ Які небезпеки можуть бути, якщо токен від телеграм бота буде в інтернеті чи публічному git-проєкті ?
❓Як думаєте, як зберігаються токени та паролі у реальних проєктах?
До речі, це дуже популярне питання на співбесідах для програмістів: якщо в програмі є паролі, де і як ви їх зберігатимете ?
7: Спробуймо знайти свого бота у пошуку. Всі боти починаються з собачки, далі ім’я бота (юзернейм). Натисніть Start. Поки що ця кнопка не робить нічого, але бот буде у списку чатів вашого телеграму.



8: Встановлюємо бібліотеку для телеграм бота. У меню зверху оберіть … (три крапки)/Terminal/New Terminal.
pip install python-telegram-bot

Перевірте що в кінці отримали фразу :
Successfully installed anyio-4.10.0 certifi-2025.8.3 h11-0.16.0 httpcore-1.0.9 httpx-0.28.1 idna-3.10 python-telegram-bot-22.3 sniffio-1.3.1 typing_extensions-4.15.0
Останнє попередження:
[notice] A new release of pip is available: 24.0 -> 25.2
[notice] To update, run: python.exe -m pip install --upgrade pip
Свідчить про те, що версія пакетного менеджера pip застаріла і її можна оновити. Це повідомлення можна ігнорувати, але бажано, час від часу оновлювати. Для оновлення достатньо запустити команду, яка написана (для різних операційних систем вона може відрізнятись, в прикладі для Windows):
python.exe -m pip install --upgrade pip
Створюємо код для телеграм бота
9: Додамо бібліотеки телеграму. Спробуйте починати вводити код і використовувати підказки.
from typing import Final
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, \
filters, ContextTypes
# Constants
TOKEN : Final[str] = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'
BOT_USERNAME : Final[str] = '@ITFutureInUABot'
Запустіть програму. Переконайтеся, що вона нічого не видає. Якщо немає помилок – чудово! Ви впорались!
10: Створимо дві функції start, help:
"""Send a message when the command /start is issued."""
async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
user = update.effective_user
await update.message.reply_html(f"Привіт!! {user.mention_html()}! Давай поспілкуємося?")
Аналогічно створіть help_command з іншим повідомленням.
Асинхронна функція (async def) може виконуватися “паралельно” з іншими подіями — важливо для ботів, щоб не зависати, коли кілька людей пишуть одночасно.
Вона спрацьовує, коли користувач у Telegram надсилає команду /start.
🔹 update — містить інформацію про те, що сталося (повідомлення, користувач, чат).
🔹 context — це “довідник” із додатковими можливостями, наприклад, відправлення повідомлень, збереження даних тощо.
🔹 update.effective_user — зручний спосіб дістати дані про того, хто написав боту (ім’я, ID тощо).
🔹 await означає, що бот “чекає”, поки повідомлення буде надіслане, перед тим як перейти далі.
🔹user.mention_html() автоматично створює HTML-посилання на користувача, щоб у повідомленні відображалося його ім’я як клікабельне.
11: Тепер створімо функцію, яка буде читати, що там відповів юзер і взаємодіяти з ним. Відповідь користувача переводимо до нижнього регістру, щоб провести перевірки:
def handle_response (text: str) -> str:
processed: str = text.lower()
if 'привіт' in processed:
return 'Привітики!'
return 'шо-шо ? Звучить красиво, але мозок не підтягнувся.'
Додай ще такі умови:
💻 Якщо ввели “python” – пишемо “Python is coooooooool!”
💻 Якщо ввели “як ти” – програма має випадково обрати одну з відповідей і повернути її (random.choice(answers)):
answers = [
"Як Windows без оновлень — тримаюсь, але трохи глючу.",
"Як котик у коробці — одночасно добре і загадково.",
"Наче Wi-Fi: іноді стабільно, іноді взагалі без зв’язку.",
"Живу, як Google Chrome: відкрито 100 вкладок, а батарея на нулі.",
"Як морозиво в спеку — намагаюся не розтанути.",
"Як вчитель інформатики — з усмішкою, але з внутрішнім багом.",
"Наче серіал: нові серії виходять щодня, але ніхто не знає сюжет.",
"Як у математиці — завжди можна скоротити проблему.",
"Я в нормі, просто норму ще шукаю."
]
Обробка приватного повідомлення і повідомлення у чату телеграму
12: Створюємо функцію handle_message, яка оброблятиме повідомлення.
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
message_type: str = update.message.chat.type
text: str = update.message.text # what the user actually said
# Log
print(f'User ({update.message.chat.id} in {message_type}): "{text}"')
# Handle message type
# if message posted in group - act only if bot name mentioned. Remove Bot name from message
if message_type =='group':
if BOT_USERNAME in text:
new_text: str = text.replace(BOT_USERNAME, '').strip()
response: str = handle_response(new_text)
else:# do nothing in group if bot name is not in message
return
else:# if it's a provate message, just proceed with logic
response: str = handle_response(text)
#Reply
print(f'Bot {response}')
await update.message.reply_text(response)
13: Створіть функцію error схожим чином з такими ж параметрами. Вона має лише виводити на екран рядок ‘Update {update} caused error {context.error}’
14: Пишемо основну функцію.
def main():
print('Starting up bot...')
app = Application.builder().token(TOKEN).build()
#Commands
app.add_handler(CommandHandler('start',start_command))
app.add_handler(CommandHandler('help',help_command))
#Messages
app.add_handler(MessageHandler(filters.TEXT, handle_message))
#Errors
app.add_error_handler(error)
print('Polling...')
app.run_polling(poll_interval=5) # check for new messages every 5 seconds
if __name__ == '__main__':
main()
Тестуємо нашого бота
15: Запустіть програму. В консолі ви побачите повідомлення про запуск
15: Перейдіть в телеграм. Видаліть чат зі своїм ботом (права кнопка і Видалити). Бо старий бот ще не в курсі наших змін.
16: Додайте бот наново. Подивіться, чи приходить повідомлення з вітаннями. Зайдіть в меню і перевірте, як працюють start та help.
17: Чудово! Тепер поспілкуємося з ним!


18: Якщо хочете, щоб бот працював і в чатах, треба вимкнути налаштування приватності:
Зайдіть в @BotFather → My Bots → оберіть свого бота.
⚙️ → Bot Settings → Group Privacy → Turn off.
Далі створіть чат і додайте бота. Спочатку запустить /start. Потім можете пробувати надсилати повідомлення. Пам’ятайте, що наш бот вихований і відповідає тільки на повідомлення, в яких його питають :
@ITFutureInUABot привіт
В деяких версіях телеграму бота ще треба додати як адміна в чат, щоб він запрацював.
Відповіді на питання
❓ Які небезпеки можуть бути, якщо токен від телеграм бота буде в інтернеті чи публічному git-проєкті ?
Маючи токен хтось може перепрограмувати вашого бота. І замість милих чи веселих повідомлень отримаєте злющого бота, який здатний, наприклад вкрасти особисті дані користувача і навіть його акаунт
❓Як думаєте, як зберігаються токени та паролі у реальних проєктах?
У реальних проєктах токени, паролі, ключі доступу до API чи баз даних ніколи не зберігаються прямо в коді (тобто не пишуться в рядках на кшталт TOKEN = “123abcXYZ”). Натомість використовують безпечні способи зберігання секретів:
🗝️ 1. Сервіси для секретів (Secret Managers). У хмарних системах (AWS, Google Cloud, Azure) є спеціальні сервіси для цього:
AWS Secrets Manager
Google Secret Manager
Azure Key Vault
Також можна зберігати у GitHub Secrets, GitLab Variables і підставляти під час деплою
Вони зберігають паролі зашифрованими, контролюють, хто може їх бачити, і дозволяють змінювати ключі без перезапуску застосунку.
Бот або програма може отримувати секрети безпечно через API-запит під час запуску.
🗝️2. Змінні середовища (Environment Variables)
На сервері створюється файл .env з паролем. Програма на сервері читає пароль з файлу. До файлу мають доступ тільки програма і адмін.
🗝️3. Локальні менеджери (для розробки)
Можна також використовувати:
Keyring (бібліотека Python, що зберігає паролі у системному сховищі);
1Password, Bitwarden чи KeePass — для ручного зберігання токенів команди.

Домашня робота
Після оновлення коду бота треба: зупинити (команда Ctrl+C в консолі перериває програму), запустити наново, видалити та додати чат з ботом, щоб працювати з новими командами.
Разом з кодом додайте скріни(фото роботи бота з Телеграму) в домашку.
Підказка: На клавіатурі є кнопка Prt Sc (Print Screen), яка робить фото екрані й складає фотки у C:\Users\{user}\Pictures\Screenshots.
0: Розберіться і зрозумійте код
1: Додайте у бот свій варіант повідомлення і реакції бота на нього
2: Якщо людина пише повідомлення зі словом ‘факт’ або ‘цікавинка’ або ‘цікаво’, то програма має видати випадковий факт зі списку випадкових фактів (замість фактів можете створити випадкові жарти або меми, тоді й слова для виклику будуть іншими)
3: Створіть нову команду, яка виводитиме випадкову фотку якоїсь тваринки (наприклад cat_command. Підказки:
🤖 у BotFather для вашого бота треба буде додати команду як робили для решти команд
🤖Додайте нову команду у main
🤖Додайте метод cat_command. В середині він має мати список cat_photos з трьох або більше фоток котів. Команда, яка повертає фото:

await update.message.reply_photo(random.choice(cat_photos), caption="😺 Мяу! Лови котика!")
Level Up!
Як створити бота в телеграм на Python
1: Створіть квіз з 4-х запитань, який стартує по команді quiz. Допоможе цей код:
# --- Список запитань ---
QUIZ_QUESTIONS = [
{
"question": "Яка мова програмування названа на честь гумориста?",
"options": ["Python", "Java", "C++", "Ruby"],
"correct": 0
},
]
# --- Функція для старту вікторини ---
async def quiz_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
context.user_data["quiz_index"] = 0
await send_question(update, context)
# --- Функція для надсилання питання ---
async def send_question(update_or_query, context: ContextTypes.DEFAULT_TYPE):
index = context.user_data.get("quiz_index", 0)
question_data = QUIZ_QUESTIONS[index]
buttons = []
for i, option in enumerate(question_data["options"]):
buttons.append([InlineKeyboardButton(option, callback_data=str(i))])
keyboard = InlineKeyboardMarkup(buttons)
# якщо це перше питання через /quiz
if hasattr(update_or_query, "message"):
await update_or_query.message.reply_text(question_data["question"], reply_markup=keyboard)
else: # якщо після вибору відповіді
await update_or_query.edit_message_text(question_data["question"], reply_markup=keyboard)
# --- Обробник натискання кнопок ---
async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
query = update.callback_query
await query.answer()
index = context.user_data.get("quiz_index", 0)
question_data = QUIZ_QUESTIONS[index]
chosen = int(query.data)
if chosen == question_data["correct"]:
await query.edit_message_text("✅ Правильно!")
else:
await query.edit_message_text(f"❌ Ні! Правильна відповідь: {question_data['options'][question_data['correct']]}")
# наступне питання, якщо є
context.user_data["quiz_index"] = index + 1
if context.user_data["quiz_index"] < len(QUIZ_QUESTIONS):
await send_question(query, context)
else:
await query.message.reply_text("Кінець вікторини! Молодець ")
У головну функцію варто додати app.add_handler(CallbackQueryHandler(button_callback)) і ще один рядок.
2: Додайте до бота один з варіантів логіки на ваш вибір:
✅Переведення валют
✅Математичний тренажер: бот дає завдання, людина надсилає відповідь. Бот пише, чи правильна.
✅Гра з ботом “Камінь-ножиці-папір”
✅Ваша ідея

Не зупиняйтесь у вивченні Python! До зустрічі на наступних уроках!
Більше про ботів можна знайти у офіційній документації: https://core.telegram.org/bots