Telegraf如何编辑机器人最后发送消息 editMessageText报错解决
报错原因
- 上下文快捷方法调用逻辑错误:Telegraf中
ctx.editMessageText是绑定当前触发对象的快捷方法,仅在回调查询(用户点击内联按钮)场景下默认绑定按钮所属的机器人消息;当前场景是用户发送文本触发的message类型上下文,该方法默认指向用户发送的入站消息,机器人没有编辑普通用户消息的权限,因此直接调用会抛出TypeError: Telegraf: "editMessageText" isn't available for "message"错误。 - 消息ID取值错误:你传入的
ctx.from是发送消息的用户对象,不存在message.id属性;机器人自己发送的消息ID,不可能从用户对象上获取。 - 方法传参格式错误:即使拿到了正确的消息ID,
ctx.editMessageText的入参规则也不是(用户ID、消息ID、文本)的顺序,直接传参会触发参数校验失败。
正确实现方法
ctx.reply是异步方法,执行后返回的Promise resolve结果就是刚发送成功的消息对象,其中包含机器人发出消息的message_id字段。拿到该ID后,调用ctx.telegram实例上的原生editMessageText方法,传入对应参数即可完成编辑。
可直接运行的示例代码:
bot.hears('hi', async (ctx) =>{ try{ // 接收发送成功的机器人消息对象 const sentMessage = await ctx.reply('hello') // 调用编辑接口,参数顺序:聊天ID、待编辑消息ID、内联消息ID(普通消息传undefined)、新文本内容 await ctx.telegram.editMessageText( ctx.chat.id, sentMessage.message_id, undefined, "second text" ) }catch(e){ console.log(e) } })
注意事项:
- 仅支持编辑机器人发送后48小时内的消息,超过时限Telegram接口会返回权限错误
- 如果要编辑的是内联查询发送的消息,不需要传chatId和messageId,第三个参数传入对应inlineMessageId即可
内容的提问来源于stack exchange,提问作者VeryBadProgramistFopa
相关产品推荐
相关产品推荐

