JavaRush /وبلاگ جاوا /Random-FA /ایجاد ربات تلگرام در جاوا: از ایده تا استقرار
John Watson
مرحله

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

در گروه منتشر شد
به هر حال ربات ها چیست؟ شما می توانید در این مورد به تفصیل اینجا بخوانید . ابتدا باید اسناد رسمی کتابخانه برای توسعه ربات ها در تلگرام (از این پس 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 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()ربات را راه اندازی می کنیم. در حال حاضر، او فقط هر پیامی را که برای او می فرستیم، به ما هدایت می کند، نوعی "آینه". همه چیز به این صورت عمل می کند: وقتی برنامه را راه اندازی می کنید، شروع به ارسال یک درخواست GET به سرور تلگرام یک بار در هر 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 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 دکمه Hello و Help را در کنار هم می بیند. با کلیک بر روی این دکمه ها پیامی برای ربات ارسال می شود که متن آن همان چیزی است که روی دکمه نوشته شده است. یعنی اگر مشتری روی "Help" کلیک کند، ربات پیامی با متن "Help" دریافت می کند. برای او، مثل این است که مشتری خودش متن «کمک» را نوشته و برایش ارسال کرده است. خوب، پس شما چنین پیام هایی را پردازش می کنید. InlineKeyboardMarkup این نیز آرایه ای از آرایه ها است، شبیه به نشانه گذاری قبلی است، اما منطق عملیاتی در اینجا کمی متفاوت است. چنین صفحه کلیدی به یک پیام خاص گره خورده است و فقط برای آن وجود دارد. در اینجا روش نصب صفحه کلید Inline آورده شده است
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، یک دکمه Inline به خط اول اضافه کنید. چنین دکمه‌ای می‌تواند حاوی یک URL، پیوندی به یک کانال یا CallbackQuery، باشد که کمی بعد در مورد آن خواهم نوشت. در اینجا متنی را برای دکمه خود تنظیم می کنیم که کاربر ببیند و سپس داده هایی را که برای ربات ارسال می شود تنظیم می کنیم. در مثال ما، کاربر "Hello" را می بیند، و با کلیک کردن، شماره 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فقط باید 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();
        }
    }
مهم:متن پاسخ CallbackQueryنباید بیشتر از 200 کاراکتر باشد! هنگام ارسال چنین پاسخی، مشتری یک پنجره پاپ آپ دریافت می کند که پیام در آن نوشته می شود. چنین پنجره ای ممکن است چند ثانیه پس از ظاهر شدن ناپدید شود یا ممکن است تا زمانی که کاربر OK را فشار دهد آویزان شود. برای تغییر این حالت ها، ما را فراخوانی می کنیم answer.setShowAlert(true). زمانی که trueپنجره آویزان می شود تا زمانی که OK را فشار دهید، زمانی که falseبعد از 5 ثانیه ناپدید می شود. در اصل، اینها همه ویژگی های اولیه کتابخانه ربات تلگرام هستند. در صورت تمایل می توانید مواردی مانند ارسال چند رسانه ای، موقعیت جغرافیایی و ... را از مستندات یاد بگیرید. بیایید به سمت استقرار ربات خود در میزبانی حرکت کنیم. برای پروژه خود، Heroku را انتخاب کردم، زیرا به نظر من میزبانی نسبتاً مناسبی است که CLI خاص خود را دارد. رایگان است، اما با این نرخ، ربات شما پس از 30 دقیقه در صورت عدم درخواست به حالت خواب زمستانی می رود. وقتی درخواستی برای او ارسال می شود، از خواب بیدار می شود. این خیلی سریع اتفاق می افتد، شما حتی متوجه نمی شوید (مگر اینکه، البته، اتصال به پایگاه داده دوباره برقرار شود). محدودیت طرح رایگان 5 مگابایت پایگاه داده، 100 مگابایت فضای دیسک، 2 ترابایت ترافیک در ماه، 1 دینو است. Dino برنامه در حال اجرا شماست. فوراً می گویم که این مرحله استقرار بود که برای من مشکلاتی ایجاد کرد، زیرا قبلاً برنامه های خود را اجرا نکرده بودم. هنگام استقرار، Heroku به فایلی به نام Procfile (بدون پسوند) نیاز دارد. worker: sh target/bin/workerBot ما آن را در ریشه پروژه ایجاد می کنیم، workerBot را در آنجا می نویسیم - نامی که در آن تعیین می کنیم. pom.xml اسکریپت sh تولید شده با استفاده از پلاگین Maven 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 project”
بعد باید وارد heroku شوید، در خط فرمان بنویسید
heroku login
داده های خود را که در هنگام ثبت نام مشخص شده است وارد کنید. سپس باید URL مخزن خود را در Heroku پیدا کنید، این کار در تنظیمات انجام می شود. سپس می نویسیم
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