You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:15:03