对象篇---第一章:实现搜索引擎聚合
该章节通过将市面上常见的搜索引擎聚合,从而介绍TG对象的使用方法
前提:你已经通过之前的教程知道如何接入ai模型,若还未掌握,请移步至
功能:实现通过自定义命令/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对象表示传入的更新,比如接收到用户发来的新消息,就会获得新的更新,该对象的字段有
在这里我们介绍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该对象表示带有回复选项的自定义键盘,字段有
InlineKeyboardButton该对象表示嵌入式键盘的一个按钮。必须完全使用可选字段之一
sendMessage该TG方法用于发送消息,参数有
测试结果
根据自己需要,可以接入自己心仪的搜索引擎,动手试试吧!