You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Spring Boot应用中启动Telegram Bot?整合问题咨询

解决方案:Telegram Bots 与 Spring Boot 整合

当然可以把 Telegram Bot 和 Spring Boot(包括Web应用)完美整合!你的问题大概率是Bot的初始化逻辑没和Spring容器生命周期配合好,或者是请求模式的配置出了问题。下面分两种常用模式给你具体的实现方案:

1. 长轮询(Long Polling)模式(适合快速开发/测试)

如果你的Bot之前用长轮询能正常跑,但集成Spring后没反应,核心原因是:Spring初始化@Component类型的Bot后,不会自动触发轮询循环。你需要手动在Spring启动完成后启动Bot的轮询逻辑。

正确实现步骤:

  • 自定义一个初始化器,实现ApplicationRunner接口(Spring启动完成后会自动执行run方法):
@Component
public class TelegramBotStarter implements ApplicationRunner {

    private final MyTelegramBot bot;

    // 构造注入你的Bot实例
    public TelegramBotStarter(MyTelegramBot bot) {
        this.bot = bot;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 初始化Bot会话并启动长轮询
        TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
        try {
            botsApi.registerBot(bot);
            System.out.println("✅ Telegram Bot 已启动(长轮询模式)");
        } catch (TelegramApiException e) {
            System.err.println("❌ Bot注册失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}
  • 你的Bot类标记为@Component,确保核心方法返回正确的配置:
@Component
public class MyTelegramBot extends TelegramLongPollingBot {

    // 建议从配置文件读取,这里直接示例
    private static final String BOT_USERNAME = "你的Bot用户名";
    private static final String BOT_TOKEN = "你的Bot Token";

    @Override
    public String getBotUsername() {
        return BOT_USERNAME;
    }

    @Override
    public String getBotToken() {
        return BOT_TOKEN;
    }

    @Override
    public void onUpdateReceived(Update update) {
        // 处理消息逻辑,比如回复用户
        if (update.hasMessage() && update.getMessage().hasText()) {
            SendMessage reply = new SendMessage();
            reply.setChatId(update.getMessage().getChatId().toString());
            reply.setText("收到你的消息:" + update.getMessage().getText());
            try {
                execute(reply);
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        }
    }
}

2. Webhook模式(适合生产环境Web应用)

如果你的Spring Boot是Web应用(自带Tomcat),更推荐用Webhook模式:Telegram服务器会主动把用户消息以HTTP请求的形式推送到你的应用,避免长轮询占用资源。

配置步骤:

  1. 先设置Webhook地址:通过BotFather发送命令/setwebhook,设置地址为https://你的域名/webhook/你的BotToken(必须是HTTPS,本地开发可以用ngrok做反向代理)
  2. 编写Webhook接收Controller:
@RestController
@RequestMapping("/webhook")
public class TelegramWebhookController {

    private final MyWebhookBot bot;

    public TelegramWebhookController(MyWebhookBot bot) {
        this.bot = bot;
    }

    @PostMapping("/{token}")
    public void handleWebhook(@PathVariable String token, @RequestBody Update update) {
        // 验证Token合法性,防止恶意请求
        if (!token.equals(bot.getBotToken())) {
            return;
        }
        bot.onWebhookUpdateReceived(update);
    }
}
  1. 实现Webhook类型的Bot:
@Component
public class MyWebhookBot extends TelegramWebhookBot {

    @Value("${telegram.bot.username}")
    private String botUsername;

    @Value("${telegram.bot.token}")
    private String botToken;

    @Value("${telegram.bot.webhook-url}")
    private String webhookUrl;

    @Override
    public String getBotUsername() {
        return botUsername;
    }

    @Override
    public String getBotToken() {
        return botToken;
    }

    @Override
    public String getBotPath() {
        // 对应Controller中的/{token}路径
        return "/" + botToken;
    }

    @Override
    public String getBotUrl() {
        return webhookUrl;
    }

    @Override
    public void onWebhookUpdateReceived(Update update) {
        // 处理消息逻辑,和长轮询模式一致
        if (update.hasMessage() && update.getMessage().hasText()) {
            SendMessage reply = new SendMessage();
            reply.setChatId(update.getMessage().getChatId().toString());
            reply.setText("Webhook收到消息:" + update.getMessage().getText());
            try {
                execute(reply);
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 初始化Webhook:
    同样用ApplicationRunner在Spring启动时注册Bot并设置Webhook:
@Component
public class WebhookBotStarter implements ApplicationRunner {

    private final MyWebhookBot bot;

    public WebhookBotStarter(MyWebhookBot bot) {
        this.bot = bot;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
        try {
            botsApi.registerBot(bot);
            // 配置并设置Webhook
            SetWebhook setWebhook = new SetWebhook();
            setWebhook.setUrl(bot.getBotUrl() + bot.getBotPath());
            bot.setWebhook(setWebhook);
            System.out.println("✅ Telegram Webhook Bot 已启动");
        } catch (TelegramApiException e) {
            System.err.println("❌ Webhook Bot注册失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

常见排查要点

  • 检查Bot Token和用户名是否完全正确,有没有拼写错误
  • 长轮询模式下:确认服务器能访问Telegram的API地址(无防火墙/代理拦截)
  • Webhook模式下:确保域名是HTTPS,本地开发用ngrok后要及时更新Webhook地址
  • 查看Spring Boot的完整日志,有没有被忽略的TelegramApiException(比如注册Bot时的权限问题)

内容的提问来源于stack exchange,提问作者Bobby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:53