Как создать бота для Telegram | Бот отправляющий изображения котов
Боты для телеграмма сейчас весьма популярны, давайте и мы научимся делать своих.
ЯП который мы будем использовать, как всегда Python. Напишем простого бота, который по заданной команде будет присылать нам котиков, а еще добавим кнопку, чтобы не вводить команды каждый раз. Вот рабочий пример (надеюсь к моменту твоего прочтения, я его еще буду хостить).
И итог того, что должно получиться:
Подготовка
Для начала мы будем исходить из того, что Python3 уже установлен и из командной строки прекрасно работает >_ python и >_ pip. Сидим мы из под Linux или Windows неважно.
Для работы с телеграмом будем использовать эту библиотеку, для установки необходима командная строка с правами администратора.
И ввод одной команды.
pip install python-telegram-bot --upgrade
Ну или двух :).
pip install requests
Также нужно создать непоcредственно самого бота и получить токен, для этого нужно написать в самом телеграмме @BotFather'у /newbot и следовать инструкциям. В конце вы получите токен, который уже можно использовать.
Не забудем и про добавление команды
Пишем код
В принципе, многое уже и так есть в примерах в репозитории и заново ничего придумывать не надо, мы лишь изменим и дополним то, что уже есть.
И так поехали, берем из примеров простого бота echobot2, который уже умеет отвечать на все сообщения и знает команды /help /start. Отвечалку на все сообщения мы изменим, команды тоже немного поменяем и добавим свою /cat, которая собственно и будет постить котиков :3.
Для начала подставляем ранее полученный токен, необходимый для работы.
Смотрим дальше и видим, что все обработчики в боте (команды, текст и тд) находятся в функции main и добавляются как dp.add_handler
Как вы можете заметить, событие использования команды в чате состоит из двух частей: текст команд и функции, которая вызывается при ее использовании.
По тому же принципу добавим свою команду строкой
dp.add_handler(CommandHandler("cat", sendcat)), где cat — это команда , sendcat — вызываемая функция при получение данной команды.
Остальные хендлеры трогать не будем, а поменяем лишь вызываемые ими функции.
Так например по умолчанию функция echo отправляет пользователю тот же самый текст что он и прислал.
Изменим отправляемый текст на сообщение об ошибке
Также изменим отправляемый текст на /start и /help
Украшательства закончены. Приступим к котикам :).
Котики у нас будут состоять из двух функций. Первую вы уже видели в хендлере — sendcat, она будет отвечать за отправку, но встает вопрос, а что же нам собственно отправлять? Тут мы будем использовать вторую функцию getcat которая будет отвечает за предоставление ссылок на картинки с котиками, брать которые мы будет с сайта thecatapi. Его апи позволяет получать ссылки на случайные картинки с котами, чем мы и воспользуемся.
Подключаем библиотеку requests и пишим простенькую функцию выдающию ссылки на картинки с котиками. Потом просто вызываем ее в sendcat.
Проверим что получилос. Запускаем наш скрипт, ищем в телеграмме бота по нику, который вы задали ему при создании и... Котики !!!
Уже неплохо, но что-то все равно не то. Мы отправляем котов не как картинки, а как ссылки, телеграм конечно их подгружает и показывает, но решение так себе. Исправим же это, открываем документацию по работе с апи телеграма для ботов и ищем метод отправки картинок.
Возвращаемся обратно и в функции sendcat заменяем всю строку отправки сообщения на bot.sendPhoto(chat_id=update.message.chat_id, photo=getcat())
Результат
Почти все готово, осталось сделать кнопку в чате, чтобы не вписывать постоянно команду вручную.
Использовать мы будем Inline клавиатуру (прямо в чате которая), она состоит из двух функций: первая отвечает за отрисовку (markup), вторая за обработку нажатий (callback).
Снова идем в примеры, которые даются авторами библиотеки, вытаскиваем вот это и переделываем под себя.
Кое-что доподключаем:
В итоге получается
Проверяем
Исходный код
import requests
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler
import logging
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
"""Приветствие"""
update.message.reply_text('Привет, я бот, который очень любит котиков :3\nНапиши мне /cat и я поделюсь ими с тобой')
def help(bot, update):
"""Сообщение для помощи с командами"""
update.message.reply_text('Чтобы получить котика напиши /cat')
def echo(bot, update):
"""На любой текст отвечаем ошибкой"""
update.message.reply_text("Неизвестная команда :(")
def error(bot, update, error):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, error)
def getcat():
'''Получение ссылки на картинку с котиком'''
try:
r = requests.get('http://thecatapi.com/api/images/get?format=src')
url = r.url
except:
url = get_cat()
print('Error with cat parsing')
pass
return url
def sendcat(bot, update):
"""Отправка котиков"""
bot.sendPhoto(chat_id=update.message.chat_id, photo=getcat(), reply_markup=draw_button())
def draw_button():
keys =[[InlineKeyboardButton('?Еще котика?!?', callback_data='1')]]
return InlineKeyboardMarkup(inline_keyboard=keys)
def get_callback_from_button(bot, update):
query = update.callback_query
username = update.effective_user.username
chat_id = query.message.chat.id
message_id = query.message.message_id
if int(query.data) == 1:
bot.sendPhoto(photo=getcat(),
chat_id=chat_id,
message_id=message_id,
reply_markup=draw_button())
def main():
"""Start the bot."""
# Create the EventHandler and pass it your bot's token.
updater = Updater("СЮДА ВАШ ТОКЕН")
# Get the dispatcher to register handlers
dp = updater.dispatcher
dp.add_handler(CallbackQueryHandler(get_callback_from_button))
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help))
dp.add_handler(CommandHandler("cat", sendcat))
# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.text, echo))
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()
F.A.Q
- Q: Т.к бот каждый раз запрашивает картинку, а потом еще и загружает ее в мессенджер, уходит масса времени. Как ускорить выдачу ответов?
- A: Решение — использовать сервера Telegram, как кеш. Сохраняйте при отправке фото их media_id (куда нибудь в бд), чтобы потом можно было быстренько его оттуда вытянуть и отправить.
- Q: А как сделать ребут, админку, оформить тексты т.д ?
- A: Здесь есть отличные сниппеты
- Q: Как осуществить ... ?
- A: Документация Telegram bot api, Вики библиотеки