JavaRush /Java Blog /Random-JA /Java での Telegram ボットの作成: アイデアから展開まで
John Watson
レベル 27

Java での Telegram ボットの作成: アイデアから展開まで

Random-JA グループに公開済み
そもそもボットとは何ですか? これについては、ここで詳しく読むことができます。まずはTelegram上でボットを開発するためのライブラリ(以下API)の公式ドキュメントを読む必要があります。彼女はここに横たわっています。 Java での Telegram ボットの作成: アイデアから導入まで - 1そこにあるものはすべて非常にアクセスしやすく、理解しやすいものです。書いて喜ぶようです!しかし、それはそれほど単純ではありません。検索エンジンで多くの時間を費やした後、キーボードの作成方法、CallbackQuery の処理方法など、ボット開発に関する知識の断片を見つけました。Java でボットを開発するための完全かつ包括的なガイドを見つけたことがありません。これがこの記事を書くきっかけになりました。インターネット上には、既成の展開を使用して独自のボットを作成できるサイトが数多くあります。しかし、重要なのはそれです。ほとんどの場合、背景情報などを提供できるボットが作成されます。私たちのボットは、データベースのバインド、さまざまな API へのリクエスト、サイトの解析、複雑な計算の実行などを行うことができる本格的な Web アプリケーションです。この問題はあなたの想像力によってのみ制限されます。この行で、私がこれから書くことについて少しは説明できたと思います。Telegram へのボットの登録は非常に簡単です。このプロセスについては、上記のリンクにあるドキュメントで詳しく説明されています。私たちのアプリケーションでは、ボットの名前と、登録時に受け取るトークンだけを知る必要があります。基本的に、ボットは単なるコンソール Web アプリケーションです。フロントエンドはなく、純粋なコマンド処理です。Hibernate を十分にマスターしたい場合、または JSON を解析する方法を学びたい場合は、このプロジェクトが最適です。まず、pom.xml に依存関係を含めましょう (Maven を使用していることを前提としています)。次のようにして実行できます。
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
次に、 class を作成しBot、それを class から継承し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 setting up a message and sending it.
     * @param chatId chat id
     * @param s The string 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());
        }
    }

    /**
     * The method returns the name of the bot specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        returnBotName;
    }

    /**
     * The method returns the bot's token to communicate with the Telegram server
     * @return token for the bot
     */
    @Override
    public String getBotToken() {
        returnBotToken;
    }
}
さて、メソッドの内容main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
それをメソッドに入力することでgetBotUsername()getBotToken()ボットを起動します。今のところ、彼は私たちが彼に送信したメッセージを私たちにリダイレクトするだけで、一種の「鏡」です。すべては次のように動作します。アプリケーションを起動すると、n 秒ごとに URL: https://api.telegram.org/BotToken/getMe で Telegram サーバーへの GET リクエストの送信が開始されます。ここで、BotToken はボットのトークン。すべてのメッセージを含む JSON 応答で受信されます。このような各メッセージはライブラリによって処理され、オブジェクトOnUpdateReceived(Update update)としてメソッドに渡されますUpdate。それが私たちが取り組んでいることです。これが Telegram ボットの利点です。ボットはどのコンピューターでも動作し、テストの場合はアプリケーションを起動するだけで済み、変更のたびにホスティングにデプロイする必要はありません。とても快適です。もちろん、ボットは Webhook を使用して動作するように構成できます。マニュアルはインターネットで見つけることができます。簡単にするために、LongPolling を使用して動作します。メッセージを処理する方法と応答として何を送信するかは、言語ツールとライブラリによってのみ制限され、その他はすべてユーザーの裁量に任されます。YouTube でビデオを検索してくれるボットを作成することもできます。たとえば、1 年後に自分に送信したものを毎日送信する、一種のタイムカプセルのようなボットを作成することもできます。あるいは、CRM システムに統合する方法や中小企業向けのボットを作成する方法を学ぶこともできますが、すべてはあなたの想像力によって制限されます。どうぞ。«/»ボットを使用したことがある人は、たとえば、記号で始まるコマンドを使用してボットと対話すると便利であることを知っています/start。しかし、もっと便利な方法があります - ボタンです。ボタンには 2 種類あります。1 つは入力フィールドの下に表示されるボタン、もう 1 つは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 strings
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First line of the keyboard
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first line of the keyboard
        keyboardFirstRow.add(new KeyboardButton(“Привет”));

        // Second line of the keyboard
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add buttons to the second line of the keyboard
        keyboardSecondRow.add(new KeyboardButton(“Помощь”);

        // Add all keyboard strings to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and set this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
メソッドではsendMsg()、メッセージを渡してこのメ​​ソッドを呼び出し、そのメッセージのキーボードを設定します。このメッセージをユーザーに送信すると、設定したメッセージ テキストと、「こんにちは」と「ヘルプ」という 2 つのボタンが隣り合って表示されます。これらのボタンをクリックすると、メッセージがボットに送信され、そのテキストがボタンに書かれています。つまり、クライアントが「ヘルプ」をクリックすると、ボットは「ヘルプ」というテキストを含むメッセージを受け取ります。彼にとって、それはクライアント自身が「ヘルプ」というテキストを書いて彼に送ったかのようです。さて、そのようなメッセージを処理します。 InlineKeyboardMarkup これも配列の配列であり、前のマークアップと似ていますが、ここでの動作ロジックは少し異なります。このようなキーボードは特定のメッセージに関連付けられており、そのメッセージに対してのみ存在します。インラインキーボードのインストール方法はこちら
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Listで 作成しList、1行目にInlineボタンを追加します。このようなボタンには、URL、チャネルへのリンク、またはCallbackQuery後で説明する を含めることができます。ここでは、ユーザーに表示されるボタンのテキストを設定し、ボットに送信されるデータを設定します。この例では、ユーザーには「Hello」が表示され、クリックするとボットに番号 17 が送信されます。これが私たちの ですCallbackQuery。について一言CallbackQuery。このようなデータをオブジェクトから取得するには、Updateを実行する必要がありますupdate.getCallbackQuery()。このメソッドは を返しますCallbackQuery。そこから、ボットに転送されたデータをすでに取得できます。update.getMessage().getText()getメソッドを通じてこのデータを取得しようとする必要はありません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();
        }
    }
