Telegram机器人如何开启内联模式并响应查询?官方方法详解与实战教程

本文详细讲解Telegram机器人内联模式(Inline Mode)的开启方法,以及如何通过官方API处理内联查询并返回结果,附有Python代码实战示例与常见错误排查指南。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

内联模式(Inline Mode)是Telegram机器人最具特色的功能之一,它允许用户在任何聊天窗口中直接输入 @你的机器人 关键词 来触发查询,并即时选择机器人返回的结果进行发送。这种模式无需提前添加机器人到群组或私聊,极大提升了机器人的使用便捷性与传播力。本文将基于Telegram官方Bot API,手把手教你如何开启内联模式、处理内联查询,并提供完整的代码示例与常见问题排查指南。

什么是Telegram机器人内联模式?

启用内联模式后,机器人可以处理用户在任意聊天界面中通过 @机器人用户名 引发的查询。用户输入前缀和内容后,客户端会向机器人发送一个 InlineQuery 更新。机器人需要尽快返回一个结果列表(例如文章、图片、视频等),这些结果会实时展示给用户,点击即可发送到当前聊天。

与普通聊天的区别在于:普通聊天要求用户先与机器人建立会话,而内联模式可以“无处不在”。这使得内联机器人非常适合做搜索、翻译、工具类应用,例如GIF搜索、百科查询等。

开启内联模式的前提条件

要使用内联模式,必须先在 BotFather 中为你的机器人开启该功能。步骤如下:

  1. 在Telegram中打开 @BotFather,发送 /mybots 选择要配置的机器人。
  2. 点击 Bot Settings,然后选择 Inline Mode,再点击 Turn on 开启。
  3. (可选)点击 Edit Inline Placeholder,设置输入 @机器人 后显示的占位文字,例如“搜索文章或输入关键词”。
  4. 记下你的API Token(在 /token 中获取),后续调用接口需要用到。

请注意:内联模式默认是关闭的,必须经过以上步骤才能生效。此外,机器人必须允许在群组中使用(在BotFather的Group Privacy中关闭,否则可能限制内联查询)。

处理内联查询的核心API:answerInlineQuery

当用户发起内联查询后,你的服务器会收到一个 InlineQuery 对象,其中包含 idquery(用户输入的搜索词)、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,需要提供 titleinput_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 部分,或查看你的机器人所在平台的开发指南。祝开发顺利!

FAQ

下载与安装

常见问题

为什么我的Telegram机器人无法响应内联查询?

可能原因包括:未在BotFather中开启内联模式(/setinline)、机器人启用了隐私模式导致群组内不响应、Webhook或长轮询未正确配置,或代码中未处理InlineQueryHandler。请逐一检查。

内联查询结果数量有限制吗?

Telegram官方规定每次answerInlineQuery最多返回50个结果。如果需要展示更多,可通过分页机制,使用next_offset参数让用户翻页。

内联查询如何实现分页?

在响应answerInlineQuery时设置next_offset字段,当用户点击“加载更多”时,Telegram会发送一个新的InlineQuery,其offset字段就是你设置的next_offset值。然后根据offset返回下一批结果。

内联模式能否返回图片或视频?

可以。Telegram支持多种结果类型,如照片(InlineQueryResultPhoto)、视频(InlineQueryResultVideo)等。只需在results数组中指定相应类型的对象,并提供对应的URL或文件ID即可。

内联查询的cache_time和is_personal参数有何作用?

cache_time控制结果在Telegram服务器上的缓存时间(秒),为0表示不缓存。is_personal为true时,缓存结果只对当前用户有效,常用于个性化内容,避免数据泄露。