Laravel BotMan 2.6.1环境下如何获取消息ID删除最后一条机器人消息
你目前拿不到message_id有两个核心原因:
- BotMan默认Web驱动返回的消息payload不含
message_id字段,原生未做该参数的返回和挂载 - 你在ask回调中调用
$this->bot->getMessage()获取到的是用户提交的回答消息对象,不是机器人此前发送的提问消息对象,自然无法拿到对应ID
解决方案
步骤1:扩展自定义Web驱动,增加message_id返回
创建自定义驱动类替换原生Web驱动,每次发送消息时生成唯一ID并挂载到返回的消息对象中:
<?php namespace App\Drivers; use BotMan\Drivers\Web\WebDriver as BaseWebDriver; use Illuminate\Support\Str; class CustomWebDriver extends BaseWebDriver { public function sendPayload($payload, $endpoint = null) { // 生成唯一消息ID注入payload $payload['message_id'] = Str::uuid()->toString(); $response = parent::sendPayload($payload, $endpoint); // 将消息ID挂载到返回的消息对象,方便后续调用 $response->setId($payload['message_id']); return $response; } }
修改BotMan配置(Laravel环境下为config/botman/web.php),将驱动类替换为你自定义的CustomWebDriver完成注册。
步骤2:发送消息时存储message_id到缓存
调用say()或ask()发送机器人消息时,捕获返回的消息对象,提取ID存入Laravel缓存,关联当前用户ID避免串数据:
// 发送提问消息,拿到返回的消息对象 $questionMessage = $this->say('Ask me something?'); $userId = $this->bot->getUser()->getId(); // 存储最新的机器人消息ID,有效期可自行调整 cache()->put('last_bot_msg_id_'.$userId, $questionMessage->getId(), 3600); // ask场景同理,发送提问时就存储ID,不要到回调中再取 $this->ask($questionMessage, function($answer) { // 回调内处理逻辑 });
步骤3:调用删除接口
需要删除最后一条机器人消息时,直接从缓存读取对应ID填充参数即可:
$userId = $this->bot->getUser()->getId(); $apiParameters = [ 'chat_id' => $userId, 'message_id' => cache()->get('last_bot_msg_id_'.$userId) ]; $this->bot->sendRequest('deleteMessage', $apiParameters); // 可选:删除完成后清理缓存 cache()->forget('last_bot_msg_id_'.$userId);
内容的提问来源于stack exchange,提问作者Asadbek Fayzullaev
相关产品推荐
相关产品推荐

