TG Bot开发之对象篇---第一章:实现搜索引擎聚合

399 阅读3分钟

对象篇---第一章:实现搜索引擎聚合

该章节通过将市面上常见的搜索引擎聚合,从而介绍TG对象的使用方法

前提:你已经通过之前的教程知道如何接入ai模型,若还未掌握,请移步至

通义千问接入TG机器人 - 掘金 (juejin.cn)

功能:实现通过自定义命令/search调出搜索引擎选择菜单,点击按钮选择搜索引擎进行对话

以下代码在之前的教程基础上进行优化

机器人类ExecBot新增字段

// 用于跟踪用户的会话状态
private boolean isQwenChatMode = false;

修改更新方法

@Override
public void onUpdateReceived(Update update) {
    // 检查消息更新
    if (update.hasMessage()) {
        // 取出消息及聊天Id
        Message message = update.getMessage();
        Long chatId = message.getChatId();

        // 获取用户输入的消息文本
        String text = message.getText().trim();

        // 检查是否是 /search 命令
        if (text.equals("/search")) {
            sendSearchMenu(chatId);
        } else if (text.startsWith("/ask") && isQwenChatMode) {
            // 处理 /ask 命令,只有在与通义千问对话模式下才允许
            String question = text.substring(5).trim();
            String answer = getAnswerFromQianwen(question);
            sendMsg(answer, chatId);
        } else {
            // 其他消息处理
            if (isQwenChatMode) {
                // 如果在对话模式下,直接将消息视为问题
                String answer = getAnswerFromQianwen(text);
                sendMsg(answer, chatId);
            } else {
                sendMsg("请先使用 /search 命令调出菜单并选择与通义千问对话。", chatId);
            }
        }
    } else if (update.hasCallbackQuery()) {// 检查是否有回调查询
        // 处理回调查询
        CallbackQuery callbackQuery = update.getCallbackQuery();// 获取 CallbackQuery 对象
        String data = callbackQuery.getData();// 获取按钮的数据
        Long chatId = callbackQuery.getMessage().getChatId();// 获取消息的聊天 ID

        if ("qwen_chat".equals(data)) {
            // 用户点击了“与通义千问对话”按钮
            isQwenChatMode = true;
            sendMsg("你现在可以使用 /ask 问题 与通义千问对话。", chatId);
        } else if ("return_menu".equals(data)) {
            // 用户点击了“返回”按钮
            isQwenChatMode = false;
            sendSearchMenu(chatId);
        } else {
            // 处理其他按钮点击
            sendMsg("你点击了按钮: " + data, chatId);
        }
    }
}

Update对象表示传入的更新,比如接收到用户发来的新消息,就会获得新的更新,该对象的字段有

image.png

在这里我们介绍CallbackQuery回调查询对象,表示用户点击了内联键盘按钮后生成的回调查询,该对象的字段有

  • id (String): 回调查询的唯一标识符。
  • from (User): 发送回调查询的用户。
  • message (Message, 可选): 如果回调查询是通过内联键盘按钮发送的,则此字段包含该消息。
  • inline_message_id (String, 可选): 如果回调查询是通过内联消息中的内联键盘按钮发送的,则此字段包含该内联消息的唯一标识符。
  • chat_instance (String): 此回调查询所属的聊天实例的唯一标识符。
  • data (String, 可选): 内联键盘按钮上的数据。
  • game_short_name (String, 可选): 游戏的简短名称(仅当游戏按钮被点击时)。

新增调出菜单方法

private void sendSearchMenu(Long chatId) {
    InlineKeyboardMarkup markupInline = new InlineKeyboardMarkup();
    List<List<InlineKeyboardButton>> rowsInline = new ArrayList<>();

    // 第一行
    List<InlineKeyboardButton> row1 = new ArrayList<>();
    InlineKeyboardButton b1 = new InlineKeyboardButton();
    b1.setText("与通义千问对话");
    b1.setCallbackData("qwen_chat");
    InlineKeyboardButton b2 = new InlineKeyboardButton();
    b2.setText("选项2");
    b2.setCallbackData("option2");
    row1.add(b1);
    row1.add(b2);
    rowsInline.add(row1);

    // 第二行
    List<InlineKeyboardButton> row2 = new ArrayList<>();
    InlineKeyboardButton b3 = new InlineKeyboardButton();
    b3.setText("选项3");
    b3.setCallbackData("option3");
    InlineKeyboardButton b4 = new InlineKeyboardButton();
    b4.setText("返回");
    b4.setCallbackData("return_menu");
    row1.add(b3);
    row1.add(b4);
    rowsInline.add(row2);

    markupInline.setKeyboard(rowsInline);

    SendMessage sendMessage = SendMessage.builder()
            .text("请选择一个选项!")
            .chatId(chatId)
            .replyMarkup(markupInline)
            .build();

    try {
        execute(sendMessage);
    } catch (TelegramApiException e) {
        e.printStackTrace();
    }
}

InlineKeyboardMarkup该对象表示带有回复选项的自定义键盘,字段有

image.png

InlineKeyboardButton该对象表示嵌入式键盘的一个按钮。必须完全使用可选字段之一

image.png

sendMessage该TG方法用于发送消息,参数有

image.png

测试结果

image.png

根据自己需要,可以接入自己心仪的搜索引擎,动手试试吧!