Как сделать инлайн телеграм бота

Часы
10.01.2025
Глазик
34
Сердечки
0
Соединённые точки
0
Соединённые точки
0
Соединённые точки
0

Вступление

В данной статье я покажу как работает инлайн телеграм бот, как отправлять ответы и как эти ответы настраивать. Так же ты узнаешь как можно настроить переводы для твоего бота и конечно сможешь протестировать моего бота, @joker_gut_bot
В чём вообще суть inline режима ботов? Суть в том, что пользователь может отправлять ответы бота от своего имени в любые чаты. Некоторые такие боты внедрены в сам телеграм, например:
  1. @like
  2. @poll
  3. @gif
  4. @vid
  5. @pic
  6. @bing
  7. @wiki
  8. @imdb
  9. @bold
И ты конечно же можешь сделать свой собственный если потребуется.

Подготовка и установка необходимых пакетов

Нам будут необходимы следующие пакеты:
  1. Библиотека aiogram
  2. Библиотека Babel
Первая необходима для связи и работы с телеграм API. Библиотека Babel потребуется для переводов.
pip install Babel aiogram pandas
Токен бота я храню в отдельном файле под названием .env, сделай его. Он содержит лишь одну строку: BOT_TOKEN=1111111111:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Надеюсь к этому моменту у тебя уже есть токен бота и подготовлено виртуальное окружение для него. Никогда не устанавливай python-пакеты без соответствующего виртуального окружения.
Полную, базовую настройку телеграм бота ты можешь посмотреть в этой статье.

Пишем inline-бота

Переходим к непосредственному написанию бота. В файле main.py сделай импорт следующих модулей:
import asyncio
import logging
import sys
import uuid
from aiogram import F
from aiogram.types import Message, InlineQuery, InlineQueryResultArticle, InputTextMessageContent, InlineQueryResultPhoto
from aiogram.filters import Command
from config import bot_dispatcher, bot
После чего, в конец добавим точку входа и стандартные обработчики для запуска приложения и для помощи с его функционалом:
@bot_dispatcher.message(Command('help'))
async def help(message: Message):
await message.answer("Этот бот является примером того, как можно реализовать inline функционал для него.")
await message.answer("/startapp - запустить приложение")
await message.answer("@joker_gut_bot memes - запросить мемы для показа")
await message.answer("@joker_gut_bot greeting - запросить ответы по умолчанию")


@bot_dispatcher.message(Command("startapp"))
async def start_app(message: Message):
await message.answer("Этот бот является примером того, как можно реализовать inline функционал для него.")


async def main() -> None:
await bot_dispatcher.start_polling(bot)

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
asyncio.run(main())
Теперь в файле config.py добавим импортёр токена и роутер по умолчанию - bot_dispatcher:
from aiogram import Bot, Dispatcher

# Читает файл .env и отправляет токен телеграмму
with open(".env", "r") as file:
buffer = file.read()
line_pos = buffer.find("BOT_TOKEN")
TOKEN = buffer[buffer.find("=", line_pos) + 1:]

bot = Bot(TOKEN)
bot_dispatcher = Dispatcher(bot=bot)
Скелет бота готов. И его можно даже запустить, но никакого функционала он пока не предусматривает. Теперь начнём добавлять к нему функционал инлайн ботов. Всего телеграм поддерживает 20 инлайн-ответов:
  1. InlineQueryResultCachedAudio
  2. InlineQueryResultCachedDocument
  3. InlineQueryResultCachedGif
  4. InlineQueryResultCachedMpeg4Gif
  5. InlineQueryResultCachedPhoto
  6. InlineQueryResultCachedSticker
  7. InlineQueryResultCachedVideo
  8. InlineQueryResultCachedVoice
  9. InlineQueryResultAudio
  10. InlineQueryResultDocument
  11. InlineQueryResultGif
  12. InlineQueryResultMpeg4Gif
  13. InlineQueryResultPhoto
  14. InlineQueryResultVideo
  15. InlineQueryResultVoice
  16. InlineQueryResultContact
  17. InlineQueryResultGame
  18. InlineQueryResultLocation
  19. InlineQueryResultArticle
  20. InlineQueryResultVenue
Как видно, есть три группы ответов. Первая с корнем Cached, это значит бот будет брать данные из базы данных. Вторая группа без корня Cached. Они используют ссылки в качестве источника данных. И третья группа, состоит из тех ответов, которые не имеют аналога с Cached.
Показывать работу инлайн ботов буду на примере InlineQueryResultArticle и InlineQueryResulltPhoto. Добавим следующие функции в main.py:
import asyncio
import logging
import sys
import uuid
from aiogram import F
from aiogram.types import Message, InlineQuery, InlineQueryResultArticle, InputTextMessageContent, InlineQueryResultPhoto
from aiogram.filters import Command
from config import bot_dispatcher, bot


