Python

Представьте, что у вас есть бот в мессенджере, который присылает вам случайно выбранную картинку с собачкой, когда вам захочется. Звучит здорово, да? Давайте сделаем такого.

В этом уроке мы будем использовать Python 3, библиотеку python-telegram-bot и публичный API RandomDog.

В конце урока у вас будет свой бот для снятия стресса, который будет присылать вам милых пёсиков, когда захотите.

Начнём

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

1. Создаём нового бота в BotFather

Если вы задумали создавать бота для Telegram, сначала его нужно зарегистрировать, перед тем как использовать. Когда вы регистрируете бота, вы получаете токен для доступа к API Telegram’а

Перейдите по ссылке BotFather (у вас должно быть установлено приложение Telegram) и создайте нового бота, отправив команду /newbot. Следуйте инструкциям, пока не получите имя пользователя и токен для вашего бота. Ссылка для доступа к боту выглядит так: https://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('https://random.dog/woof.json').json()

Проверить json данные можно в браузере по ссылке https://random.dog/woof.json. Вы увидите что-то вроде этого:

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

Получаем URL, чтобы иметь возможность отправить изображение:

image_url = contents['url']

Оформим этот код в виде функции get_url() .

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

3. Отправляем картинку

Чтобы отправить сообщение/изображение, нам понадобится два параметра: URL изображения и ID получателя — это может быть ID группы или ID пользователя.

Получить URL изображения можно вызвав функцию get_url() .

url = get_url()

Чтобы получить ID получателя, используйте этот код:

chat_id = update.message.chat_id

После того как мы получили URL изображения и ID получателя, пришло время отправить сообщение, т.е. изображение.

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, чтобы запускать программу. Не забудьте заменить 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('https://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

Запустите бота перейдя по ссылке https://telegram.me/YOUR_BOT_USERNAME. Отправьте команду /bop. Если всё работает как надо, вы увидите случайное изображение с пёсиком. Миленько.

 

 

Исправляем ошибки

Отлично! Теперь у вас есть работающий бот.

Есть ещё кое-что. API RandomDog генерирует не только изображения, но ещё видео и гифки. Мы не сможем получить видео или GIF от API, потому что произойдёт ошибка.

Давайте это исправим, чтобы бот отправлял нам только изображения. Если нам попадётся видео или GIF, мы снова будем вызывать API, пока не получим изображение.

1. Проверяем расширение файла с помощью регулярного выражения

Чтобы решить эту проблемы, мы будем использовать регулярное выражение.

Отличить изображение от видео или GIF, можно по расширению файла. Нам понадобится последняя часть URL.

https://random.dog/*****.JPG

Во-первых, необходимо определить, какие расширения файлов допускаются в нашей программе.

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

Затем использовать регулярное выражение, чтобы извлечь расширение файла из URL.

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

Создайте функцию get_image_url(), используя этот код. Она будет перебирать URL, пока вы не получите файл с подходящим расширением (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. Модифицируем код

Отлично! Теперь нам осталось заменить строку url = get_url() в функции bop() на url = get_image_url(). Ваш код должен выглядеть так:

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

def get_url():
    contents = requests.get('https://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()

Всё должно работать идеально. Этот код можно найти на моём GitHub.

Поздравляю с окончанием урока, теперь у вас есть классный бот для Telegram.

 

Перевод статьи Dzaky Widya Putra: Learn to build your first bot in Telegram with Python