با سلام خدمت دوستان عزیزم. بله بله دقیقا دوستان من قبلاً آنقدر با این سری مقالات آشنا شده ام که آن دسته از افرادی که مرتباً قدردانی خود را در نظرات می نویسند و/یا نشان می دهند که مطالب را خوانده و درک کرده اند قبلاً به هم نزدیک شده اند. من و تو از هر دو طرف به سمت یک هدف حرکت می کنیم. شما می خواهید بفهمید، اما من می خواهم توضیح دهم. و ما همان هدف نهایی را داریم - یک برنامه مکتوب که از ابتدا تا انتها برای شما قابل درک است. ممکن است قبلاً درباره بسیاری از مواردی که در این مقاله توضیح خواهم داد شنیده باشید. فکر نمی کنم چیز جدید و خارق العاده ای به شما بگویم (اما در چارچوب پروژه لازم است این را بدانید/تکرار کنید). در بهار یک ربات برای خودم نوشتم، بنابراین ما به "الگوهای" آن تکیه خواهیم کرد.
ما JRTB-2 می نویسیم
ما همان کاری را که در مقاله با task JRTB-0 انجام دادیم انجام خواهیم داد :- ما شعبه اصلی را در پروژه محلی با استفاده از ترکیب ctrl + t به روز می کنیم .
- بر اساس شاخه اصلی، ما ایجاد می کنیم:
- یک ربات اضافه کنید.
- ما یک commit جدید با شرح کارهای انجام شده ایجاد می کنیم و آن را به GitHub فشار می دهیم.
- یک درخواست کشش برای شاخه اصلی ایجاد کنید و دوباره آن را بررسی کنید. ما منتظریم تا ساخت (اقدامات github) انجام شود، آن را در شاخه اصلی ادغام کنید.
- کار مربوطه را ببندید.
ربات تلگرام چیست؟
ما، توسعهدهندگان، میتوانیم کار با یک ربات تلگرام را به این شکل تصور کنیم: ما از مشتری آنها برای کار با آنها استفاده میکنیم. ما یک کتابخانه آماده برای کار داریم . مجموعه ای از اقدامات وجود دارد که پس از آن ربات تلگرام متوجه می شود که با برنامه ما مرتبط است. و در حال حاضر در داخل برنامه یاد خواهیم گرفت که چگونه نامه ها، دستورات را دریافت کنیم و به نوعی آنها را پردازش کنیم. چیزی به نام دستور در ربات های تلگرام وجود دارد : با علامت اسلش «/» شروع می شود. بعد از آن بلافاصله کلمه را با هم می نویسیم و این یک دستور محسوب می شود. به عنوان مثال، دو دستور وجود دارد که همه باید بدانند:- / start - شروع به کار با ربات.
- /stop - پایان کار با ربات.
با BotFather یک ربات بسازید
برای اتصال یک ربات، ابتدا باید آن را ایجاد کنید. تلگرام یک رویکرد دارد - ایجاد یک ربات با نام منحصر به فرد خود. همچنین یک توکن (رشته بزرگی که مانند رمز عبور کار می کند) همراه خواهد بود. من قبلا یک ربات برای JavaRush ایجاد کرده ام - @javarush_community_bot . این ربات هنوز خالی است و نمی تواند کاری انجام دهد. نکته اصلی این است که باید _bot در انتهای نام وجود داشته باشد . برای نشان دادن نحوه انجام این کار، من یک ربات ایجاد می کنم که عملکرد خود را روی آن آزمایش می کنیم. از نظر پروژه های واقعی، این یک محیط آزمایشی خواهد بود. و اصلی ترین ما محیط prod خواهد بود (prod - production، یعنی محیط واقعی که پروژه در آن اجرا می شود). البته، میتوان محیط دیگری را اضافه کرد - یک محیط sandbox: یک sandbox مشترک، قابل تغییر تر و قابل دسترس برای همه شرکت کنندگان در توسعه. اما این فقط وضعیت را در مرحله ایجاد پروژه پیچیده می کند. در حال حاضر، اجازه دهید دو ربات دیگر برای تست و برای محیط سندباکس ایجاد کنیم. اولین قدم ایجاد (ثبت نام) یک ربات در خود تلگرام است. ما باید ربات را پیدا کنیم: @BotFather و دستور را روی آن بنویسیم: /newbot در مرحله بعد، از ما خواسته می شود که نامی برای این ربات بگذاریم. از آنجایی که این یک ربات برای آزمایش وظایف است، نام آن مناسب خواهد بود: [TEST] JavarushBot اکنون زمان آن است که یک نام منحصر به فرد بدهید که همیشه می توان آن را پیدا کرد - نام کاربری آن: test_javarush_community همانطور که در بالا گفتم، باید _bot را اضافه کنید. پسوند برای نام کاربری، بنابراین دوباره می نویسیم: test_javarush_community_bot و تمام! ربات ایجاد شده است. اکنون با استفاده از نام کاربری و رمز می توان آن را به پروژه ما متصل کرد. البته برای عملکرد بدون مشکل سرور تست، توکن (در اصل رمز ورود به ربات) این ربات را برای مشاهده عمومی نمایش نمی دهم.ما ربات را به پروژه متصل می کنیم
ما کتابخانه را به طور معمول درج نمی کنیم، اما بلافاصله از اسکلت خود - SpringBoot استفاده خواهیم کرد. او چیزی به عنوان استارتر دارد. با گنجاندن کتابخانه، می توانیم از آن استفاده کنیم تا به SpringBoot بفهمیم که می خواهیم پروژه را به درستی پیکربندی کنیم. اگر بخواهیم مسیر معمولی را که در بسیاری از جاها توضیح داده شده است برویم، باید یک پیکربندی در جایی ایجاد کنیم که چیزی شبیه به این داشته باشد:ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
در اینجا یک شی ایجاد می شود که با آن می توانید با ربات ارتباط برقرار کنید. در مورد ما، استارتی که میخواهیم وصل کنیم همه چیز را در جایی "زیر هود" برای ما انجام میدهد (این نیز ترجمه عبارتی است که اغلب در IT استفاده میشود - زیر کاپوت). در اینجا یک پیوند به این استارتر است . بلافاصله می توانید از فایل README.md ببینید که چیست، چرا و چگونه از آن استفاده کنید. برای اتصال آن، فقط باید این وابستگی را به حافظه اضافه کنید. این همه چیز است :) در اینجا وابستگی لازم است:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.0.1</version>
</dependency>
آن را به حافظه خود اضافه می کنیم. ما نسخه را همانطور که انتظار می رود نصب می کنیم و پروژه Maven را به روز می کنیم. بر اساس توضیحات، فقط باید یک کلاس جدید ایجاد کنیم، از TelegramLongPollingBot ارث ببریم و این کلاس را به Application Context SpringBoot خود اضافه کنیم. Application Context مکانی است که اشیاء ایجاد شده برای اجرای پروژه در آن ذخیره می شوند. برای اضافه کردن یک کلاس، باید از یکی از حاشیهنویسیها استفاده کنید: @Component، @Service، @Repository، @Controller. یا حاشیهنویسی Bean@ اگر از طریق روشی در یک کلاس پیکربندی ایجاد شود (یعنی در کلاسی که با حاشیهنویسی پیکربندی مشخص شده است). من می دانم که همه اینها ممکن است هنوز غیرقابل درک به نظر برسد. اما وقتی شروع به کشف آن کنید، خواهید دید که هیچ چیز پیچیده ای وجود ندارد. برای درک سریع Spring Boot، من یک کتاب جالب را توصیه می کنم - Spring In Action 5th edition. اگر تمایلی وجود داشته باشد می توانم یک سری مقاله بر اساس این کتاب بنویسم. بیا برگردیم. در بسته ای که شامل JavarushTelegramBotApplication است، بسته ربات را ایجاد می کنیم که حاوی ربات تلگرام ما خواهد بود. نام آن JavaRushTelegramBot خواهد بود :
package com.github.javarushcommunity.jrtb.bot;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;
/**
* Telegrambot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {
@Override
public void onUpdateReceived(Update update) {
}
@Override
public String getBotUsername() {
return null;
}
@Override
public String getBotToken() {
return null;
}
}
این کلاس انتزاعی بود و سه روش باید پیاده سازی می شد. بیایید در مورد آنها با جزئیات بیشتر صحبت کنیم:
- onUpdateReceived (به روز رسانی به روز رسانی) - این نقطه ورودی است که پیام های کاربران در آن می رسد. تمام منطق جدید از اینجا خواهد آمد.
- getBotUsername() - در اینجا باید نام کاربری ربات خود را که به آن متصل خواهیم شد اضافه کنید.
- getBotToken() - و این توکن ربات است.
- bot.username ;
- bot.token .
package com.github.javarushcommunity.jrtb.bot;
import org.springframework.beans.factory.annotation.Value;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;
/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {
@Value("${bot.username}")
private String username;
@Value("${bot.token}")
private String token;
@Override
public void onUpdateReceived(Update update) {
}
@Override
public String getBotUsername() {
return username;
}
@Override
public String getBotToken() {
return token;
}
}
مشاهده می شود که مقدار متغیر را به حاشیه نویسی منتقل کردیم. و هنگامی که SpringBoot شی ربات ما را ایجاد می کند، مقادیر از ویژگی ها گرفته می شود (دوباره، ردیابی کاغذ از انگلیسی - خواص). ما تقریبا اینجا هستیم. باید کاری کنید که ربات به چیزی پاسخ دهد. بنابراین، بیایید روش onUpdateReceived را به روز کنیم . ما باید پیامی را که برای ربات آمده است بازیابی کنیم و آن را ارسال کنیم. به این ترتیب متوجه می شویم که ربات کار می کند. برای انجام این کار، ما به طور تقریبی و سریع آنچه را که لازم است می نویسیم:
@Override
public void onUpdateReceived(Update update) {
if(update.hasMessage() && update.getMessage().hasText()) {
String message = update.getMessage().getText().trim();
String chatId = update.getMessage().getChatId().toString();
SendMessage sm = new SendMessage();
sm.setChatId(chatId);
sm.setText(message);
try {
execute(sm);
} catch (TelegramApiException e) {
//todo add logging to the project.
e.printStackTrace();
}
}
}
همه چیز در اینجا بسیار ساده است: ما بررسی میکنیم که پیام واقعاً وجود دارد، بنابراین خود پیام ( پیام ) و شناسه چت ( chatId ) را که مکاتبات در آن انجام میشود استخراج میکنیم. بعد، یک شی برای ارسال پیام SendMessage ایجاد می کنیم ، خود پیام و شناسه چت را به آن منتقل می کنیم - یعنی چه چیزی را به ربات ارسال کنیم و کجا. ما در حال حاضر به اندازه کافی از این. در مرحله بعد، متد اصلی را در کلاس JavarushTelegramBotApplication اجرا می کنیم و به دنبال ربات خود در تلگرام می گردیم: از لاگ ها می بینیم که ربات شروع شده است. بنابراین، وقت آن است که به تلگرام بروید و به ربات بنویسید: شروع را کلیک می کنیم و بلافاصله یک پاسخ دریافت می کنیم: بیایید چند تا مزخرف دیگر برای بررسی بنویسیم: و تمام، در این مرحله می توانیم بگوییم که وظیفه JRTB-2 ما تکمیل شده است. . شما واقعاً نمی توانید هیچ آزمایشی را در اینجا بنویسید، بنابراین ما همه چیز را همانطور که هست رها می کنیم. بعد باید یک commit جدید ایجاد کنید: به نام commit توجه کنید: دوباره توجه شما را به این جلب می کنم. یک commit ابتدا شامل نام وظیفه است و سپس شرح مفصل تری از آنچه انجام شده است. روی Commit and Push... کلیک کنید و با کلیک مجدد روی Push تأیید کنید : به پروژه ما بروید . مانند قبل، GitHub قبلا شعبه جدید را دیده است و پیشنهاد ایجاد یک درخواست کشش برای main را داده است. ما مقاومت نمی کنیم و آن را ایجاد می کنیم: طبق معمول، ما قبلاً یک برچسب، یک پروژه انتخاب کرده ایم و آن را به من اختصاص داده ایم. در نهایت روی Create Pull Request کلیک کنید. بیایید کمی صبر کنیم تا ساخت به پایان برسد - و تمام، درخواست کشش برای ادغام آماده است:
نسخه سازی
من به نوعی این نکته را از دست دادم که باید نسخه سازی را انجام دهیم. برای این کار چند تغییر دیگر در شعبه خود ایجاد می کنیم. ما به IDEA برمی گردیم و به نسخه پروژه در حافظه نگاه می کنیم: نسخه 0.0.1-SNAPSHOT است . این نسخه وظیفه است. و ما با به روز رسانی نسخه پروژه با هر مشکل جدید حل شده شروع خواهیم کرد. تا زمانی که به MVP برسیم، نسخه با پسوند -SNAPSHOT خواهد آمد. طرح نسخه سازی چگونه خواهد بود؟ XYZ-SNAPSHOT کجا:- X - به روز رسانی نسخه اصلی، اغلب شامل مشکلات سازگاری با نسخه قبلی است.
- Y - تغییرات نه چندان بزرگ، کاملاً با نسخه قبلی سازگار است.
- Z شمارنده ای از عیوب است که ما پیدا کردیم و تعمیر کردیم.
GO TO FULL VERSION