منذ وقت ليس ببعيد اقترحت أن تستخدم روبوت البرقية الخاص بي.
Telegram Bot - مساعد لتخطيط الأحداثبعد تلقي العديد من الأسئلة في PM ، أدركت أن مسألة إنشاء روبوتات لـ Telegram شائعة جدًا.
سألوني الكود المصدري للبوت ، وطلب منهم أن يشاركوا أمثلة محددة لتنفيذ ميزات البوت المختلفة ، وطلبوا مني اقتراح نوع من الوظائف للعمل مع البوت والرسائل.
قررت أن أكتب سلسلة من المقالات التي أريد أن أوضح فيها الأشياء الأساسية التي ستحتاجها لكتابة روبوتك.
تنتظرك Java و Maven و TelegramAPI و Lombok و Log4j.
من يهتم - من فضلك ، تحت القط ...
وسأذهب مباشرة من البطاقة الرابحة :)
ما طلب في المادة السابقة.
يمكنك العثور على أكواد المصدر للمشروع
هنا .
في الفرع "
الرئيسي " سيكون هناك الإصدار الأخير من برنامج الروبوت ، والذي سنكتبه معك في عملية ظهور مقالات جديدة.
سيكون المصدر الكامل لهذه المقالة في فرع "
Part1-Base ".
في هذا الجزء ، سننشئ معك قالبًا أساسيًا قادرًا على:
- تسجيل بوت على خوادم Telegram
- تلقي الرسائل المكتوبة إلى الروبوت
- الرد على الأمر / start
إنشاء مشروع مخضرم قياسي
(
سأفتقد الأدلة المتعلقة بالعمل مع بيئة التطوير والأشياء الأساسية من برمجة Java. كل هذه الأشياء من السهل جدًا استخدام google. وإذا لم ينجح ذلك ، فاكتب الأسئلة ).
دعونا نرى ما التبعيات التي سنحتاجها في هذا المشروع.بادئ ذي
بدء ، هذا
لومبوك . ما هذا ولماذا - يمكنك أن تقرأ ، على سبيل المثال ،
هنا .
وتأكد من إضافة مسجل. أستخدم
log4j وأبعد قليلاً ، سأريك مدى فائدة استخدامه عند تصحيح هذا التطبيق وفهم أعمق لعملية TelegramAPI.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
و ، لأن نكتب روبوتًا لـ Telegram ، ثم المكتبة نفسها من Telegram:
<dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency>
يمكن العثور على هيكل ملف بوم
هنا.يمكن رؤية بنية ملف pom.xml
هنا .
بعد ذلك ، نضيف الفئة الأساسية
Bot.java ، والتي ستنفذ كل تفاعلنا مع خدمات Telegram. سوف نعمل مع LongPolling ، كما لا تتطلب هذه الطريقة شهادات تشفير ويمكن تشغيلها من أي جهاز به Java على متن الطائرة.
للقيام بذلك ، نرث من فئة
TelegramLongPollingBot وتنفيذ الأساليب الأساسية:
باطلة onUpdateReceived العامة (تحديث التحديث)
سلسلة getBotUsername العامة ()
سلسلة getBotToken العامة ()ومن جانبنا ، سنحتاج إلى إضافة إجراء يربط برنامج الروبوت الخاص بنا بـ TelegramAPI:
botConnect الفراغ العام () import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) {
من حيث المبدأ ، كل شيء. يمكن أن يتصل هذا الرمز بخوادم Telegram وعند تسجيل الرسائل الموجهة إليه ، فإنه سيتم تسجيل المعلومات في ملف السجل الذي تلقاه Update.
دعنا نخلق فئة من شأنها تشغيل تطبيقنا.
وسيتم ذلك عن طريق App.java الطبقة. رابط إلى الملف:
هنا package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } }
كما ترون ، لكي يعمل الروبوت ، لا نحتاج سوى إلى "اسم الروبوت" و "الرمز المميز" ، والذي سنمرره في مُنشئ فئة Bot لدينا.
يمكنك الحصول على الاسم والرمز المميز للبوت من والد جميع برامج الروبوت :) عن طريق الكتابة إليه في برقية.
لقبه:
@ بوتفثيرالتواصل معه بسيط جدا وموجز.
في القيادة
/ newbot
نتيجة لذلك ، يجب أن تحصل على مربع الحوار هذا:

