在Telegram机器人生态中,Inline模式(内联模式)是一种极具特色的交互方式。它允许用户在不进入与机器人私聊窗口的情况下,直接在任意聊天中输入@你的机器人 + 查询关键词,从而触发机器人返回内联结果。这种模式极大地降低了使用门槛,提升了信息获取效率,被广泛应用于搜索、翻译、表情包、支付等场景。本文将从零开始,带你全面掌握Telegram机器人Inline模式的开发。
一、Inline模式与普通模式的区别
普通模式下,用户必须先打开机器人的聊天窗口,再发送指令或点击按钮,机器人才能响应。而Inline模式将机器人“嵌入”到任意会话中,用户无需切换窗口,只需在输入框中唤起机器人即可。关键区别在于:
- 触发方式:Inline模式通过输入
@botname + 查询触发;普通模式直接向机器人发送消息。 - 响应形式:Inline模式返回的是可点击的“内联结果列表”,用户点击后可直接发送到当前聊天;普通模式则直接回复消息。
- 应用场景:Inline模式更适合快速检索、内容分享;普通模式适合会话式交互、命令控制。
二、Inline模式的核心机制
每个支持Inline查询的机器人,在BotFather中开启Inline Mode后会获得一个内联查询处理器。当用户输入@botname query时,Telegram服务器会发送一个InlineQuery更新给机器人。机器人需要返回一个InlineQueryResult数组,每个结果包含标题、描述、消息内容或URL等。Telegram会将这些结果以列表形式展示,用户点击自己需要的结果,系统就会将对应的内容以消息形式插入当前聊天框。
关键点:
- 机器人必须在BotFather中启用Inline Mode。
- 机器人收到的是
inline_query更新,而非普通message更新。 - 响应结果必须在限定时间内返回,否则用户会看到“加载失败”。
- 结果可以包含文章、图片、音频、视频、GIF、地理位置等多种类型。
三、开发Inline模式前的准备
开始前,您需要确保以下条件已满足:
- 一个Telegram账号,并能访问BotFather。
- 一个已创建的机器人。如果还没有,可以在BotFather中使用
/newbot创建。 - 获取API Token,并配置好Webhook或长轮询(本文将以长轮询为例)。
- 准备开发环境,推荐Python 3.7+,安装
requests库。
四、实现Inline模式的步骤
我们以Python为例,使用requests库直接调用Bot API,避免引入额外框架,方便理解底层逻辑。
步骤1:在BotFather中开启Inline Mode
与BotFather对话,发送/setinline,选择你的机器人,然后设置一个简短的内联占位符,例如“搜索关键词”。这样用户输入@botname时会看到灰色提示文字。
步骤2:编写长轮询代码,处理inline_query更新
import requests
import json
token = 'YOUR_BOT_TOKEN'
url = f'https://api.telegram.org/bot/'
def get_updates(offset=None):
params = {'timeout': 25, 'offset': offset}
resp = requests.get(url + 'getUpdates', params=params)
return resp.json()['result']
def answer_inline_query(inline_query_id, results):
data = {
'inline_query_id': inline_query_id,
'results': json.dumps(results)
}
resp = requests.post(url + 'answerInlineQuery', data=data)
return resp.json()
def handle_inline_query(query):
q = query.get('query', '')
# 示例:返回两个简单的文本结果
results = [
{
'type': 'article',
'id': '0',
'title': '你好',
'message_text': f'你查询了:,这是第一条结果'
},
{
'type': 'article',
'id': '1',
'title': '再见',
'message_text': f'你查询了:,这是第二条结果'
}
]
return answer_inline_query(query['id'], results)
def main():
offset = None
while True:
updates = get_updates(offset)
for update in updates:
offset = update['update_id'] + 1
if 'inline_query' in update:
handle_inline_query(update['inline_query'])
if __name__ == '__main__':
main()
上面的代码中,answerInlineQuery用于返回结果。results是一个JSON数组,每个元素代表一个结果。实际应用中,你可以根据查询内容动态生成结果,比如从数据库或第三方API查询。
步骤3:丰富结果类型
除了文本框(article),Telegram还支持其他类型的结果,例如:
photo:发送图片,可指定photo_url和缩略图。gif:动画GIF,类似图片。audio:音频文件。video:视频文件。location:地理位置。
你可以根据场景灵活返回不同类型。例如一个表情包机器人,可以返回多个photo结果。
五、Inline键盘与Inline查询的区别
很多初学者容易混淆这两个概念。简单来说:
- Inline键盘(Inline Keyboard):这是附着在消息下方的可点击按钮,属于普通消息的一部分,用于引导用户操作,例如“点击打开网页”、“下一张”。
- Inline查询(Inline Query):用户主动通过
@bot调用的内联结果入口,返回的是“搜索结果”列表,点击后才发送消息。
二者可以结合:Inline查询返回的结果消息可以附带Inine键盘,形成更丰富的交互。
六、实用技巧与注意事项
- 缓存与时效:Telegram允许你设置
cache_time,缓存结果,减少重复计算。但对于动态数据,建议设为0。 - 分页与偏移:当用户滚动结果时,Telegram会发送带
offset的更新,你需要根据游标返回下一批结果。 - 安全校验:务必验证请求是否来自Telegram,尤其是使用Webhook时。
- 错误处理:如果
answerInlineQuery失败,例如结果ID重复,Telegram会返回错误信息,建议记录日志。 - 隐私模式:BotFather中
/setprivacy可以控制机器人是否接收所有群组消息;对于Inline模式,建议关闭隐私模式,以便在群组中正常工作。 - 性能优化:如果返回大量图片,建议压缩缩略图尺寸,减少加载时间。
七、实战案例:一个简单的搜索机器人
假设我们要创建一个文档搜索机器人,用户内联查询时返回数据库中的匹配文档。核心逻辑如下:
def handle_inline_query(query):
q = query.get('query', '')
docs = search_docs(q) # 你的数据库搜索函数
results = []
for idx, doc in enumerate(docs):
results.append({
'type': 'article',
'id': str(idx),
'title': doc['title'],
'description': doc['snippet'],
'message_text': f"标题:{doc['title']}\n内容:{doc['body']}"
})
return answer_inline_query(query['id'], results)
这样,用户在任意聊天中输入@mybot 关键词,即可快速把搜索结果发送出去,体验流畅。
结束语
Telegram机器人的Inline模式是构建高效工具和交互式服务的重要能力。通过本文的学习,你已经掌握了从开启到实现的完整流程。建议结合官方Bot API文档,尝试用不同类型的结果扩展功能。开发过程中注意测试各种边界情况,让机器人更加稳定。现在就动手打造你的第一个Inline机器人吧!