CodeGym/Java Blog/무작위의/Java로 Telegram Bot 만들기: 개념에서 배포까지
John Squirrels
레벨 41
San Francisco

Java로 Telegram Bot 만들기: 개념에서 배포까지

무작위의 그룹에 게시되었습니다
회원
그래서 봇은 무엇입니까? 여기에서 이에 대한 자세한 내용을 읽을 수 있습니다 . 시작하려면 Telegram 봇(이하 "API")을 개발하는 데 사용되는 라이브러리에 대한 공식 문서를 검토해야 합니다. 여기에서 찾을 수 있습니다 .
Java로 Telegram Bot 만들기: 개념에서 배포까지 - 1
모든 것이 매우 접근 가능하고 명확합니다. 코드를 작성하고 기뻐할 수 있을 것 같습니다! 그러나 그렇게 간단하지 않습니다. 많은 시간을 검색한 후, 예를 들어 키보드를 만드는 방법,CallbackQuery, 기타 등등. 그러나 Java 봇 개발에 대한 완전하고 철저한 가이드를 찾지 못했습니다. 그것이 이 글을 쓰게 된 계기가 되었습니다. 쉽게 배포할 수 있는 자신만의 봇을 만들 수 있는 웹사이트가 많이 있습니다. 하지만 실제로 생성된 대부분의 봇은 참고 정보 등을 제공합니다. 우리의 봇은 본격적인 웹 애플리케이션입니다. 데이터베이스를 바인딩하고, 다양한 API 요청을 실행하고, 웹사이트를 구문 분석하고, 복잡한 계산을 수행하는 등의 작업을 수행할 수 있습니다. 가능성은 당신의 상상력에 의해서만 제한됩니다. 위의 내용이 제가 작성하려는 내용을 명확히 하는 데 도움이 되었기를 바랍니다. Telegram에 봇을 등록하는 것은 매우 쉽습니다. 이 과정은 위에 링크된 문서에 자세히 설명되어 있습니다. 우리 애플리케이션의 경우 봇을 등록할 때 받은 봇의 이름과 토큰만 알면 됩니다. 원래, 봇은 콘솔 기반 웹 애플리케이션일 뿐입니다. 프런트 엔드가 없으며 순수한 명령 처리만 있습니다. 마스터하고 싶다면최대 절전 모드를 사용하거나 JSON 구문 분석 방법을 배우 면 이것이 당신을 위한 프로젝트입니다. 종속성을 추가하여 시작하겠습니다 pom.xml(Maven을 사용한다고 가정하겠습니다). 다음과 같이 할 수 있습니다.
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Bot그런 다음 클래스를 상속하는 클래스를 만들고 TelegramLongPollingBot해당 메서드를 재정의합니다.
public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
    String message = update.getMessage().getText();
    sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
그리고 이제 방법의 내용 main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
getBotUsername()및 메서드를 입력한 후 getBotToken()봇을 시작합니다. 지금은 " 미러 " 와 같이 우리가 보내는 모든 메시지를 우리에게 리디렉션합니다 . 다음과 같이 작동합니다. 애플리케이션을 시작하면 다음 URL에서 n초마다 Telegram 서버에 요청을 보내기 시작합니다. https://api.telegram.org/BotToken/getMe 여기서 BotToken은 봇의 토큰입니다. . 응답으로 모든 메시지가 포함된 JSON을 수신합니다. 이러한 각 메시지는 라이브러리에 의해 처리되고 메소드에 전달됩니다 OnUpdateReceived(Update update).Update물체. 그리고 그것이 우리가 함께 일하는 것입니다. 여기에 Telegram 봇의 장점이 있습니다. 모든 컴퓨터에서 실행할 수 있고 테스트하려면 응용 프로그램을 시작하기만 하면 되며 각 변경 후 호스트에 배포할 필요가 없습니다. 이것은 매우 편리합니다. 물론 웹후크를 사용하여 작동하도록 봇을 구성할 수 있습니다. 인터넷에서 이에 대한 지침을 찾을 수 있습니다. 간단히 하기 위해 LongPolling을 사용합니다.. 메시지가 처리되는 방법과 응답으로 보내는 내용은 언어 및 라이브러리의 기능에 의해서만 제한됩니다. 다른 모든 것은 당신에게 달려 있습니다. YouTube 동영상을 검색하는 봇을 만들 수 있습니다. 1년 전의 타임캡슐처럼 매일 자신에게 보내는 것을 보내는 봇을 만들 수 있습니다. 또는 CRM 시스템과 통합하고 소기업을 위한 봇을 만드는 방법을 배울 수 있습니다. 상상력에 한계가 있습니다. 계속. 봇을 사용해 본 사람들은 " " 문자로 시작하는 명령( /예: /start. 그러나 더 편리한 방법이 있습니다. 바로 버튼입니다. 버튼에는 입력 필드( ) 아래에 표시되는 ReplyKeyboardMarkup버튼과 연결된 메시지 바로 아래에 있는 버튼(InlineKeyboardMarkup). 문서의 설명에서 기본적인 이해를 얻을 수 있습니다.

