基于Telegraf开发Telegram Bot:实时内联搜索实现咨询
用Telegraf实现Telegram Bot实时内联搜索指南
嘿,刚好做过类似的功能,用Telegraf实现这种@gif风格的实时内联搜索其实逻辑很清晰,我给你拆解下核心要点和实操步骤~
先搞懂核心原理
你要的实时搜索效果,本质是Telegram的Inline Mode:用户在聊天框输入@你的Bot名 关键词时,Bot会实时接收查询请求,返回结构化的结果列表,用户点击条目后直接把对应内容发送到聊天中。
Telegraf里的关键工具
Telegraf已经把Telegram的Inline Mode做了友好封装,核心用到这几个:
bot.on('inline_query', handler):监听用户发起的内联查询事件,用户输入@Bot名 关键词就会触发这个回调。ctx.answerInlineQuery(results, options):向用户返回搜索结果的核心方法,第一个参数是符合格式的结果数组,第二个是配置项(比如缓存时间)。- InlineQueryResult系列类型:Telegram要求返回的结果必须是指定格式的对象,常用的
article类型适合文本/链接类内容,gif/photo则对应多媒体内容。
一步步落地实现
1. 先给Bot开Inline Mode权限
这步很容易忘!打开Telegram找BotFather,发送/setinline,选择你的Bot,然后设置提示文字(比如"输入关键词搜索内容"),这样用户输入@你的Bot名时会看到引导提示。
2. 编写核心代码示例(Telegraf v4)
下面是完整的可运行示例,我加了详细注释:
const { Telegraf } = require('telegraf'); // 替换成你的Bot Token const bot = new Telegraf('YOUR_BOT_TOKEN'); // 监听内联查询事件 bot.on('inline_query', async (ctx) => { // 获取用户输入的搜索关键词 const userQuery = ctx.inlineQuery.query.trim(); // 这里替换成你的真实搜索逻辑:调用第三方API、查询数据库等 // 用模拟数据演示效果 let searchResults = []; if (userQuery) { // 假设搜索到两条结果 searchResults = [ { id: 'res_1', title: `${userQuery} - 结果1`, desc: '这是第一条搜索结果的描述', content: `你选择了【${userQuery} - 结果1】` }, { id: 'res_2', title: `${userQuery} - 结果2`, desc: '这是第二条搜索结果的描述', content: `你选择了【${userQuery} - 结果2】` } ]; } else { // 用户未输入关键词时的引导提示 searchResults = [ { id: 'default', title: '请输入关键词', desc: '输入后会实时展示搜索结果', content: '你还没有输入搜索关键词哦~' } ]; } // 把自定义结果转换成Telegram要求的格式 const inlineResults = searchResults.map(item => ({ type: 'article', // 结果类型:文章(适合文本内容) id: item.id, // 每个结果的唯一ID,不能重复 title: item.title, // 结果标题(用户可见) description: item.desc, // 结果描述(用户可见) // 用户点击后发送到聊天的内容 input_message_content: { message_text: item.content } })); // 返回结果:cache_time设为0表示实时更新,不缓存旧结果 await ctx.answerInlineQuery(inlineResults, { cache_time: 0 }); }); // 启动Bot bot.launch();
3. 优化与注意事项
- 缓存控制:
cache_time默认300秒(5分钟),实时搜索建议设为0,确保用户每次输入都触发新查询;静态内容可以设长一点减少服务器压力。 - 结果数量限制:Telegram最多允许返回50个结果,你的搜索逻辑要把结果数控制在50以内。
- 响应时效:Telegram要求内联查询必须在3秒内完成,调用第三方API时要确保接口响应快,避免超时。
- 多媒体适配:如果要做@gif那样的动图搜索,只需把
type改成gif,并配置gif_url等对应字段即可,Telegraf支持所有Telegram定义的结果类型。
测试方法
启动Bot后,打开任意聊天框,输入@你的Bot名 测试关键词,就能看到实时弹出的搜索结果列表,点击条目会自动把内容发送到聊天中~
内容的提问来源于stack exchange,提问作者Kamran Hosseini
相关产品推荐
相关产品推荐

