CodeGym /Java Blog /ランダム /Java での Telegram ボットの作成: 構想から展開まで
John Squirrels
レベル 41
San Francisco

Java での Telegram ボットの作成: 構想から展開まで

ランダム グループに公開済み
では、ボットとは何でしょうか? 詳細については、こちらをご覧ください。まず、Telegram ボット (以下「API」) の開発に使用されるライブラリの公式ドキュメントを確認する必要があります。ここで見つけることができます。
Java での Telegram ボットの作成: 構想から展開まで - 1
そこにあるものはすべて非常にアクセスしやすく、明確です。コードを書くだけで満足できるようです。しかし、それはそれほど単純ではありません。検索に多くの時間を費やした結果、キーボードの作り方やキーボードの扱い方など、ボット開発に関するちょっとした知識を見つけました。CallbackQuery、など。しかし、Java ボット開発のための完全かつ網羅的なガイドは見つかりませんでした。それがこの記事を書くきっかけになりました。簡単に導入できる独自のボットを作成できる Web サイトはたくさんあります。しかし実際には、作成されたボットのほとんどは参考情報などを提供しています。私たちのボットは本格的な Web アプリケーションです。データベースのバインド、さまざまな API リクエストの実行、Web サイトの解析、複雑な計算の実行などを行うことができます。可能性はあなたの想像力によってのみ制限されます。以上が私がこれから書こうとしている内容を明確にするのに役立つことを願っています。Telegram にボットを登録するのは非常に簡単です。このプロセスについては、上にリンクされているドキュメントで詳しく説明されています。このアプリケーションの場合、ボットの名前と、ボットの登録時に受け取るトークンだけを知っておく必要があります。基本的、ボットは単なるコンソールベースの Web アプリケーションです。フロントエンドはなく、純粋なコマンド処理のみです。マスターしたいならHibernate にするか、 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()、ボットを起動します。今のところ、「ミラー」のようなもので、送信したメッセージをリダイレクトするだけです。これは次のように動作します。アプリケーションを起動すると、n 秒に 1 回、URL: https://api.telegram.org/BotToken/getMeで Telegram サーバーへのリクエストの送信が開始されます。ここで、BotToken はボットのトークンです。 。応答として、すべてのメッセージを含む JSON を受信します。これらの各メッセージはライブラリによって処理され、OnUpdateReceived(Update update)メッセージとしてメソッドに渡されます。Update物体。それが私たちが取り組んでいることです。ここに Telegram ボットの利点があります。ボットは任意のコンピュータ上で実行でき、テストにはアプリケーションを起動するだけで済み、変更のたびにホストに展開する必要はありません。これはとても便利です。もちろん、Webhook を使用してボットが動作するように構成することもできます。その手順はインターネットで見つけることができます。簡単にするために、 LongPolling を使用します。。メッセージがどのように処理されるか、および応答として何を送信するかは、言語とライブラリの機能によってのみ制限されます。それ以外はすべてあなた次第です。YouTube 動画を検索してくれるボットを作成できます。1 年前のタイムカプセルのように、毎日自分に送信するものを送信するボットを作成できます。あるいは、CRM システムとの統合方法を学び、中小企業向けのボットを作成することもできます。制限されるのは想像力だけです。次に進みます。/ボットを使用したことのある人は、「 」文字で始まるコマンド ( など)を使用してボットと対話すると便利であることを知っています/start。しかし、もっと便利な方法があります。ボタンです。ボタンには 2 種類あります。入力フィールドの下に表示されるボタン ( 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後で説明する を含めることができます。ここで、ユーザーに表示されるボタンのテキストを設定し、ボットに送信されるデータを設定します。この例では、ユーザーには「こんにちは」が表示され、ボタンが押されると数字の 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();
        }
    }
重要:への返信のテキストはCallbackQuery200 文字以内にしてください。このような応答を送信すると、クライアントにはメッセージを含むポップアップ ウィンドウが表示されます。このウィンドウは、表示されてから数秒後に消えることも、ユーザーが [OK] を押すまで表示されることもあります。モードを切り替えるには、メソッドを呼び出しますanswer.setShowAlert(true)trueメソッドに渡すと、OK が押されるまでウィンドウが表示されます。false を渡すと、5 秒後に消えます。これらはすべてTelegram Bot ライブラリの基本機能です。必要に応じて、マルチメディアの送信方法や地理位置情報などを学ぶことができます。 ボットをホスティング プラットフォームにデプロイする作業に進みましょう。私のプロジェクトにはHeroku を選択しました。独自の CLI を備えたかなり便利なホスティング プラットフォームだと思います。無料ですが、このプランでは、リクエストを受信しない状態が 30 分間続くとボットは休止状態になります。リクエストを受信すると起動します。これは非常に迅速に行われるため、気付かないほどです (もちろん、データベース接続が再起動しない限り)。無料プランは、5 MB のデータベース、100 MB のディスク容量、月あたり 2 TB のデータ、および 1 つの dyno によって制限されます。dyno は実行中のアプリケーションです。私はこれまでアプリケーションをデプロイしたことがなかったため、困難を引き起こしたのはデプロイメントだったとすぐに言います。デプロイ中に、Heraku には Procfile という名前のファイル (拡張子なし) が必要です。プロジェクトのルートに作成します。内部には と書きます。workerBot はworker: sh target/bin/workerBotで指定した名前です。ああ_pom.xmlMaven アプリケーション アセンブラー プラグイン(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
以上で、アプリケーションが起動して実行されます。そうでない場合は、ログを注意深く確認してください。おそらく、アプリケーション内のエラーが原因でアプリケーションが失敗したと考えられます。 こんなに長い記事を読んでいただきありがとうございます。誰かがこれを役に立ち、開発中に私が苦労した領域で多くの時間を節約できることを願っています。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION