如何在telegraf-js v4.4.1的sendToAdmin函数中编辑getMessage发送的消息
解决方案
你可以通过 ctx.wizard.state 存储需要跨步骤传递的消息标识,实现第二步编辑第一步发送的消息,修改后的代码如下:
import { Context, Scenes } from "telegraf"; // 可选:定义WizardState的TS类型,避免类型报错 interface MyWizardSession extends Scenes.WizardSessionData { targetMsg: { chat_id: number | string message_id: number } } type MyContext = Context & Scenes.WizardContext<MyWizardSession> async function getMessage(ctx: MyContext) { // 调用editMessageText后会返回修改后的消息对象,从中提取标识存入state const sentMsg = await ctx.editMessageText("text"); // 仅当编辑成功时存储标识(editMessageText可能返回boolean表示失败) if (typeof sentMsg !== "boolean") { ctx.wizard.state.targetMsg = { chat_id: sentMsg.chat.id, message_id: sentMsg.message_id } } return ctx.wizard.next(); } async function sendToAdmin(ctx: MyContext) { const { targetMsg } = ctx.wizard.state; if (targetMsg) { // 传入存储的chat_id和message_id即可编辑指定消息 await ctx.editMessageText("修改后的新内容", { chat_id: targetMsg.chat_id, message_id: targetMsg.message_id }); } return ctx.wizard.leave(); } const superWizard = new Scenes.WizardScene<MyContext>( "scene-id", // 注意WizardScene第一个参数需要传场景唯一ID,你原代码漏了这个参数 getMessage, sendToAdmin );
注意事项
- 原代码里初始化
WizardScene时漏掉了第一个必填的场景唯一ID参数,需要补充否则会报错 ctx.editMessageText如果没有传入chat_id和message_id,默认会编辑当前触发交互的消息,所以必须显式传入第一步存储的两个标识才能编辑目标消息
内容的提问来源于stack exchange,提问作者user16662077
相关产品推荐
相关产品推荐

