org.telegram.telegrambots.meta.exceptions.TelegramApiException:机器人令牌和用户名不能为空

问题描述 投票:0回答:1

我正在开发 Java Spring Boot 项目,其中包括简单的 Telegram Bot。我的问题:我不想将机器人用户名和机器人令牌等凭据推送到我的远程存储库。为了实现这一点,我只需将 .env 文件放入 .gitignore,但是如果没有凭据,Java CI 无法构建项目。我得到了非常自然的根异常:

org.telegram.telegrambots.meta.exceptions.TelegramApiException: Bot token and username can't be empty

这是我的机器人的代码:


import application.carsharingapp.exception.NotificationSendingException;
import application.carsharingapp.service.notification.NotificationService;
import io.github.cdimascio.dotenv.Dotenv;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

@RequiredArgsConstructor
@Service
public class TelegramNotificationService extends TelegramLongPollingBot
        implements NotificationService {
    private static final Dotenv DOTENV = Dotenv.configure().ignoreIfMissing().load();
    private static final String BOT_USERNAME = DOTENV.get("BOT_USERNAME");
    private static final String BOT_TOKEN = DOTENV.get("BOT_TOKEN");
    private static final String TARGET_CHAT_ID = DOTENV.get("TARGET_CHAT_ID");

    @Override
    public void sendNotification(String message) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.setText(message);
        sendMessage.setChatId(TARGET_CHAT_ID);
        try {
            execute(sendMessage);
        } catch (TelegramApiException e) {
            throw new NotificationSendingException("Can't send notification "
                    + "to chat: " + sendMessage.getChatId(), e);
        }
    }

    @Override
    public void onUpdateReceived(Update update) {
    }

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

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

这是我的机器人配置代码:


import application.carsharingapp.service.notification.impl.TelegramNotificationService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;

@Configuration
public class TelegramBotConfig {
    @Bean
    public TelegramBotsApi telegramBotsApi(TelegramNotificationService telegramNotificationService)
            throws TelegramApiException {
        TelegramBotsApi api = new TelegramBotsApi(DefaultBotSession.class);
        api.registerBot(telegramNotificationService);
        return api;
    }
}

我真的很想听到一些关于如何解决这个问题以及可能的解决方案的建议或技巧。

为了解决这个问题,我尝试为凭据设置一些模拟值,但我收到了 404 未找到错误

java spring environment-variables telegram
1个回答
0
投票

我建议您使用

*.properties
文件并将您的个人数据放入其中。这是一个简单的解决方案,它就像一个带有
Spring-Boot
的魅力,无需任何自定义代码。

应用程序属性

telegram.botToken=...
telegram.botName=...
telegram.myUserId=...

Java

@Component
public class MyBot extends TelegramLongPollingBot {

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

    @Value("${telegram.botName}")
    private String botName;

    public MyBot() {
        super(botToken);
    }


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

    ...
}

与 Sbring-Boot 集成的工作代码: https://github.com/zappee/telegram-spring-bot

© www.soinside.com 2019 - 2024. All rights reserved.