CodeGym /وبلاگ جاوا /Random-FA /ایجاد ربات تلگرام در جاوا: از مفهوم تا استقرار
John Squirrels
مرحله
San Francisco

ایجاد ربات تلگرام در جاوا: از مفهوم تا استقرار

در گروه منتشر شد
پس ربات ها چیست؟ شما می توانید بیشتر در مورد این در اینجا بخوانید . برای شروع، باید اسناد رسمی کتابخانه مورد استفاده برای توسعه ربات های تلگرام (از این پس "API") را بررسی کنید. آن را می توان اینجا پیدا کرد .
ایجاد ربات تلگرام در جاوا: از مفهوم تا استقرار - 1
همه چیز در آنجا بسیار در دسترس و واضح است. به نظر می رسد ما فقط می توانیم کد بنویسیم و خوشحال باشیم! اما به این سادگی نیست. پس از صرف زمان زیادی برای جستجو، نکاتی از دانش در مورد توسعه ربات پیدا کردم، به عنوان مثال، چگونه یک صفحه کلید بسازیم، یک ربات را مدیریت کنم CallbackQuery، و غیره. اما، من یک راهنمای کامل و جامع برای توسعه ربات جاوا پیدا نکردم. این باعث شد من این مقاله را بنویسم. وب‌سایت‌های زیادی وجود دارند که می‌توانید ربات خود را که به راحتی قابل استقرار است ایجاد کنید. اما واقعیت این است که اکثر ربات های ایجاد شده اطلاعات مرجع و موارد مشابه را ارائه می دهند. ربات ما یک برنامه وب تمام عیار است. شما می توانید یک پایگاه داده را متصل کنید، درخواست های API مختلف را اجرا کنید، وب سایت ها را تجزیه کنید، محاسبات پیچیده را انجام دهید و موارد دیگر. امکانات فقط با تخیل شما محدود شده است. امیدوارم مطالب بالا به روشن شدن آنچه می خواهم در مورد آن بنویسم کمک کرده باشد. ثبت ربات در تلگرام بسیار آسان است. این فرآیند به طور مفصل در اسناد مرتبط با بالا توضیح داده شده است. برای برنامه ما، فقط باید نام ربات و رمزی را که هنگام ثبت ربات دریافت می کنید، بدانید. اساساً یک ربات فقط یک برنامه وب مبتنی بر کنسول است. هیچ جلویی وجود ندارد، فقط پردازش دستور خالص است. اگر می‌خواهید به 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 ثانیه یک بار، به آدرس زیر: https://api.telegram.org/BotToken/getMe ، جایی که BotToken توکن ربات شما است. . در پاسخ، JSON حاوی تمام پیام ها را دریافت می کند. هر یک از این پیام ها توسط کتابخانه پردازش می شود و OnUpdateReceived(Update update)به عنوان یک Updateشی به متد ارسال می شود. و این چیزی است که ما با آن کار می کنیم. زیبایی ربات‌های تلگرام در اینجا نهفته است: آنها می‌توانند بر روی هر رایانه‌ای اجرا شوند، آزمایش آن فقط نیاز به راه‌اندازی برنامه دارد و نیازی نیست پس از هر تغییر آن را در هاست اجرا کنید. این بسیار راحت است. البته، شما می توانید یک ربات را برای کار با استفاده از وب هوک پیکربندی کنید. شما می توانید برای آن در اینترنت راهنمایی پیدا کنید. برای سادگی، از LongPolling استفاده خواهیم کرد . نحوه پردازش پیام‌ها و آنچه که در پاسخ ارسال می‌کنید، تنها با قابلیت‌های زبان و کتابخانه محدود می‌شود. همه چیز دیگر به شما بستگی دارد. می توانید رباتی بسازید که ویدیوهای یوتیوب را برای شما جستجو کند. شما می‌توانید رباتی بسازید که آنچه را که هر روز برای خودتان ارسال می‌کنید، مانند یک کپسول زمانی یک سال پیش، برایتان ارسال کند. یا می‌توانید یاد بگیرید که با سیستم‌های CRM یکپارچه شوید و ربات‌هایی را برای کسب‌وکارهای کوچک بسازید—شما فقط با تخیل خود محدود هستید. در حال حرکت کسانی که از ربات‌ها استفاده کرده‌اند می‌دانند که تعامل با آنها با استفاده از دستوراتی که با /کاراکتر " " شروع می‌شوند، راحت است /start. اما یک راه راحت تر وجود دارد: دکمه ها. دو نوع دکمه وجود دارد: دکمه‌هایی که در زیر یک فیلد ورودی ( ReplyKeyboardMarkup) ظاهر می‌شوند و دکمه‌هایی که مستقیماً زیر پیامی هستند که به آن پیوند داده شده‌اند ( InlineKeyboardMarkup). شما می توانید درک اولیه ای از آنها را از توضیحات آنها در مستندات بدست آورید.

ReplyKeyboardMarkup

