Skip to main content

Inline-бот

Бот который отвечает на запросы @bot xxx в любом чате.

Минимальный пример (Python + aiogram)

import asyncio, os
from aiogram import Bot, Dispatcher
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer
from aiogram.types import (
InlineQuery, InlineQueryResultArticle, InputTextMessageContent
)
from uuid import uuid4

session = AiohttpSession(api=TelegramAPIServer.from_base('https://api.telefon.chat'))
bot = Bot(token=os.environ['BOT_TOKEN'], session=session)
dp = Dispatcher()

# Простая база данных
ARTICLES = [
{'title': 'Python — что это', 'text': 'Python — это динамический язык программирования...'},
{'title': 'JavaScript — что это', 'text': 'JavaScript — язык для веб-разработки...'},
{'title': 'Go — что это', 'text': 'Go — компилируемый язык от Google...'},
]

@dp.inline_query()
async def search(query: InlineQuery):
q = query.query.lower().strip()
matches = [a for a in ARTICLES if q in a['title'].lower()] or ARTICLES[:3]

results = []
for a in matches[:50]:
results.append(InlineQueryResultArticle(
id=str(uuid4()),
title=a['title'],
description=a['text'][:80] + '...',
input_message_content=InputTextMessageContent(message_text=a['text'])
))

await query.answer(results, cache_time=60, is_personal=False)

if __name__ == '__main__':
asyncio.run(dp.start_polling(bot))

Включить inline-режим

В @botmaker → бот → «Изменить» → toggle «Inline-режим». Без этого Telefon не будет принимать inline-запросы.

Что покрывает

  • inline_query event
  • answerInlineQuery с результатами
  • InlineQueryResultArticle — самый универсальный тип

Расширения

  • Картинки/видео: InlineQueryResultPhoto, InlineQueryResultVideo, InlineQueryResultGif
  • Из кеша: *_cached_* варианты для уже загруженных файлов
  • Пагинация: next_offset параметр в answerInlineQuery

См. также Inline-режим, Типы результатов.