JavaRush /مدونة جافا /Random-AR /إنشاء روبوت Telegram في Java: من الفكرة إلى النشر
John Watson
مستوى

إنشاء روبوت Telegram في Java: من الفكرة إلى النشر

نشرت في المجموعة
ما هي الروبوتات على أي حال؟ يمكنك أن تقرأ عن هذا بالتفصيل هنا . أولاً، تحتاج إلى قراءة الوثائق الرسمية للمكتبة لتطوير الروبوتات على Telegram (المشار إليها فيما يلي باسم API). إنها ترقد هنا . إنشاء روبوت Telegram في Java: من الفكرة إلى النشر - 1كل شيء هناك يمكن الوصول إليه ومفهوم للغاية. يبدو أن الكتابة ونبتهج! لكن الأمر ليس بهذه البساطة. بعد قضاء الكثير من الوقت في محركات البحث، وجدت مقتطفات من المعرفة حول تطوير الروبوتات، على سبيل المثال، كيفية إنشاء لوحة مفاتيح، ومعالجة CallbackQuery، وما شابه ذلك. لم أجد مطلقًا دليلاً كاملاً وشاملاً لتطوير الروبوتات في Java. وهذا دفعني لكتابة هذا المقال. هناك العديد من المواقع على الإنترنت حيث يمكنك إنشاء الروبوت الخاص بك من خلال النشر الجاهز. لكن النقطة هي. أنه في معظم الأحيان، يتم إنشاء الروبوتات التي يمكنها توفير معلومات أساسية وما إلى ذلك. الروبوت الخاص بنا هو تطبيق ويب متكامل يمكنك ربط قاعدة بيانات به، وتقديم طلبات إلى واجهات برمجة التطبيقات المختلفة، وتحليل المواقع، وإجراء حسابات معقدة، وما إلى ذلك. الأمر محدود فقط بخيالك. أرجو أن أكون في هذه السطور قد أوضحت لكم قليلاً ما سأكتب عنه. يعد تسجيل الروبوت في Telegram أمرًا بسيطًا للغاية، ويتم وصف هذه العملية بالتفصيل في الوثائق الموجودة على الرابط أعلاه. بالنسبة لتطبيقنا، ما عليك سوى معرفة اسم الروبوت والرمز المميز الذي ستحصل عليه عند التسجيل. في الأساس، الروبوت هو مجرد تطبيق ويب لوحدة التحكم. لا توجد واجهة أمامية، ومعالجة أوامر خالصة. إذا كنت تريد إتقان السبات جيدًا أو تعلم كيفية تحليل 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 إلى خادم Telegram مرة واحدة كل عدد n من الثواني على عنوان URL التالي: https://api.telegram.org/BotToken/getMe، حيث يوجد BotToken رمز الروبوت الخاص بك، وتلقي استجابة JSON تحتوي على جميع الرسائل. تتم معالجة كل رسالة من هذا القبيل بواسطة المكتبة وتأتي إلى الطريقة OnUpdateReceived(Update update)ككائن Update. هذا ما نعمل معه. هذا هو جمال روبوتات Telegram، يمكنهم العمل على أي جهاز كمبيوتر، للاختبار، ما عليك سوى تشغيل التطبيق، ولا تحتاج إلى نشره على الاستضافة بعد كل تغيير. أنها مريحة للغاية. بالطبع، يمكن تكوين الروبوت للعمل باستخدام خطاف الويب، ويمكن العثور على الدليل على الإنترنت، وللتبسيط، سنعمل باستخدام LongPolling. إن كيفية معالجة الرسائل وما يجب إرساله ردًا يقتصر فقط على أدوات اللغة والمكتبة، وكل شيء آخر يخضع لتقديرك. يمكنك صنع روبوت يقوم بالبحث لك عن مقاطع الفيديو على اليوتيوب، يمكنك صنع روبوت يرسل لك كل يوم ما ترسله لنفسك، على سبيل المثال، في عام، ما يشبه كبسولة زمنية. أو يمكنك تعلم كيفية الاندماج في أنظمة إدارة علاقات العملاء (CRM) وإنشاء روبوتات للشركات الصغيرة، فكل شيء محدود بخيالك. تفضل. أولئك الذين استخدموا الروبوتات يعرفون أنه من المناسب التفاعل معهم باستخدام الأوامر التي تبدأ بالعلامة «/»، على سبيل المثال /start. ولكن هناك طريقة أكثر ملاءمة - الأزرار. هناك نوعان من الأزرار: تلك التي تظهر أسفل حقل الإدخال، 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()، نسمي هذه الطريقة عن طريق تمرير رسالة إليها، وبالتالي ضبط لوحة المفاتيح لتلك الرسالة. عندما نرسل هذه الرسالة إلى المستخدم، سيرى نص الرسالة التي قمنا بتعيينها، بالإضافة إلى زرين يقولان "مرحبًا" و"مساعدة"، بجوار بعضهما البعض. بالضغط على هذه الأزرار سيتم إرسال رسالة إلى البوت نصها ما هو مكتوب على الزر. أي أنه إذا قام العميل بالنقر فوق "مساعدة"، فسيتلقى الروبوت رسالة تحتوي على النص "مساعدة". بالنسبة له، يبدو الأمر كما لو أن العميل نفسه كتب نص "المساعدة" وأرسله إليه. حسنا، ثم تقوم بمعالجة مثل هذه الرسائل. 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وأضف زرًا مضمّنًا إلى السطر الأول. يمكن أن يحتوي هذا الزر على عنوان URL أو رابط لقناة أو CallbackQueryما سأكتب عنه بعد قليل. نقوم هنا بتعيين النص للزر الخاص بنا الذي سيراه المستخدم ثم نقوم بتعيين البيانات التي سيتم إرسالها إلى الروبوت. في مثالنا، يرى المستخدم "مرحبًا"، وعند النقر عليه، سيتم إرسال الروبوت إلى الرقم 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 له معرفه الخاص. لإرسال رد على كائن معين، 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();
        }
    }