@bot_dispatcher.inline_query(F.query == "greeting")
async def send_greetings(inline_query: InlineQuery):
results = []
results.append(InlineQueryResultArticle(
id=str(uuid.uuid4()),
title="Обычное приветствие",
input_message_content=InputTextMessageContent(
disable_web_page_preview=True,
message_text="Приветствую я вас сегодня."
)
))
results.append(InlineQueryResultArticle(
id=str(uuid.uuid4()),
title="Жёсткое приветствие",
input_message_content=InputTextMessageContent(
disable_web_page_preview=True,
message_text="Ну чё, как дела"
)
))
results.append(InlineQueryResultArticle(
id=str(uuid.uuid4()),
title="Спокойное приветствие",
input_message_content=InputTextMessageContent(
disable_web_page_preview=True,
message_text="Привет"
)
))
await inline_query.answer(results)

@bot_dispatcher.inline_query(F.query == "memes")
async def send_user_images(inline_query: InlineQuery):
results = []
results.append(InlineQueryResultPhoto(
id=str(uuid.uuid4()),
photo_url="https://wisconsinskydivingcenter.com/wp-content/uploads/2024/05/you-dont-need-a-parachute-to-go-skydiving-meme.jpeg",
thumbnail_url="https://wisconsinskydivingcenter.com/wp-content/uploads/2024/05/you-dont-need-a-parachute-to-go-skydiving-meme.jpeg"
))
results.append(InlineQueryResultPhoto(
id=str(uuid.uuid4()),
photo_url="https://jungleroots.com/wp-content/uploads/2022/11/1_OkVxoXBTygSKB8K-zbB7uQ-300x176.jpeg",
thumbnail_url="https://jungleroots.com/wp-content/uploads/2022/11/1_OkVxoXBTygSKB8K-zbB7uQ-300x176.jpeg"
))
results.append(InlineQueryResultPhoto(
id=str(uuid.uuid4()),
photo_url="https://livestorm.imgix.net/1127/1651607695-obi-wan-alarm-work-meme.jpeg?h=auto&w=730&fm=jpeg&auto=format&q=90&dpr=1",
thumbnail_url="https://livestorm.imgix.net/1127/1651607695-obi-wan-alarm-work-meme.jpeg?h=auto&w=730&fm=jpeg&auto=format&q=90&dpr=1"
))
await inline_query.answer(results)

@bot_dispatcher.message(Command('help'))
async def help(message: Message):
await message.answer("Этот бот является примером того, как можно реализовать inline функционал для него.")
await message.answer("/startapp - запустить приложение")
await message.answer("@joker_gut_bot memes - запросить мемы для показа")
await message.answer("@joker_gut_bot greeting - запросить ответы по умолчанию")




@bot_dispatcher.message(Command("startapp"))
async def start_app(message: Message):
await message.answer("Этот бот является примером того, как можно реализовать inline функционал для него.")




async def main() -> None:
await bot_dispatcher.start_polling(bot)


if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
asyncio.run(main())

Обработчик send_greetings вызывается тогда, когда после имени бота пользователь написал greeting. Всё что она делает это запихивает в список 3 InlineQueryResultArticle и возвращает пользователю ответ на выбор. Вот так:
Обработчик send_user_images делает то же самое только с картинками, InlineQueryResultArticle.
Телеграм бот готов, осталось его только развернуть на сервере и вуаля, твой новый помощник готов. О том как это сделать я писал в отдельной статье, ооо, а вот и она. Более подробно о нём ты можешь ознакомиться здесь.

Делаем переводы(опционально)

Заключение

Я старался сделать статью про inline-ботов максимально простой и не перегруженной всякими базами данных или переводами. Но переводы я в конце концов включил ◑﹏◐. Все файлы и ресурсы бота ты сможешь найти на соответствующей странице инструментов. Чирс.


Комментарии

(0)
captcha
Отправить
Сейчас тут пусто. Буть первым (o゚v゚)ノ

Использованные термины

Релевантные вопросы

Похожие статьи

Создание токена и настройка телеграм бота

Часы
14.01.2025
В этой статье ты узнаешь как я начинаю создавать ботов для телеграмма, где храню токен и как настраиваю его. В том числе как включить inline режим для бота.

Как добавить переводы для твоего телеграм бота

Часы
14.01.2025
В этой статье я покажу, как я делаю телеграм боты многоязычными на aiogram. И сделаю я это при помощи пакета Babel на python. Ты так же узнаешь как обновлять переводы …