Навчіться будувати свого першого бота в Telegram за допомогою Python

Уявіть собі, є бот-повідомлення, який надішле вам випадковий образ милого собаки, коли захочете, звучить круто, правда? Давайте зробимо один!

Для цього підручника ми будемо використовувати Python 3, python- telegram -bot та загальнодоступний API RandomDog .

Наприкінці цього підручника ви отримаєте бота для зняття стресу, який надсилатиме вам зображення милих собак щоразу, коли вам це потрібно, так!

Починаємо

Перш ніж ми почнемо писати програму, нам потрібно створити маркер для нашого бота. Маркер необхідний для доступу до API Telegram та встановлення необхідних залежностей.

1. Створіть нового бота в BotFather

Якщо ви хочете зробити бота в Telegram, вам потрібно спочатку «зареєструвати» свого бота, перш ніж використовувати його. Коли ми “зареєструємо” нашого бота, ми отримаємо маркер для доступу до API Telegram.

Перейдіть до BotFather (якщо ви відкриваєте його на робочому столі, переконайтеся, що у вас є програма Telegram), а потім створіть нового бота, надіславши /newbotкоманду. Виконуйте кроки, поки не отримаєте ім’я користувача та маркер свого бота. Ви можете перейти до свого бота, перейшовши за цією URL-адресою: //telegram.me/YOUR_BOT_USERNAME і ваш маркер повинен виглядати так.

704418931:AAEtcZ*************

2. Встановіть бібліотеку

Оскільки ми будемо використовувати бібліотеку для цього підручника, встановіть її за допомогою цієї команди.

pip3 install python-telegram-bot

Якщо бібліотека успішно встановлена, ми готові піти.

Напишіть програму

Давайте зробимо наш перший бот. Цей бот повинен повернути зображення собаки, коли ми надсилаємо /bopкоманду. Щоб зробити це, ми можемо використовувати загальнодоступний API від RandomDogщоб допомогти нам генерувати випадкові зображення собак.

Робочий процес нашого бота такий же простий:

отримати доступ до API -> отримати URL-адресу зображення -> надіслати зображення

1. Імпортуйте бібліотеки

Спочатку імпортуйте всі потрібні нам бібліотеки.

from telegram.ext import Updater, CommandHandler import requests import re

2. Доступ до API та отримання URL-адреси зображення

Давайте створимо функцію для отримання URL-адреси. Використовуючи бібліотеку запитів, ми можемо отримати доступ до API та отримати дані json.

contents = requests.get('//random.dog/woof.json').json()

Ви можете перевірити дані json, відкривши цю URL-адресу: //random.dog/woof.jsonу своєму браузері. Ви побачите щось подібне на своєму екрані:

{“url":"//random.dog/*****.JPG"}

Отримайте URL-адресу зображення, оскільки нам потрібен цей параметр, щоб мати можливість відправити зображення.

image_url = contents['url']

Оберніть цей код у функцію, що називається get_url().

def get_url(): contents = requests.get('//random.dog/woof.json').json() url = contents['url'] return url

3. Надішліть зображення

Для надсилання повідомлення / зображення нам потрібні два параметри, URL зображення та ідентифікатор одержувача - це може бути ідентифікатор групи або ідентифікатор користувача.

Ми можемо отримати URL-адресу зображення, викликавши нашу get_url()функцію.

url = get_url()

Отримайте ідентифікатор одержувача, використовуючи цей код:

chat_id = update.message.chat_id

Після того, як ми отримали URL-адресу зображення та ідентифікатор одержувача, настав час надіслати повідомлення, яке є зображенням.

bot.send_photo(chat_id=chat_id, photo=url)

Оберніть цей код у функцію, що називається bop, і переконайтесь, що ваш код виглядає так:

def bop(bot, update): url = get_url() chat_id = update.message.chat_id bot.send_photo(chat_id=chat_id, photo=url)

4. Main program

Нарешті, створіть ще одну функцію, що викликається mainдля запуску нашої програми. Не забудьте змінитиYOUR_TOKEN токен, який ми створили раніше в цьому посібнику.

def main(): updater = Updater('YOUR_TOKEN') dp = updater.dispatcher dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

В кінці ваш код повинен виглядати так:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler import requests import re def get_url(): contents = requests.get('//random.dog/woof.json').json() url = contents['url'] return url def bop(bot, update): url = get_url() chat_id = update.message.chat_id bot.send_photo(chat_id=chat_id, photo=url) def main(): updater = Updater('YOUR_TOKEN') dp = updater.dispatcher dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

5. Запустіть програму

Чудово! Ви закінчили свою першу програму. А тепер давайте перевіримо, чи це працює. Збережіть файл, назвіть його main.py, а потім запустіть за допомогою цієї команди.

python3 main.py

Перейти до вашої телеграмі боту отримуючи доступ до цього URL: //telegram.me/YOUR_BOT_USERNAME. Надішліть /bopкоманду. Якщо все працює ідеально, бот відповість випадковим зображенням собаки. Симпатично, правда?

Помилки обробки

Чудово! Тепер у вас є бот, який надішле вам милий образ собаки, коли захочете.

Є ще! RandomDogAPI not only generates images, but also videos and GIFs. If we access the API and we get a video or GIF, there is an error and the bot won’t send it to you.

Let’s fix this so the bot will only send a message with an image attachment. If we get a video or GIF then we will call the API again until we get an image.

1. Match the file extension using regex

We are going to use a regex to solve this problem.

To distinguish an image from video or GIF, we can take a look at the file extension. We only need the last part of our URL.

//random.dog/*****.JPG

We need to define, first, what file extensions are allowed in our program.

allowed_extension = ['jpg','jpeg','png']

Then use the regex to extract the file extension from the URL.

file_extension = re.search("([^.]*)$",url).group(1).lower()

Using that code, make a function called get_image_url() to iterate the URL until we get the file extension that we want (jpg,jpeg,png).

def get_image_url(): allowed_extension = ['jpg','jpeg','png'] file_extension = '' while file_extension not in allowed_extension: url = get_url() file_extension = re.search("([^.]*)$",url).group(1).lower() return url

2. Modify your code

Great! Now for the last part, replace the url = get_url() line in the bop() function with url = get_image_url() , and your code should look like this:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler import requests import re def get_url(): contents = requests.get('//random.dog/woof.json').json() url = contents['url'] return url def get_image_url(): allowed_extension = ['jpg','jpeg','png'] file_extension = '' while file_extension not in allowed_extension: url = get_url() file_extension = re.search("([^.]*)$",url).group(1).lower() return url def bop(bot, update): url = get_image_url() chat_id = update.message.chat_id bot.send_photo(chat_id=chat_id, photo=url) def main(): updater = Updater('YOUR_TOKEN') dp = updater.dispatcher dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

Nice! Everything should run perfectly. You can also check out my GitHub account to get the code.

Finally, congratulations for finishing this tutorial, plus you have a cool Telegram bot now.

Please leave a comment if you think there are any errors in my code or writing, because I’m still learning and I want to get better.

Thank you and good luck practicing! :)