회신키보드마크업

실제로 이것은 버튼 배열의 배열입니다: List<KeyboardRow <KeyboardButton>>. 키보드를 생성하는 샘플 코드는 다음과 같습니다.
public synchronized void setButtons(SendMessage sendMessage) {
        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
sendMsg()메시지를 전달한 후 메서드 에서 이 메서드를 호출합니다 . 이것이 해당 메시지에 대한 키보드를 설정하는 방법입니다. 이 메시지를 사용자에게 보내면 사용자는 메시지 텍스트와 "안녕하세요""도움말" 이라는 2개의 버튼을 볼 수 있습니다 . 이 버튼 중 하나를 클릭하면 버튼 텍스트가 포함된 메시지가 봇에 전송됩니다. 따라서 클라이언트가 "도움말"을 클릭하면 봇은 "도움말"이 포함된 메시지를 받게 됩니다 . 봇에게는 클라이언트 자체가 "도움말"을 작성 하고 텍스트를 봇에 보낸 것으로 보입니다 . 그런 다음 메시지를 처리합니다.

인라인키보드마크업

이것은 또한 배열의 배열입니다. 이전 마크업과 비슷하지만 여기서는 논리가 조금 다르게 작동합니다. 이 유형의 키보드는 특정 메시지에 첨부되며 해당 메시지에만 존재합니다. 인라인 키보드를 설정하는 방법은 다음과 같습니다.
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
List에 을 만들고 List첫 번째 행에 인라인 버튼을 추가합니다. 이 버튼에는 URL, 채널 링크 또는 가 포함될 수 있으며 CallbackQuery이에 대해서는 나중에 설명하겠습니다. 여기에서 사용자에게 표시되는 버튼의 텍스트를 설정한 다음 봇에 보낼 데이터를 설정합니다. 이 예에서 사용자는 "Hi"를 보고 버튼을 누르면 숫자 17이 봇으로 전송됩니다. 이것은 우리의 CallbackQuery. 에 관한 몇 마디 CallbackQuery. 객체 에서 이 데이터를 얻으려면 Update를 실행해야 합니다 update.getCallbackQuery(). 이 메서드는 CallbackQuery봇에 전달된 데이터에 액세스할 수 있는 를 반환합니다. update.getMessage().getText()방법을 통해 이 데이터를 얻으려고 하지 마십시오 NullPointerException. .
@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }
메시지가 있으면 처리를 위해 새 스레드로 보냅니다. 가 있으면 CallbackQuery처리를 위해 적절한 스레드로 보냅니다. 에 응답을 보낼 수 있습니다 CallbackQuery. Telegram의 모든 개체에는 고유한 ID가 있습니다. 특정 에 대한 응답을 보내려면 CallbackQuery해당 객체에서 얻은 ID만 알면 됩니다. 응답을 보내기 위해 다음 메서드를 호출합니다.
public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
중요한:a에 대한 응답의 텍스트는 CallbackQuery200자 이하여야 합니다! 이러한 응답을 보낸 후 클라이언트는 메시지가 포함된 팝업 창을 보게 됩니다. 이 창은 나타난 후 몇 초 후에 사라지거나 사용자가 확인을 누를 때까지 지속될 수 있습니다. 모드를 전환하기 위해 메서드를 호출합니다 answer.setShowAlert(true). true메서드에 전달하면 확인을 누를 때까지 창이 지속됩니다. false를 전달하면 5초 후에 사라집니다. Telegram Bot 라이브러리 의 모든 기본 기능 입니다 . 원하는 경우 멀티미디어, 지리적 위치 등을 보내는 방법과 같은 것을 배울 수 있습니다. 호스팅 플랫폼에 봇을 배포하는 방법으로 이동하겠습니다. 내 프로젝트에서는 Heroku를 선택했습니다.. 자체 CLI가 있어 오히려 편리한 호스팅 플랫폼이라고 생각합니다. 무료이지만 이 플랜에서는 30분 동안 요청이 없으면 봇이 최대 절전 모드로 전환됩니다. 요청을 받으면 깨어납니다. 이는 매우 빠르게 발생하므로 사용자는 알아채지도 못할 것입니다(물론 데이터베이스 연결이 다시 시작되지 않는 한). 무료 플랜은 5MB 데이터베이스, 100MB 디스크 공간, 월 2TB 데이터 및 1 dyno로 제한됩니다. dyno는 실행 중인 애플리케이션입니다. 이전에 응용 프로그램을 배포한 적이 없었기 때문에 어려움을 겪은 것은 배포였습니다. 배포하는 동안 Heroku에는 Procfile(확장자 없음)이라는 파일이 필요합니다. 프로젝트 루트에 생성합니다. 내부에 를 작성합니다 worker: sh target/bin/workerBot. 여기서 workerBot은 에 지정된 이름입니다 pom.xml. 쉬 _Maven Application Assembler Plugin (appassembler-maven-plugin) 에 의해 생성된 스크립트가 시작됩니다. 이 스크립트는 컴파일된 jar 파일을 시작하는 방법을 설명합니다. 시작할 클래스의 이름은 <mainClass>와 사이에 지정되고 </mainClass>스크립트 이름은 <name>와 사이 </name>에 지정됩니다 pom.xml.
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
이 프로세스를 시작하기 전에 Heroku 에 등록 하고 GitHeroku CLI를 모두 설치 해야 합니다 . 응용 프로그램에 데이터베이스가 필요한 경우 새 응용 프로그램을 만들 때 필요한 데이터베이스를 추가하는 것을 잊지 마십시오. 또한 데이터베이스의 호스트, 사용자 이름, 암호 및 포트를 결정한 다음 애플리케이션에 표시해야 합니다. 다음으로 배포하기 전에 Maven을 사용하여 프로젝트를 빌드합니다 .
mvn clean install
먼저 프로젝트 디렉토리로 이동하여 명령으로 리포지토리를 초기화합니다 git init. 그런 다음 이 저장소에 프로젝트를 추가합니다.
git add .
그런 다음 변경 사항을 커밋합니다.
git commit -m "First commit in the project"
다음으로 heroku에 로그인해야 합니다. 명령줄에 다음을 작성합니다.
heroku login
등록 시 생성한 자격 증명을 입력합니다. 그런 다음 heroku에서 리포지토리의 URL을 결정합니다. 설정에서 이 작업을 수행합니다. 그런 다음 우리는 씁니다
git remote add heroku [url]
리포지토리에 원격 heroku 리포지토리가 추가됩니다. 다음으로 우리는 씁니다
git push heroku master
그런 다음 기다립니다. 애플리케이션이 성공적으로 배포되면 다음 명령을 실행합니다.
heroku ps:scale worker=1
이제 애플리케이션이 실행됩니다. 그렇지 않은 경우 로그를 주의 깊게 살펴보십시오. 응용 프로그램의 오류로 인해 오류가 발생했을 가능성이 큽니다. 긴 글 읽어주셔서 감사합니다. 누군가가 유용하다고 생각하고 개발 중에 문제를 일으킨 영역에서 많은 시간을 절약할 수 있기를 바랍니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다