修改机器人菜单
效果展示
- 修改之前:
image.png
-
修改之后:
image.png
修改方法
向telegram发送一个https请求,请求内容包含修改的菜单按钮名称type指定web_app
,text为修改后的菜单按钮名称,webapp内的url为跳转链接,链接中bot后面填入你需要修改机器人的token即可
请求链接如下:
curl -X POST "https://api.telegram.org/bot1234567890:abcdefghijklmnopqrstuvwxyzFGHIGKLMN/setChatMenuButton" -H "Content-Type: application/json" -d '{"menu_button":{"type":"web_app","text":"Open","web_app":{"url":"https://t.me/xxx_xx_bot/123456"}}}'
自动回复
tg的机器人使用很简单 只需要继承TelegramLongPollingBot 然后初始化这个类就行。
发送消息类型包含很多种:
普通文本消息
最为简单的一种,new一个SendMessage
对象 设置chatId及text即可
//回复普通文本消息
public void sendMsg(String text, Long chatId) {
if (null == mUsername || null == mToken) {
log.error("TelegramInit sendMsg no set token or username!");
return;
}
SendMessage response = new SendMessage();
response.setChatId(String.valueOf(chatId));
response.setText(text);
try {
execute(response);
} catch (TelegramApiException e) {
log.debug("TelegramInit sendMsg error:" + e.getLocalizedMessage());
}
}
图文消息
一张图片并带有文字,图片会显示在文字上方
// 发送图文消息
private void sendMsgWithImage(Long chatId, String text, String imageUrl) {
// 创建 SendPhoto 对象
SendPhoto message = new SendPhoto();
message.setChatId(chatId);
// 设置图片文件路径或 URL
InputFile inputFile = new InputFile(imageUrl);
message.setPhoto(inputFile);
// 设置图片说明
message.setCaption(text);
// 设置文本格式为 HTML
message.setParseMode("HTML");
try {
execute(message); // 发送带图片和文字的消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
带按钮消息
消息会被渲染成按钮的格式,点击按钮即可跳转到对应链接,这个相当于超链接的升级版。
按钮布局可以是多行多列,一个InlineKeyboardButton
相当于一个按钮,List<InlineKeyboardButton> 就是一行多个按钮,List<List<InlineKeyboardButton>>就是多行多列的按钮
/**
* 发送带按钮的消息
* 按钮为多行
*
* @author wds
* @DateTime 2025/1/6 11:33
*/
private void sendMsgWithButtonInline(Long chatId, String text, List<List<InlineKeyboardButton>> keyboard) {
// 创建内联键盘布局
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
inlineKeyboardMarkup.setKeyboard(keyboard);
// 发送带按钮的消息
SendMessage message = new SendMessage();
message.setChatId(chatId);
message.setText(text);
message.setReplyMarkup(inlineKeyboardMarkup);
try {
execute(message); // 调用 Telegram API 发送消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
/**
* 发送带按钮的消息
* 按钮为一行多列
*
* @param chatId
* @param rows
*/
private void sendMsgWithButton(Long chatId, String text, List<InlineKeyboardButton> rows) {
// 创建内联键盘
List<List<InlineKeyboardButton>> keyboard = new ArrayList<>();
keyboard.add(rows);
// 创建内联键盘布局
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
inlineKeyboardMarkup.setKeyboard(keyboard);
// 发送带按钮的消息
SendMessage message = new SendMessage();
message.setChatId(chatId);
message.setText(text);
message.setReplyMarkup(inlineKeyboardMarkup);
try {
execute(message); // 调用 Telegram API 发送消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
代码如下:
public class TelegramBot extends TelegramLongPollingBot {
private String mToken;
private String mUsername;
public TelegramBot(String token, String username, DefaultBotOptions options) {
super(options);
mToken = token;
mUsername = username;
}
@Override
public String getBotUsername() {
return mUsername;
}
@Override
public String getBotToken() {
return mToken;
}
@Override
public void onUpdateReceived(Update update) {
// 检查是否是消息更新
if (update.hasMessage() && update.getMessage().hasText()) {
Message message = update.getMessage();
log.info("message:" + JacksonUtils.toJson(message));
Long chatId = message.getChatId();
String text = message.getText();
}
//回复普通文本消息
public void sendMsg(String text, Long chatId) {
if (null == mUsername || null == mToken) {
log.error("TelegramInit sendMsg no set token or username!");
return;
}
SendMessage response = new SendMessage();
response.setChatId(String.valueOf(chatId));
response.setText(text);
try {
execute(response);
} catch (TelegramApiException e) {
log.debug("TelegramInit sendMsg error:" + e.getLocalizedMessage());
}
}
/**
* 发送带按钮的消息
* 按钮为多行
*
* @author wds
* @DateTime 2025/1/6 11:33
*/
private void sendMsgWithButtonInline(Long chatId, String text, List<List<InlineKeyboardButton>> keyboard) {
// 创建内联键盘布局
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
inlineKeyboardMarkup.setKeyboard(keyboard);
// 发送带按钮的消息
SendMessage message = new SendMessage();
message.setChatId(chatId);
message.setText(text);
message.setReplyMarkup(inlineKeyboardMarkup);
try {
execute(message); // 调用 Telegram API 发送消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
/**
* 发送带按钮的消息
* 按钮为一行多列
*
* @param chatId
* @param rows
*/
private void sendMsgWithButton(Long chatId, String text, List<InlineKeyboardButton> rows) {
// 创建内联键盘
List<List<InlineKeyboardButton>> keyboard = new ArrayList<>();
keyboard.add(rows);
// 创建内联键盘布局
InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
inlineKeyboardMarkup.setKeyboard(keyboard);
// 发送带按钮的消息
SendMessage message = new SendMessage();
message.setChatId(chatId);
message.setText(text);
message.setReplyMarkup(inlineKeyboardMarkup);
try {
execute(message); // 调用 Telegram API 发送消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
// 发送图文消息
private void sendMsgWithImage(Long chatId, String text, String imageUrl) {
// 创建 SendPhoto 对象
SendPhoto message = new SendPhoto();
message.setChatId(chatId);
// 设置图片文件路径或 URL
InputFile inputFile = new InputFile(imageUrl);
message.setPhoto(inputFile);
// 设置图片说明
message.setCaption(text);
// 设置文本格式为 HTML
message.setParseMode("HTML");
try {
execute(message); // 发送带图片和文字的消息
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
}