重要:回答のテキストはCallbackQuery200 文字以内にしてください。このような応答を送信すると、クライアントはメッセージが書き込まれるポップアップ ウィンドウを受け取ります。このようなウィンドウは、表示されてから数秒後に消えるか、ユーザーが [OK] を押すまでハングすることがあります。これらのモードを切り替えるには、 を呼び出しますanswer.setShowAlert(true)。[OK] を押すまでtrueウィンドウがハングし、false5 秒後に消えます。原則として、これらはすべて Telegram ボット ライブラリの基本機能です。必要に応じて、ドキュメントからマルチメディアの送信、地理位置情報などを学ぶことができます。ホスティングへのボットのデプロイに進みましょう。私のプロジェクトでは Heroku を選択しました。それは、独自の CLI を備えた非常に便利なホスティングだと思うからです。無料ですが、このままではリクエストがない場合、ボットは 30 分後に休止状態になります。ある依頼が届くと彼は目を覚ます。これは非常に迅速に行われるため、気付かないほどです (もちろん、データベースへの接続が再確立されない限り)。無料プランの制限は、データベース 5 MB、ディスク容量 100 MB、月あたりのトラフィック 2 TB、1 ディノです。Dino は実行中のアプリケーションです。私にとっては、これまでアプリケーションをデプロイしたことがなかったため、問題を引き起こしたのはデプロイメント段階だったとすぐに言います。Heroku をデプロイする場合、Procfile (拡張子なし) という名前のファイルが必要です。これをプロジェクトのルートに作成し、そこに worker: sh target/bin/workerBot workerBotを書き込みます。Mavenプラグインをpom.xml 使用して生成されたshスクリプト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>
このプロセスを開始する前に、Heraku に登録し、Git と Heroku CLI をインストールする必要があります。アプリケーションにデータベースが必要な場合は、新しいアプリケーションを登録するときに、必要なデータベースを忘れずに追加してください。次に、データベースのホスト、ユーザー名、パスワード、ポートを調べて、それをアプリケーションで指定する必要があります。次に、デプロイする前に、Maven を使用してプロジェクトをビルドします。
mvn clean install
まず、プロジェクトのディレクトリに移動し、次のコマンドでリポジトリを初期化します。git init 次に、このリポジトリにプロジェクトを追加します。
git add .
変更をコミットした後
git commit -m “First commit in project”
次に、heroku にログインし、コマンドラインに次のように書きます。
heroku login
登録時に指定したデータを入力します。次に、Heraku 上のリポジトリの URL を確認する必要があります。これは設定で行われます。 それから書きます
git remote add heroku [url]
Heroku リモート リポジトリがリポジトリに追加されます。次に書きます
git push heroku master
待っています... アプリケーションのデプロイメントが成功したら、コマンドを実行します。
heroku ps:scale worker=1
以上で、アプリケーションが実行されます。これが起こらない場合は、ログを注意深く確認してください。おそらく、アプリケーションにクラッシュの原因となったエラーがあると考えられます。このような長い記事を読んでいただきありがとうございます。誰かが役に立ち、開発中につまずいた箇所で多くの時間を節約できることを願っています。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION