内联模式(Inline Mode)是Telegram机器人最具特色的功能之一,它允许用户在任何聊天窗口中直接输入 @你的机器人 关键词 来触发查询,并即时选择机器人返回的结果进行发送。这种模式无需提前添加机器人到群组或私聊,极大提升了机器人的使用便捷性与传播力。本文将基于Telegram官方Bot API,手把手教你如何开启内联模式、处理内联查询,并提供完整的代码示例与常见问题排查指南。
什么是Telegram机器人内联模式?
启用内联模式后,机器人可以处理用户在任意聊天界面中通过 @机器人用户名 引发的查询。用户输入前缀和内容后,客户端会向机器人发送一个 InlineQuery 更新。机器人需要尽快返回一个结果列表(例如文章、图片、视频等),这些结果会实时展示给用户,点击即可发送到当前聊天。
与普通聊天的区别在于:普通聊天要求用户先与机器人建立会话,而内联模式可以“无处不在”。这使得内联机器人非常适合做搜索、翻译、工具类应用,例如GIF搜索、百科查询等。
开启内联模式的前提条件
要使用内联模式,必须先在 BotFather 中为你的机器人开启该功能。步骤如下:
- 在Telegram中打开 @BotFather,发送
/mybots选择要配置的机器人。 - 点击 Bot Settings,然后选择 Inline Mode,再点击 Turn on 开启。
- (可选)点击 Edit Inline Placeholder,设置输入
@机器人后显示的占位文字,例如“搜索文章或输入关键词”。 - 记下你的API Token(在
/token中获取),后续调用接口需要用到。
请注意:内联模式默认是关闭的,必须经过以上步骤才能生效。此外,机器人必须允许在群组中使用(在BotFather的Group Privacy中关闭,否则可能限制内联查询)。
处理内联查询的核心API:answerInlineQuery
当用户发起内联查询后,你的服务器会收到一个 InlineQuery 对象,其中包含 id、query(用户输入的搜索词)、offset(分页参数)等字段。你需要调用 answerInlineQuery 方法向Telegram返回最多50个结果。
官方方法参数如下(以HTTP示例):
POST https://api.telegram.org/bot<token>/answerInlineQuery
{
"inline_query_id": "查询的唯一ID",
"results": [
{
"type": "article",
"id": "unique_result_id_1",
"title": "结果标题",
"input_message_content": {
"message_text": "发送到聊天中的内容"
}
}
],
"cache_time": 300,
"is_personal": false
}
- inline_query_id:必填,从收到的InlineQuery更新中获取。
- results:必填,一个JSON数组,元素是InlineQueryResult对象。最常用的是
InlineQueryResultArticle,需要提供title和input_message_content。 - cache_time:可选,结果缓存时间(秒)。合理设置可减少重复计算,但可能造成更新延迟。
- is_personal:可选,为true时,不同用户看到的结果各自独立缓存,适用于个性化查询。
- next_offset:可选,用于分页,当需要加载更多结果时传入该值触发新的查询。
Telegram还支持其他结果类型,如照片(photo)、视频(video)、音频(audio)、贴纸(sticker)等,它们分别对应不同的参数结构。开发者可根据实际需求选择。
实战:使用python-telegram-bot库实现内联查询响应
python-telegram-bot是官方推荐的Python封装库,下面演示一个简单的内联机器人,它根据用户输入的内容返回一篇文章结果。
首先安装库:
pip install python-telegram-bot
然后编写代码(版本v20.x):
import logging
from telegram import InlineQueryResultArticle, InputTextMessageContent, Update
from telegram.ext import Application, InlineQueryHandler, ContextTypes
# 启用日志
logging.basicConfig(level=logging.INFO)
async def inline_query_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
query = update.inline_query.query
if not query:
# 查询为空时返回提示
results = [
InlineQueryResultArticle(
id="empty",
title="请输入搜索关键词",
input_message_content=InputTextMessageContent("你还没有输入内容哦")
)
]
await update.inline_query.answer(results, cache_time=0)
return
# 构造一个简单的文章结果
results = [
InlineQueryResultArticle(
id="1",
title=f"搜索结果:",
description="点击发送这条消息",
input_message_content=InputTextMessageContent(f"你查询的是:")
)
]
# 响应内联查询
await update.inline_query.answer(results, cache_time=0)
def main() -> None:
# 替换成你自己的Token
application = Application.builder().token("YOUR_BOT_TOKEN").build()
application.add_handler(InlineQueryHandler(inline_query_handler))
application.run_polling()
if __name__ == "__main__":
main()
运行代码后,在任意聊天中键入 @你的机器人 你好,就会看到机器人返回一个“搜索结果:你好”的卡片,点击即可发送。
如果你的机器人需要处理更复杂的业务,比如搜索数据库,可以在 query 参数中进行匹配,并通过 next_offset 实现分页。注意每次响应时间不超过10秒,否则用户会看到超时提示。
常见错误与排查
- 收不到InlineQuery更新:确认已在BotFather中开启内联模式,且没有启用隐私模式(如果群组中也想响应)。另外,确保长轮询或Webhook已正确设置。
- 结果不显示:检查results数组是否为空,每个结果必须具有唯一的id,且必须包含
input_message_content(对于article类型)。 - 提示“QUERY_ID_INVALID”:可能是重复使用了同一个inline_query_id,或者响应超时。每个查询ID只能处理一次任务。
- 需要分页:当结果较多时,使用
next_offset参数。用户点击“部分结果”时,Telegram会以新的offset再次调用。 - 数据隐私:如果不想让Telegram缓存结果,可设置
cache_time=0。对于敏感数据,建议使用is_personal=true配合缓存隔离。
总结
内联模式是Telegram机器人从“聊天工具”进化为“系统级助手”的关键一步。通过本文的介绍,你应该已经掌握了开启内联模式的步骤、理解answerInlineQuery的核心参数,并能用Python快速实现一个内联查询响应机器人。接下来,你可以尝试将内联查询与自己的服务、数据库相结合,创造出诸如快查词典、OCR识别、链接预览等实用工具。
更多官方资料可参考Telegram Bot API文档中的 InlineQuery 部分,或查看你的机器人所在平台的开发指南。祝开发顺利!