مهم:CallbackQueryيجب ألا يزيد النص الموجود في الإجابة عن 200 حرف! عند إرسال مثل هذا الرد، سيتلقى العميل نافذة منبثقة سيتم فيها كتابة الرسالة. قد تختفي هذه النافذة بعد بضع ثوانٍ من ظهورها، أو قد تتوقف حتى يضغط المستخدم على "موافق". لتبديل هذه الأوضاع، نسميه answer.setShowAlert(true). عندما trueتتوقف النافذة حتى تضغط على OK، عندما falseتختفي بعد 5 ثوانٍ. من حيث المبدأ، هذه هي جميع الميزات الأساسية لمكتبة Telegram bot. إذا كنت ترغب في ذلك، يمكنك معرفة أشياء مثل إرسال الوسائط المتعددة وتحديد الموقع الجغرافي وما إلى ذلك من الوثائق. دعنا ننتقل إلى نشر الروبوت الخاص بنا على الاستضافة. بالنسبة لمشروعي، اخترت Heroku، لأنها في رأيي استضافة مريحة إلى حد ما ولها واجهة سطر الأوامر (CLI) الخاصة بها. إنه مجاني، ولكن بهذا المعدل سيدخل الروبوت الخاص بك في وضع السبات بعد 30 دقيقة إذا لم تكن هناك طلبات. وعندما يُرسل إليه طلب، يستيقظ. يحدث هذا بسرعة كبيرة، ولن تلاحظ ذلك (ما لم تتم إعادة إنشاء الاتصال بقاعدة البيانات بالطبع). الحد الأقصى للخطة المجانية هو قاعدة بيانات تبلغ 5 ميجابايت، ومساحة قرص 100 ميجابايت، وحركة مرور 2 تيرابايت شهريًا، ودينو واحد. Dino هو تطبيقك قيد التشغيل. سأقول على الفور أن مرحلة النشر هي التي سببت لي صعوبات، لأنني لم أقم بنشر تطبيقاتي من قبل. عند النشر، يتطلب Heroku ملفًا باسم Procfile (بدون امتداد). worker: sh target/bin/workerBot نقوم بإنشائه في جذر المشروع، ونكتب عامل Bot هناك - pom.xml سيتم إطلاق الاسم الذي نحدده في البرنامج النصي sh الذي تم إنشاؤه باستخدام البرنامج المساعد Maven appassembler-maven-plugin. يصف البرنامج النصي تشغيل الجرة المترجمة. يُشار إلى اسم الفئة التي سيتم إطلاقها بين <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