rubenlagus / TelegramBots

Java library to create bots using Telegram Bots API
https://telegram.me/JavaBotsApi
MIT License
4.69k stars 1.19k forks source link

Spring boot telegram bot #1350

Closed RedArtelerist closed 5 months ago

RedArtelerist commented 5 months ago

Hello, I recently started developing a microservice application in Spring Cloud. One of my services was responsible for the telegram bot and I initially used telegrambots v6.9.0 dependency. There I had a problem that the telegram conflicted with Eureka and required a jersey client. I tried to add jersey client, but the application still had exceptions.

Therefore, I decided to look at the new version of the library and used the following example of a bot from the documentation https://rubenlagus.github.io/TelegramBotsDocumentation/lesson-9.html. However, the bot didn't respond to the message after launching the microservice. I tried your example in a separate application from Spring Boot, but the bot didn't respond to my messages. I use Java 21 and Spring Boot v3.2.4. Here is my code for the same bot, only I take the token from Spring Cloud Config Server.

@Component
public class TgBot implements SpringLongPollingBot, LongPollingSingleThreadUpdateConsumer {
    private final TelegramClient telegramClient;
    private final String botToken;

    public TgBot(@Value("${bot.token}") String botToken) {
        this.botToken = botToken;
        this.telegramClient = new OkHttpTelegramClient(botToken);
    }

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

    @Override
    public LongPollingUpdateConsumer getUpdatesConsumer() {
        return this;
    }

    @Override
    public void consume(Update update) {
        // We check if the update has a message and the message has text
        if (update.hasMessage() && update.getMessage().hasText()) {
            // Set variables
            String message_text = update.getMessage().getText();
            long chat_id = update.getMessage().getChatId();

            SendMessage message = SendMessage // Create a message object
                    .builder()
                    .chatId(chat_id)
                    .text(message_text)
                    .build();
            try {
                telegramClient.execute(message); // Sending our message object to user
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        }
    }
}

What could be wrong?

RedArtelerist commented 5 months ago

Helps add @Import(TelegramBotStarterConfiguration.class) on SpringBootApplication class to load manually bean to register bot in spring applications. But need to review the code example of bot with Spring Boot v3.x.x

rubenlagus commented 5 months ago

@RedArtelerist I've tested it again and it works without adding any @Import annotation.

Can you share the pom.xml file that you use to build it ? Feel free hide any secrets.

RedArtelerist commented 5 months ago

Hi, this is my pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.redartis</groupId>
    <artifactId>demo-bot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-bot</name>
    <description>demo-bot</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots-springboot-longpolling-starter</artifactId>
            <version>7.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots-client</artifactId>
            <version>7.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
rubenlagus commented 5 months ago

@RedArtelerist It makes sense that the autoconfiguration doesn't run if you are not adding spring-boot-autoconfigure dependency: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-autoconfigure

RedArtelerist commented 5 months ago

Even after adding this dependency (that is already included in spring-boot-starter-web) it doesn't help.