用 Java + Spring Boot 搞一个 Telegram 机器人?来,带你慢慢来搞!
前言:别被术语吓住,其实很简单
今天这篇教程就是写给像你这样有点 Java 基础的朋友看的,哪怕你之前没碰过 Telegram 机器人也没关系。
我们要做的就是一个可以接收消息、回复消息的 Telegram Bot,用的是你可能已经熟悉的 Spring Boot 框架。不炫技,只讲实的。
第一步:准备好 Telegram Bot 的访问权限
你得先在 Telegram 上注册一个自己的 Bot。方法很简单:
1. 打开 Telegram,搜索 @BotFather
这是 Telegram 官方用来创建 Bot 的机器人。
2. 发送 /newbot
给它
之后你会被要求设置 bot 的名字和用户名。一切搞定之后,你就能获得一个 token,长得像这样:
123456789:AAAqweqweqweqweqweqwe
这个 token 相当于你 Bot 的身份证,一定要保管好,别泄露给别人。
第二步:创建一个 Spring Boot 项目
你可以用 Spring Initializr 来生成初始项目,也可以用 IDE(比如 IntelliJ IDEA)直接创建。
选择以下依赖(如果你用 IDEA,这些可以直接勾选):
Spring Web(用来处理 HTTP 请求)
Lombok(可选,但推荐,能让你少写很多样板代码)
项目结构大致如下:
src
├── main
│ ├── java
│ │ └── com.example.telegrambot
│ │ ├── BotConfig.java(配置类)
│ │ ├── WebhookController.java(处理 Telegram 回调)
│ │ └── TelegramBotApplication.java(启动类)
│ └── resources
│ └── application.properties
第三步:配置你的 Bot Token
我们来加个配置类,专门保存你的 token。
在 BotConfig.java
里写:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class BotConfig {
@Value("${telegram.bot.token}")
private String botToken;
public String getBotToken() {
return botToken;
}
}
然后在 application.properties
中添加:
telegram.bot.token=你的 token 在这
第四步:创建接收 Telegram 请求的控制器
Telegram 会以 HTTP POST 的方式把用户的消息发送到你配置的 webhook 地址。我们需要创建一个 controller 来处理这个请求。
创建 WebhookController.java
:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.*;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.Message;
@RestController
@RequestMapping("/bot")
public class WebhookController {
private final ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/{botToken}")
public void handleUpdate(@PathVariable String botToken, @RequestBody Update update) {
try {
// 这里简化了逻辑,实际建议抽象出更多方法来处理逻辑
Message message = update.getMessage();
if (message != null && message.hasText()) {
long chatId = message.getChatId();
String text = message.getText();
// 准备回应
SendMessage sendMessage = new SendMessage();
sendMessage.setChatId(String.valueOf(chatId));
sendMessage.setText("你刚说了:" + text);
// 这边你可以调用 bot 的 execute 方法发送消息(我们后面再说这部分)
}
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
别急着跑代码,我们现在只是处理接收的部分,发送消息还没完成。先把这个当作一个“接收器”来看。
第五步:如何把回复发回去?我们需要一个 Bot 发送逻辑
我们可以封装一个类来处理发送消息的逻辑。
创建一个 TelegramBotService.java
:
import org.springframework.stereotype.Service;
import org.telegram.telegrambots.bots.DefaultAbsSender;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
@Service
public class TelegramBotService extends DefaultAbsSender {
private final String botToken;
public TelegramBotService(BotConfig botConfig) {
super();
this.botToken = botConfig.getBotToken();
}
public void sendMessage(SendMessage message) {
try {
execute(message);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
@Override
public String getBotToken() {
return botToken;
}
}
然后改一下 controller 里面的逻辑:
@Autowired
private TelegramBotService telegramBotService;
@PostMapping("/{botToken}")
public void handleUpdate(@PathVariable String botToken, @RequestBody Update update) {
Message message = update.getMessage();
if (message != null && message.hasText()) {
long chatId = message.getChatId();
String text = message.getText();
SendMessage response = new SendMessage();
response.setChatId(String.valueOf(chatId));
response.setText("你说的是:" + text);
telegramBotService.sendMessage(response);
}
}
第六步:启动你的服务 + 给 Telegram 设置 Webhook
1. 启动 Spring Boot 项目
你可以通过 IDEA 或命令行运行:
./mvnw spring-boot:run
2. 给 Telegram 设置 Webhook
Telegram 需要知道去哪调用你写的接口。你可以用 curl 来设置:
curl -F "url=https://你的公网地址/bot/你的bot token" https://api.telegram.org/bot你的bot token/setWebhook
你必须有一个公网地址,可以用 ngrok 做内网穿透,或者用上线的服务器。
到这里,你已经完成了你的第一个 Java + Spring Boot Telegram 机器人!
是的,你已经用 Java 成功写了一个能接收用户消息、并作出回应的 Telegram 机器人。
从申请 Bot 的 token,到搭建 Spring Boot 的项目结构;从接收消息到主动发送回复——你一步一步地实现了整个流程。现在你已经不再是那个“听说过 Telegram 机器人”的人了,你是一个亲手写出了第一个 bot 的开发者。