يكتبون هنا أيضًا أنه أكثر دقة ، لا تعرضوا هذه المعلومات لأي شخص ، وإلا فسيتمكن شخص آخر من التحكم في روبوتك :)
ستقول إنني لست دقيقًا للغاية ... ربما ، لكن والد برامج الروبوت يسمح لنا بتغيير الرموز وتذكر تلك الموجودة في متناول الجمهور. لذلك ، عندما تحاول الاتصال ببياناتي ، ستتلقى الرسالة التالية:
2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook
لذلك مع بياناتي لا يمكنك الاتصال. سجل لك. حدد بيانات جديدة في الفصل
App.javaالآن عن طريق تشغيل الطريقة الرئيسية في فئة التطبيقات ، نسمح لبوتنا بالاتصال وانتظار الرسائل الجديدة. سوف يكتب لنا عن تصرفاته ومحاولاته في وحدة التحكم.
Log4j
تذكر ، أعلاه تحدثت عن فائدة مكتبة log4j. وهنا للفضوليين ، يفتح klondike من البيانات المفيدة.
يحتوي ملف
log4j.properties بالفعل على إعدادات أساسية للتسجيل ومستويات تسجيل محددة لفئات الجهات الخارجية ولمن يعملون في برنامج الروبوت الخاص بنا.
log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout
يشار إلى المستوى الأساسي للتسجيل على أنه خطأ.
بالنسبة لفئتي Bot و App ، تتم الإشارة إلى إخراج السجل بمستوى Debug.
ما هي هذه المستويات وكيف تختلف - يمكنك أن تجد بسهولة في جوجل.إذا كنت ترغب في معرفة كيفية ترتيب مكتبة Telegram وبأية طريقة تعمل بها ، فقم بتحويل وضع التسجيل العام إلى مستوى أقل: معلومات أو تصحيح.
وعند بدء تشغيل التطبيق ، سترى في وحدة التحكم عدد الأشياء المثيرة للاهتمام التي تحدث في عملية الاتصال والعمل. كم مرة يتم فيها استقصاء وظائفك باستخدام اسم الروبوت والرمز المميز.
تتغير مستويات التسجيل مع هذا السطر:
للحصول على السجلات وفقًا لمستوى المعلومات ، ضع مثل هذا:
log4j.rootLogger= info, file
بالنسبة لمستوى التصحيح ، مثل هذا:
log4j.rootLogger= debug, file
وفي الختام
الآن لدينا روبوت: إنه يربط ، ويظهر لنا سجلات جميلة وتقارير تفيد بأن الرسائل تصل إليه.
لكن أعلاه ، وعدتك بأن الروبوت سوف يستجيب لأمر البدء. دعنا نغير الإجراء المسؤول عن معالجة الرسائل المستلمة قليلاً.
@Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } }
كما ترون من الكود ، يقوم البوت بما يلي:
- يتلقى تحديثًا ويلتقط رقم هويته في السجل.
- يسترجع معرف الدردشة ونص الرسالة من الرسالة المرسلة
- يتم التحقق مما اذا كان هذا النص هو أمر "/ start"
- وفي حالة المقارنة الناجحة ، فإنها تنشئ رسالة استجابة وترسلها إلى الدردشة ، مع تلقي المعرف مسبقًا
أتمنى أن تجدها مفيدة ومثيرة للاهتمام.
في المستقبل سأريكم كيف يتم تنفيذه في روبوتاتي:
- استخدام فرق مختلفة
- ربط هذه الأوامر للمعالجات
- multithreading: تلقي وإرسال الرسائل بشكل مستقل
- تنسيق الرسالة
- العمل مع الأزرار و callbacks
- تحرير المشاركات القديمة
على هذا الأساس ، في متناول الجمهور ، يعمل الآن اثنان من برامجي.
شيء واحد تعرفه هو
مساعد لتخطيط الأحداث .
والثاني -
مروحة صفيق الفيلم . يحب الأفلام ويعرف الكثير عنها. وحتى أكثر يحب لتبادل معرفته معك. يقود
قناته في برقية ، يقرر فيها الأفلام التي يحبها ويعرضها عليك. إنه يعرف كيفية إنشاء اختيارات فردية حسب النوع وإنشاء اشتراك في توصيات مخصصة. إنه يعرف كيفية العثور على روائع لم تسمع بها من قبل ولم يعرف حتى كيف يمكن العثور على مثل هذه الأفلام على الإطلاق.
على سبيل المثال ، هل تعتقد أن هناك أفلامًا تشتمل على مزيج "غريب" من الأنواع مثل: الأفلام الوثائقية والرعب والكوميديا.
لكن الروبوت على القيادة
2010-
سيقول أنه من عام 2010 وحتى الوقت الحالي ، تم تصوير هذه الأفلام حتى 6 قطع :)
كيفية العمل باستخدام أوامر مماثلة ، وكيفية تحليل سلاسل وتسلسل الأوامر التي سنناقشها معك في المنشورات التالية.
شكرا لاهتمامكم البرمجة ممتعة :)