إذن ما هي الروبوتات؟ تستطيع ان تقرأ المزيد عن هذا هنا
. للبدء، تحتاج إلى مراجعة الوثائق الرسمية للمكتبة المستخدمة لتطوير روبوتات Telegram (يشار إليها فيما بعد بـ "API"). ويمكن العثور عليها هنا
.
كل شيء هناك يمكن الوصول إليه وواضح للغاية. يبدو أنه يمكننا فقط كتابة التعليمات البرمجية ونبتهج! لكن الأمر ليس بهذه البساطة. بعد قضاء الكثير من الوقت في البحث، عثرت على معلومات مفيدة حول تطوير الروبوتات، على سبيل المثال، كيفية إنشاء لوحة مفاتيح، والتعامل مع ملف،
شكرا لقراءة مثل هذا المقال الطويل. أتمنى أن يجده شخص ما مفيدًا وأن يوفر لك الكثير من الوقت في المجالات التي سببت لي مشكلة أثناء التطوير.
CallbackQuery
وما إلى ذلك. لكنني لم أجد دليلاً كاملاً وشاملاً لتطوير Java bot. وهو ما دفعني لكتابة هذا المقال. هناك الكثير من مواقع الويب التي يمكنك من خلالها إنشاء الروبوت الخاص بك والذي يمكن نشره بسهولة. ولكن الحقيقة هي أن معظم الروبوتات التي تم إنشاؤها توفر معلومات مرجعية وما شابه ذلك. الروبوت الخاص بنا هو تطبيق ويب متكامل. يمكنك ربط قاعدة بيانات، وتنفيذ طلبات API المختلفة، وتحليل مواقع الويب، وإجراء حسابات معقدة، والمزيد. الامكانيات محدودة فقط بتوقعك. آمل أن يكون ما سبق قد ساعد في توضيح ما سأكتب عنه. من السهل جدًا تسجيل روبوت على 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 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()
، ابدأ تشغيل الروبوت. في الوقت الحالي، يقوم فقط بإعادة توجيه أي رسائل نرسلها إلينا، مثل " المرآة ". يعمل على النحو التالي: عند بدء تشغيل التطبيق، يبدأ في إرسال الطلبات إلى خادم Telegram، مرة كل n ثانية، على عنوان URL التالي: https://api.telegram.org/BotToken/getMe ، حيث BotToken هو الرمز المميز لروبوتك . ردًا على ذلك، يتلقى JSON الذي يحتوي على جميع الرسائل. تتم معالجة كل من هذه الرسائل بواسطة المكتبة وتمريرها إلى OnUpdateReceived(Update update)
الطريقة ككائن Update
. وهذا ما نعمل معه. هنا يكمن جمال روبوتات Telegram: يمكن تشغيلها على أي جهاز كمبيوتر، ويتطلب اختبارها فقط بدء تشغيل التطبيق، ولا تحتاج إلى نشرها على المضيف بعد كل تغيير. هذا مريح للغاية. بالطبع، يمكنك تكوين الروبوت للعمل باستخدام خطافات الويب. يمكنك العثور على توجيهات لذلك على الإنترنت. للتبسيط، سنستخدم LongPolling . إن كيفية معالجة الرسائل وما ترسله ردًا يقتصر فقط على إمكانيات اللغة والمكتبة. كل شيء آخر هو متروك لكم. يمكنك إنشاء روبوت يبحث عنك في مقاطع فيديو YouTube. يمكنك إنشاء روبوت يرسل لك ما ترسله لنفسك كل يوم، مثل كبسولة زمنية منذ عام مضى. أو يمكنك تعلم كيفية التكامل مع أنظمة إدارة علاقات العملاء (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 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()
الطريقة بعد تمريرها رسالة. هذه هي الطريقة التي قمنا بها بإعداد لوحة المفاتيح لتلك الرسالة. عندما نرسل هذه الرسالة إلى المستخدم، سيرى نص رسالتنا وزرين يقولان "مرحبًا" و "مساعدة" ، أحدهما تحت الآخر. عند النقر على أحد هذه الأزرار، يتم إرسال رسالة إلى الروبوت تحتوي على نص الزر. لذلك، إذا قام العميل بالنقر فوق "مساعدة" ، فسيتلقى الروبوت رسالة تحتوي على "مساعدة". بالنسبة للروبوت، يبدو أن العميل نفسه كتب "مساعدة" وأرسل النص إلى الروبوت. ومن ثم تقوم بمعالجة الرسائل.
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
. كل كائن في 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. إذا قمت بتمرير خطأ، فإنه يختفي بعد 5 ثواني. هذه كلها الميزات الأساسية لمكتبة Telegram Bot . إذا كنت تريد، يمكنك تعلم أشياء مثل كيفية إرسال الوسائط المتعددة وتحديد الموقع الجغرافي وما إلى ذلك. فلننتقل إلى نشر الروبوت الخاص بنا على منصة الاستضافة. بالنسبة لمشروعي، اخترت Heroku . أعتقد أنها منصة استضافة مريحة إلى حد ما مع واجهة سطر الأوامر (CLI) الخاصة بها. إنه مجاني، ولكن في هذه الخطة، سيدخل الروبوت الخاص بك في وضع السبات بعد 30 دقيقة من عدم تلقي أي طلبات. سوف يستيقظ عند تلقي الطلب. يحدث هذا بسرعة كبيرة، حتى أنك لن تلاحظ ذلك (ما لم يتم إعادة تشغيل اتصال قاعدة البيانات بالطبع). الخطة المجانية محدودة بقاعدة بيانات 5 ميجابايت، ومساحة قرص 100 ميجابايت، وبيانات 2 تيرابايت شهريًا، ودينو واحد. الدينامو هو تطبيقك قيد التشغيل. سأقول على الفور أن النشر هو الذي سبب لي صعوبات، لأنني لم أقم بنشر تطبيقاتي من قبل. أثناء النشر، يتطلب Heroku ملفًا باسم Procfile (بدون امتداد). نقوم بإنشائه في جذر المشروع. في الداخل، نكتب worker: sh target/bin/workerBot
، حيث workerBot هو الاسم المحدد في pom.xml
. سيتم إطلاق البرنامج النصي sh، الذي تم إنشاؤه بواسطة البرنامج المساعد Maven Application Assembler (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]
تمت إضافة مستودع Heroku عن بعد لمستودعك. التالي نكتب
git push heroku master
ثم ننتظر... إذا تم نشر التطبيق بنجاح، قم بتنفيذ الأمر التالي
heroku ps:scale worker=1
وهذا كل شيء، التطبيق الخاص بك جاهز للعمل. إذا لم يكن الأمر كذلك، فانظر إلى السجلات بعناية. على الأرجح، حدث خطأ في تطبيقك أدى إلى فشله.
GO TO FULL VERSION