JavaRush /Java Blog /Random-JA /Spring Boot を使用した電報ボットの作成
Whiskels
レベル 41
Москва

Spring Boot を使用した電報ボットの作成

Random-JA グループに公開済み
こんにちは、みんな!学習のある時点では、問題の解決から、ポートフォリオの基礎となる実際のプロジェクトの作成に移行したいと考えます。インターンシップを開始したとき (これは皆さんに強くお勧めします)、フリーランサーとして電報ボットを書くというオファーを受けました。私の知識が少なかったため、私は 3 つのスレッドを含むかなり単純なボット ( Spring に移行する前の最後のコミット) を作成しました。
  • メッセージ受信スレッド。
  • メッセージ送信スレッド。
  • イベント スケジュール スレッド (スケジュールされたメッセージをチェックし、JSON からキャッシュされたデータを更新します)。
この機能を作成するとき、私はこの記事に大きく依存しました。すべてが非常にうまく機能しましたが、Spring を深く理解するほど、プログラムの一貫性を減らし、コードの品質を向上させるために、すべてをリファクタリングしたいと思うようになりました。SonarLint (コードの品質を自動的にチェックするプラグイン) は、無限の while ループがあまり良くないことを私に説得しようとしてきました。ある時点で、私は決心してすべてを書き直しました。そして今、リファクタリングプロセス中に得た知識を皆さんと共有したいと思います。基本から始めましょう。具体的には、TelegramBots-Spring-Boot-Starterを使用して始めましょ う。それでは、始めましょう! あらゆるメッセージに応答して挨拶するボットを作成してみましょう。まず、新しい Maven プロジェクトを作成する必要があります。必要な依存関係を pom.xml に追加しましょう。Java および TelegramBots-Spring-Boot-Starter バージョンをプロパティに追加します。そして、依存関係を登録します - ここには、すでに前述した TelegramBots-Spring-Boot-Starterと Telegram APIが含まれています。Spring Boot を使用した電報ボットの作成 - 1TelegramBots-Spring-Boot-Starter ライブラリには、Spring Boot と Telegram API が含まれています。これを使用すると、非常に簡単な方法でコード内でボットを宣言でき、Spring 自体が Bean を作成してボットをアクティブ化します。現時点で内部で何が起こっているかに興味がある場合は、ライブラリ ソース (開発環境またはGithub上) を見てください。コンパイル パラメーターも追加します。pomSpring Boot を使用した電報ボットの作成 - 2 を入力した後は、すべての依存関係を更新することを忘れないでください。 App と Bot の 2 つのクラスと、リソース フォルダーに application.yaml ファイルを作成しましょう。私のプロジェクトの構造は次のようになります。Spring Boot を使用した電報ボットの作成 - 3この段階で、ボットの認証情報を application.yaml に追加しましょう。
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
階層表記により、繰り返し (bot.name、bot.token) を回避し、読みやすさを向上させることができます。まだボットを作成していない場合は、公式の手順に従って作成できます。application.yaml にボットの資格情報を表示したくない場合 (これは正しいことです)、デプロイ時に環境変数を使用します。
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Bot クラスに入力します。
package com.whiskels.telegram.bot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
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;

// Аннотация @Component необходима, чтобы наш класс распознавался Spring, How полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать meaning полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

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

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении messages наш бот будет отвечать сообщением Hi!
     */
    @Override
    public void onUpdateReceived(Update update) {
        try {
            execute(new SendMessage().setChatId(update.getMessage().getChatId())
            .setText("Hi!"));
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    // Геттеры, которые необходимы для наследования от TelegramLongPollingBot
    public String getBotUsername() {
        return botUsername;
    }

    public String getBotToken() {
        return botToken;
    }
}
アプリクラスを入力します。
package com.whiskels.telegram;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.telegram.telegrambots.ApiContextInitializer;

// Аннотация, которая объединяет в себя @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        // Здесь code написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
すべてが正しく行われていれば、main を実行してボットに挨拶することができます。Spring Boot を使用した電報ボットの作成 - 4準備ができて!すべての受信メッセージに挨拶する電報ボットを作成して起動することに成功しました。この記事が役に立った場合は、私のリポジトリを見てスターを付けていただければ幸いです。そこには、多くの興味深い機能を備えた私のバージョンの電報ボットもあります。
  • Postgres データベースにユーザーを保存する。
  • ユーザーの役割に基づいたコマンドへのアクセスの承認。
  • カスタム アノテーション @BotCommand および @RequiredRoles を使用してメッセージ ハンドラーを作成し、ユーザー権限をチェックします。
  • 通知スケジュールの作成のサポート。
この機能のいずれかに興味がある場合は、コメントに書き込んでください。回答するか、それを再作成する方法に関する詳細な記事を書くつもりです。PS これは JavaRush に関する私の最初の記事であり、Spring JPA と @Scheduled アノテーションの世界に飛び込みたいと思いますが、その前に、Spring Boot を使用して一般的にボットを構築する方法についてこのガイドを書く価値があると考えました。ボットについてはすでにいくつかの記事が書かれていますが、検索してもそのようなガイドは見つからなかったので、このニッチな分野を埋めることにしました :) Miroha についても言及したいと思います。UpdateHandlers のアイデアに感謝します。私はそれを盗みました。私自身:) パート 2 パート 3
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION