با سلام خدمت دوستان عزیزم. بله بله دقیقا دوستان من قبلاً آنقدر با این سری مقالات آشنا شده ام که آن دسته از افرادی که مرتباً قدردانی خود را در نظرات می نویسند و/یا نشان می دهند که مطالب را خوانده و درک کرده اند قبلاً به هم نزدیک شده اند. من و تو از هر دو طرف به سمت یک هدف حرکت می کنیم. شما می خواهید بفهمید، اما من می خواهم توضیح دهم. و ما همان هدف نهایی را داریم - یک برنامه مکتوب که از ابتدا تا انتها برای شما قابل درک است. ممکن است قبلاً درباره بسیاری از مواردی که در این مقاله توضیح خواهم داد شنیده باشید. فکر نمی کنم چیز جدید و خارق العاده ای به شما بگویم (اما در چارچوب پروژه لازم است این را بدانید/تکرار کنید).
در بهار یک ربات برای خودم نوشتم، بنابراین ما به "الگوهای" آن تکیه خواهیم کرد.
در مرحله بعد، از ما خواسته می شود که نامی برای این ربات بگذاریم. از آنجایی که این یک ربات برای آزمایش وظایف است، نام آن مناسب خواهد بود: [TEST] JavarushBot
اکنون زمان آن است که یک نام منحصر به فرد بدهید که همیشه می توان آن را پیدا کرد - نام کاربری آن: test_javarush_community
همانطور که در بالا گفتم، باید _bot را اضافه کنید. پسوند برای نام کاربری، بنابراین دوباره می نویسیم: test_javarush_community_bot
و تمام! ربات ایجاد شده است. اکنون با استفاده از نام کاربری و رمز می توان آن را به پروژه ما متصل کرد. البته برای عملکرد بدون مشکل سرور تست، توکن (در اصل رمز ورود به ربات) این ربات را برای مشاهده عمومی نمایش نمی دهم.
بر اساس توضیحات، فقط باید یک کلاس جدید ایجاد کنیم، از TelegramLongPollingBot ارث ببریم و این کلاس را به Application Context SpringBoot خود اضافه کنیم. Application Context مکانی است که اشیاء ایجاد شده برای اجرای پروژه در آن ذخیره می شوند. برای اضافه کردن یک کلاس، باید از یکی از حاشیهنویسیها استفاده کنید: @Component، @Service، @Repository، @Controller. یا حاشیهنویسی Bean@ اگر از طریق روشی در یک کلاس پیکربندی ایجاد شود (یعنی در کلاسی که با حاشیهنویسی پیکربندی مشخص شده است). من می دانم که همه اینها ممکن است هنوز غیرقابل درک به نظر برسد. اما وقتی شروع به کشف آن کنید، خواهید دید که هیچ چیز پیچیده ای وجود ندارد. برای درک سریع Spring Boot، من یک کتاب جالب را توصیه می کنم - Spring In Action 5th edition. اگر تمایلی وجود داشته باشد می توانم یک سری مقاله بر اساس این کتاب بنویسم. بیا برگردیم. در بسته ای که شامل JavarushTelegramBotApplication است، بسته ربات را ایجاد می کنیم که حاوی ربات تلگرام ما خواهد بود. نام آن JavaRushTelegramBot خواهد بود :
SpringBoot یک حاشیه نویسی عالی دارد - @Value. در صورت استفاده صحیح، مقادیر را از فایل application.properties بالا می برد. ما پروژه را با این به روز رسانی می کنیم:
از لاگ ها می بینیم که ربات شروع شده است. بنابراین، وقت آن است که به تلگرام بروید و به ربات بنویسید:
شروع را کلیک می کنیم و بلافاصله یک پاسخ دریافت می کنیم:
بیایید چند تا مزخرف دیگر برای بررسی بنویسیم:
و تمام، در این مرحله می توانیم بگوییم که وظیفه JRTB-2 ما تکمیل شده است. . شما واقعاً نمی توانید هیچ آزمایشی را در اینجا بنویسید، بنابراین ما همه چیز را همانطور که هست رها می کنیم. بعد باید یک commit جدید ایجاد کنید:
به نام commit توجه کنید: دوباره توجه شما را به این جلب می کنم. یک commit ابتدا شامل نام وظیفه است و سپس شرح مفصل تری از آنچه انجام شده است. روی Commit and Push... کلیک کنید و با کلیک مجدد روی Push تأیید کنید : به پروژه ما
بروید . مانند قبل، GitHub قبلا شعبه جدید را دیده است و پیشنهاد ایجاد یک درخواست کشش برای main را داده است. ما مقاومت نمی کنیم و آن را ایجاد می کنیم: طبق معمول، ما قبلاً یک برچسب، یک پروژه انتخاب کرده ایم و آن را به من اختصاص داده ایم. در نهایت روی Create Pull Request کلیک کنید. بیایید کمی صبر کنیم تا ساخت به پایان برسد - و تمام، درخواست کشش برای ادغام آماده است:!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 16]()
نسخه 0.0.1-SNAPSHOT است . این نسخه وظیفه است. و ما با به روز رسانی نسخه پروژه با هر مشکل جدید حل شده شروع خواهیم کرد. تا زمانی که به MVP برسیم، نسخه با پسوند -SNAPSHOT خواهد آمد. طرح نسخه سازی چگونه خواهد بود؟ XYZ-SNAPSHOT کجا:
به فایل RELEASE_NOTES بروید، جایی که تغییرات پروژه را با هر نسخه جدید شرح خواهیم داد:
اولین ورودی ما. اکنون، با هر به روز رسانی نسخه بعدی، در اینجا توضیح خواهیم داد که دقیقا چه اتفاقی افتاده است. ما این مورد را مرتکب میشویم، توضیحی مینویسیم: JRTB-2: نسخه پروژه بهروزرسانی شده و به RELEASE_NOTES اضافه شده است همه چیز دقیقاً مانند قبل است. ما منتظریم تا بیلد بگذرد و بتوانیم تغییرات خود را ادغام کنیم. فقط اینجا کمی متفاوت خواهد بود. من میخواهم مطمئن شوم که هر وظیفه در شاخه اصلی یک commit جداگانه است، بنابراین به سادگی فشار دادن یک درخواست کشش Merge برای ما کارساز نخواهد بود. گیت دارای گزینه git squash است که تمام commit ها را در یک جمع می کند و آنها را ادغام می کند. ما این گزینه را انتخاب می کنیم:
Squash and Merge را کلیک کنید، و به ما پیشنهاد می شود که پیام را ویرایش کنیم که در پایان خواهد بود:
بسیار راحت و مهمتر از همه، آنچه در تقاضا است. به هر حال، من چنین ویژگی را در bitbucket =/ ادغام را تأیید کنید. تنها چیزی که باقی میماند این است که وضعیت کار را به Done در برد خود تغییر دهید، یک نظر با پیوندی به درخواست کشش بنویسید و آن را ببندید:
تابلوی ما اکنون به این شکل است:
آنها متشکرم! الان باید چیکار کنیم؟ دیگر امکان حذف آن از گیت وجود نخواهد داشت، زیرا حتی اگر یک commit جدید را بدون این توکن آپلود کنم، همچنان در نسخه قبلی باقی خواهد ماند. اما من نمیخواهم commit را حذف کرده و به عقب برگردانم. بنابراین من رفتم و توکن BotFather را که قبلا ذکر شد غیرفعال کردم. اکنون توکن موجود است، اما دیگر معتبر نیست. برای مشاهده تمام کدهای مربوط به آن قبل از انتشار مقاله، در حساب GitHub من مشترک شوید. از همه شما برای خواندن متشکرم، به زودی شما را می بینم.
ما 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!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 4](https://cdn.javarush.com/images/article/da251e55-7d65-405d-8269-eae59ddec3fd/1080.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 5](https://cdn.javarush.com/images/article/cf774e29-d1bd-45ac-be63-4eec1ace7c8b/1080.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 6](https://cdn.javarush.com/images/article/bc2012c9-a5fd-409c-9afb-d731c2498ba9/1080.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 7](https://cdn.javarush.com/images/article/fb211e24-7ad5-4826-93ac-131f48bec30b/1080.jpeg)
ما ربات را به پروژه متصل می کنیم
ما کتابخانه را به طور معمول درج نمی کنیم، اما بلافاصله از اسکلت خود - 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 را به روز می کنیم. !["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 8](https://cdn.javarush.com/images/article/f4f45c30-c562-4961-b5c7-c08d60352a05/800.jpeg)
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 .
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 9](https://cdn.javarush.com/images/article/f49789c6-3378-42d7-9da2-c7e7ec38b72c/512.jpeg)
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 اجرا می کنیم و به دنبال ربات خود در تلگرام می گردیم: !["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 10](https://cdn.javarush.com/images/article/0e5175c2-2cea-4294-b6d8-2d7b42e5d0ec/1080.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 11](https://cdn.javarush.com/images/article/1bed4559-f9bf-43e5-b4b8-dcdd4eb4a2ed/512.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 12](https://cdn.javarush.com/images/article/392c2361-b04e-411e-8750-44ff8ac05b56/512.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 13](https://cdn.javarush.com/images/article/42578b38-d572-40a1-8c58-b56c9848dba3/512.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 14](https://cdn.javarush.com/images/article/fab24536-9f78-4d76-87aa-94662b19ad7b/512.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 15](https://cdn.javarush.com/images/article/bb41a8e6-2dee-4b14-be36-460e23b60ace/512.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 16](https://cdn.javarush.com/images/article/75880a98-5812-49e7-bc02-09d2d4fb5ff5/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 17](https://cdn.javarush.com/images/article/f63be8c4-31ec-47fb-af9b-dc621e0f3489/800.jpeg)
نسخه سازی
من به نوعی این نکته را از دست دادم که باید نسخه سازی را انجام دهیم. برای این کار چند تغییر دیگر در شعبه خود ایجاد می کنیم. ما به IDEA برمی گردیم و به نسخه پروژه در حافظه نگاه می کنیم:!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 18](https://cdn.javarush.com/images/article/5637da0d-2fe8-4d59-8674-f1790d03a305/512.jpeg)
- X - به روز رسانی نسخه اصلی، اغلب شامل مشکلات سازگاری با نسخه قبلی است.
- Y - تغییرات نه چندان بزرگ، کاملاً با نسخه قبلی سازگار است.
- Z شمارنده ای از عیوب است که ما پیدا کردیم و تعمیر کردیم.
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 19](https://cdn.javarush.com/images/article/44e2a45c-6291-4fdf-bda5-042e6a7ba595/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 20](https://cdn.javarush.com/images/article/138e13d9-499b-45d4-a2e7-e20d81cdf3a5/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 21](https://cdn.javarush.com/images/article/24112b77-07f4-4eb6-b649-5faf70bcf2d6/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 22](https://cdn.javarush.com/images/article/a583cdfc-9d42-4f03-b956-feeda0294423/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 23](https://cdn.javarush.com/images/article/d04861f7-8bc2-45c1-b589-6c9b328c2afb/800.jpeg)
!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 24](https://cdn.javarush.com/images/article/9a32e01a-6370-4fae-b8a5-ba7203aa5c89/800.jpeg)
نتیجه
امروز ما یک ربات تلگرام را مرحله به مرحله ایجاد کردیم و آن را در پروژه SpringBoot خود پیاده سازی کردیم. ربات کار می کند و پاسخ می دهد. ما بلافاصله از طریق ویژگی ها به داده های ربات دسترسی پیدا کردیم. بیشتر در آینده: ما یک قطعه بزرگ را انجام خواهیم داد - اجرای JRTB-3 - اضافه کردن یک الگوی فرمان برای پروژه خود. اوه یه چیز دیگه... من به شما گفتم که توکن را منتشر نمی کنم تا از آن استفاده نشود. اما از آنجایی که نزدیک به نیمه شب و بعد از پایان کار داشتم مقاله را می نوشتم، معلوم شد که یک توکن معتبر در مخزن قرار داده ام و گیت گاردین در نامه ای در این مورد به من گفت: از این بابت از!["پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 25](https://cdn.javarush.com/images/article/573a85c7-ed5f-4f7a-84b4-daf515eedb33/512.jpeg)
GO TO FULL VERSION