در واقع، این آرایه ای از آرایه های دکمه است: 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 دکمه را می بیند که یکی زیر دیگری عبارت "سلام" و "کمک" را نشان می دهد. هنگامی که یکی از این دکمه ها کلیک می شود، پیامی حاوی متن دکمه برای ربات ارسال می شود. بنابراین، اگر مشتری روی "Help" کلیک کند ، ربات یک پیام با "Help" دریافت می کند. برای ربات، به نظر می رسد که خود مشتری "Help" را نوشته و متن را برای ربات ارسال کرده است. و سپس پیام ها را پردازش می کنید.

InlineKeyboardMarkup

این نیز آرایه ای از آرایه ها است. این شبیه به نشانه گذاری قبلی است، اما منطق در اینجا کمی متفاوت عمل می کند. این نوع کیبورد به یک پیام خاص متصل است و فقط برای آن وجود دارد. در اینجا روشی برای تنظیم صفحه کلید درون خطی وجود دارد:
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. هر شی در تلگرام شناسه مخصوص به خود را دارد. برای ارسال پاسخ به یک خاص CallbackQuery، فقط باید شناسه آن را بدانید که از شی مربوطه دریافت می کنیم. برای ارسال پاسخ، این روش را فراخوانی می کنیم:
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 CallbackQueryنباید بیشتر از 200 کاراکتر باشد! پس از ارسال چنین پاسخی، مشتری یک پنجره پاپ آپ حاوی پیام را مشاهده می کند. این پنجره می تواند چند ثانیه پس از ظاهر شدن ناپدید شود یا تا زمانی که کاربر OK را فشار دهد باقی بماند. برای تغییر حالت ها، answer.setShowAlert(true)روش را فراخوانی می کنیم. اگر به روش عبور کنید true، پنجره تا زمانی که OK فشار داده شود باقی می ماند. اگر غلط را پاس کنید، پس از 5 ثانیه ناپدید می شود. اینها همه از ویژگی های اصلی کتابخانه ربات تلگرام هستند . اگر می خواهید، می توانید چیزهایی مانند نحوه ارسال چند رسانه ای، موقعیت جغرافیایی، و غیره را بیاموزید. برای پروژه ام Heroku را انتخاب کردم . من فکر می کنم این یک پلت فرم میزبانی نسبتا راحت با CLI خود است. این برنامه رایگان است، اما در این طرح، ربات شما پس از 30 دقیقه پس از دریافت هیچ درخواستی، در حالت خواب زمستانی قرار می گیرد. زمانی که درخواستی دریافت شود، بیدار می شود. این خیلی سریع اتفاق می افتد، شما حتی متوجه نمی شوید (مگر اینکه، البته، اتصال پایگاه داده مجددا راه اندازی نشود). این طرح رایگان با یک پایگاه داده 5 مگابایتی، 100 مگابایت فضای دیسک، 2 ترابایت داده در ماه و 1 داینو محدود شده است. Dyno برنامه در حال اجرا شماست. من فوراً می گویم که این استقرار بود که برای من مشکل ایجاد کرد، زیرا قبلاً هرگز برنامه های خود را اجرا نکرده بودم. در طول استقرار، Heroku به فایلی به نام Procfile (بدون پسوند) نیاز دارد. ما آن را در ریشه پروژه ایجاد می کنیم. در داخل، ما می نویسیم worker: sh target/bin/workerBot، جایی که workerBot نام مشخص شده در است pom.xml. یک اسکریپت sh ، تولید شده توسط 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 ثبت نام کنید و Git و Heroku CLI را نصب کنید . اگر برنامه شما نیاز به پایگاه داده دارد، فراموش نکنید که هنگام ایجاد یک برنامه جدید، پایگاه داده مورد نیاز را اضافه کنید. علاوه بر این، باید هاست، نام کاربری، رمز عبور و پورت پایگاه داده خود را تعیین کنید و سپس آنها را در برنامه خود نشان دهید. در مرحله بعد، قبل از استقرار، پروژه خود را با استفاده از Maven بسازید .
mvn clean install
ابتدا به دایرکتوری پروژه خود می رویم و مخزن را با دستور مقداردهی اولیه می کنیم git init. سپس پروژه خود را به این مخزن اضافه می کنیم.
git add .
سپس تغییرات را انجام می دهیم
git commit -m "First commit in the project"
در مرحله بعد، باید وارد heroku شوید. زیر را در خط فرمان بنویسید
heroku login
مدارکی را که در حین ثبت نام ایجاد کرده اید وارد کنید. پس از آن، URL مخزن خود را در heroku تعیین کنید. شما این کار را در تنظیمات انجام دهید. سپس می نویسیم
git remote add heroku [url]
یک مخزن هیروکو از راه دور برای مخزن شما اضافه شده است. بعد می نویسیم
git push heroku master
سپس منتظر می مانیم... اگر برنامه با موفقیت اجرا شد، دستور زیر را اجرا کنید
heroku ps:scale worker=1
و تمام، برنامه شما آماده و در حال اجرا است. اگر اینطور نیست، به سیاهههای مربوط به دقت نگاه کنید. به احتمال زیاد، یک خطا در برنامه شما باعث از کار افتادن آن شده است. از شما برای خواندن چنین مقاله طولانی متشکرم. امیدوارم کسی آن را مفید بداند و زمان زیادی را در زمینه هایی که در طول توسعه برای من مشکل ایجاد کرد، صرفه جویی کند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION