JavaRush /وبلاگ جاوا /Random-FA /افزودن ربات تلگرام به پروژه - "پروژه جاوا از A تا Z"
Roman Beekeeper
مرحله

افزودن ربات تلگرام به پروژه - "پروژه جاوا از A تا Z"

در گروه منتشر شد
با سلام خدمت دوستان عزیزم. بله بله دقیقا دوستان من قبلاً آنقدر با این سری مقالات آشنا شده ام که آن دسته از افرادی که مرتباً قدردانی خود را در نظرات می نویسند و/یا نشان می دهند که مطالب را خوانده و درک کرده اند قبلاً به هم نزدیک شده اند. من و تو از هر دو طرف به سمت یک هدف حرکت می کنیم. شما می خواهید بفهمید، اما من می خواهم توضیح دهم. و ما همان هدف نهایی را داریم - یک برنامه مکتوب که از ابتدا تا انتها برای شما قابل درک است. ممکن است قبلاً درباره بسیاری از مواردی که در این مقاله توضیح خواهم داد شنیده باشید. فکر نمی کنم چیز جدید و خارق العاده ای به شما بگویم (اما در چارچوب پروژه لازم است این را بدانید/تکرار کنید). "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 1در بهار یک ربات برای خودم نوشتم، بنابراین ما به "الگوهای" آن تکیه خواهیم کرد.

ما JRTB-2 می نویسیم

ما همان کاری را که در مقاله با task JRTB-0 انجام دادیم انجام خواهیم داد :
  1. ما شعبه اصلی را در پروژه محلی با استفاده از ترکیب ctrl + t به روز می کنیم ."پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 2
  2. بر اساس شاخه اصلی، ما ایجاد می کنیم:"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 3
  3. یک ربات اضافه کنید.
  4. ما یک commit جدید با شرح کارهای انجام شده ایجاد می کنیم و آن را به GitHub فشار می دهیم.
  5. یک درخواست کشش برای شاخه اصلی ایجاد کنید و دوباره آن را بررسی کنید. ما منتظریم تا ساخت (اقدامات github) انجام شود، آن را در شاخه اصلی ادغام کنید.
  6. کار مربوطه را ببندید.

ربات تلگرام چیست؟

ما، توسعه‌دهندگان، می‌توانیم کار با یک ربات تلگرام را به این شکل تصور کنیم: ما از مشتری آنها برای کار با آنها استفاده می‌کنیم. ما یک کتابخانه آماده برای کار داریم . مجموعه ای از اقدامات وجود دارد که پس از آن ربات تلگرام متوجه می شود که با برنامه ما مرتبط است. و در حال حاضر در داخل برنامه یاد خواهیم گرفت که چگونه نامه ها، دستورات را دریافت کنیم و به نوعی آنها را پردازش کنیم. چیزی به نام دستور در ربات های تلگرام وجود دارد : با علامت اسلش «/» شروع می شود. بعد از آن بلافاصله کلمه را با هم می نویسیم و این یک دستور محسوب می شود. به عنوان مثال، دو دستور وجود دارد که همه باید بدانند:
  • / start - شروع به کار با ربات.
  • /stop - پایان کار با ربات.
بقیه کارها را خودمان انجام می دهیم. اجازه دهید فوراً رزرو کنم: ما دقیقاً همان کاری را انجام خواهیم داد و به روشی که من یاد گرفتم. و هنگام کار با یک ربات، مطمئن هستم که می توان بهتر انجام داد. و اگر کسی بخواهد این کار را انجام دهد، من فقط خوشحال خواهم شد و از هر طریق ممکن از این تلاش حمایت خواهم کرد. اتفاقاً اولین چیزی که جالب می شود این است که اگر کسی به من توضیح دهد که چگونه توضیحات دستورات را از طریق کد برنامه ریزی کنم و نه از طریق تنظیمات ربات در تلگرام. اینو یاد نگرفتم ما چندین مقاله در منبع خود داریم که نحوه ساخت یک ربات اساسی را توضیح می دهد: امروز ما کاری مشابه انجام خواهیم داد. اگر سوال دیگری دارید، توصیه می کنم این مقاله را مرور کنید.

با BotFather یک ربات بسازید

برای اتصال یک ربات، ابتدا باید آن را ایجاد کنید. تلگرام یک رویکرد دارد - ایجاد یک ربات با نام منحصر به فرد خود. همچنین یک توکن (رشته بزرگی که مانند رمز عبور کار می کند) همراه خواهد بود. من قبلا یک ربات برای JavaRush ایجاد کرده ام - @javarush_community_bot . این ربات هنوز خالی است و نمی تواند کاری انجام دهد. نکته اصلی این است که باید _bot در انتهای نام وجود داشته باشد . برای نشان دادن نحوه انجام این کار، من یک ربات ایجاد می کنم که عملکرد خود را روی آن آزمایش می کنیم. از نظر پروژه های واقعی، این یک محیط آزمایشی خواهد بود. و اصلی ترین ما محیط prod خواهد بود (prod - production، یعنی محیط واقعی که پروژه در آن اجرا می شود). البته، می‌توان محیط دیگری را اضافه کرد - یک محیط sandbox: یک sandbox مشترک، قابل تغییر تر و قابل دسترس برای همه شرکت کنندگان در توسعه. اما این فقط وضعیت را در مرحله ایجاد پروژه پیچیده می کند. در حال حاضر، اجازه دهید دو ربات دیگر برای تست و برای محیط سندباکس ایجاد کنیم. اولین قدم ایجاد (ثبت نام) یک ربات در خود تلگرام است. ما باید ربات را پیدا کنیم: @BotFather و دستور را روی آن بنویسیم: /newbot"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 4 در مرحله بعد، از ما خواسته می شود که نامی برای این ربات بگذاریم. از آنجایی که این یک ربات برای آزمایش وظایف است، نام آن مناسب خواهد بود: [TEST] JavarushBot"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 5 اکنون زمان آن است که یک نام منحصر به فرد بدهید که همیشه می توان آن را پیدا کرد - نام کاربری آن: test_javarush_community"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 6 همانطور که در بالا گفتم، باید _bot را اضافه کنید. پسوند برای نام کاربری، بنابراین دوباره می نویسیم: test_javarush_community_bot"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 7 و تمام! ربات ایجاد شده است. اکنون با استفاده از نام کاربری و رمز می توان آن را به پروژه ما متصل کرد. البته برای عملکرد بدون مشکل سرور تست، توکن (در اصل رمز ورود به ربات) این ربات را برای مشاهده عمومی نمایش نمی دهم.

ما ربات را به پروژه متصل می کنیم

ما کتابخانه را به طور معمول درج نمی کنیم، اما بلافاصله از اسکلت خود - 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بر اساس توضیحات، فقط باید یک کلاس جدید ایجاد کنیم، از 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() - و این توکن ربات است.
در اصل مانند یک ورود و رمز عبور برای یک سایت است. فعلاً این مقدار را به صراحت نمی نویسیم. به این "کدینگ سخت" می گویند (یعنی اتصال مقداری خاص - طبق معمول، ردیابی کاغذ از کد سخت انگلیسی). شما نباید این کار را انجام دهید. راه دیگر را خواهیم رفت - این داده ها را در کلاس application.properties می نویسیم و از اینجا می خوانیم. چرا این لازم است؟ سپس، به طوری که وقتی برنامه شروع می شود، می توانیم این مقادیر را به صورت خارجی تنظیم کنیم. این انعطاف پذیر است، درست است. به فایل src/main/resources/application.properties بروید. در آنجا به نام این متغیرها خواهیم رسید. فایل‌های با پسوند .properties به‌عنوان یک ساختار کلید-مقدار که با «=» از هم جدا شده‌اند خوانده می‌شوند، هر جفت یک خط جداگانه است. بنابراین من به این متغیرها رسیدم:
  • bot.username ;
  • bot.token .
این چیزی است که به نظر می رسد: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 9SpringBoot یک حاشیه نویسی عالی دارد - @Value. در صورت استفاده صحیح، مقادیر را از فایل application.properties بالا می برد. ما پروژه را با این به روز رسانی می کنیم:
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از لاگ ها می بینیم که ربات شروع شده است. بنابراین، وقت آن است که به تلگرام بروید و به ربات بنویسید: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 11شروع را کلیک می کنیم و بلافاصله یک پاسخ دریافت می کنیم: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 12بیایید چند تا مزخرف دیگر برای بررسی بنویسیم: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 13و تمام، در این مرحله می توانیم بگوییم که وظیفه JRTB-2 ما تکمیل شده است. . شما واقعاً نمی توانید هیچ آزمایشی را در اینجا بنویسید، بنابراین ما همه چیز را همانطور که هست رها می کنیم. بعد باید یک commit جدید ایجاد کنید: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 14به نام commit توجه کنید: دوباره توجه شما را به این جلب می کنم. یک commit ابتدا شامل نام وظیفه است و سپس شرح مفصل تری از آنچه انجام شده است. روی Commit and Push... کلیک کنید و با کلیک مجدد روی Push تأیید کنید : به پروژه ما"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 15 بروید . مانند قبل، GitHub قبلا شعبه جدید را دیده است و پیشنهاد ایجاد یک درخواست کشش برای main را داده است. ما مقاومت نمی کنیم و آن را ایجاد می کنیم: طبق معمول، ما قبلاً یک برچسب، یک پروژه انتخاب کرده ایم و آن را به من اختصاص داده ایم. در نهایت روی Create Pull Request کلیک کنید. بیایید کمی صبر کنیم تا ساخت به پایان برسد - و تمام، درخواست کشش برای ادغام آماده است:"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 16"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 17

نسخه سازی

من به نوعی این نکته را از دست دادم که باید نسخه سازی را انجام دهیم. برای این کار چند تغییر دیگر در شعبه خود ایجاد می کنیم. ما به IDEA برمی گردیم و به نسخه پروژه در حافظه نگاه می کنیم: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 18نسخه 0.0.1-SNAPSHOT است . این نسخه وظیفه است. و ما با به روز رسانی نسخه پروژه با هر مشکل جدید حل شده شروع خواهیم کرد. تا زمانی که به MVP برسیم، نسخه با پسوند -SNAPSHOT خواهد آمد. طرح نسخه سازی چگونه خواهد بود؟ XYZ-SNAPSHOT کجا:
  • X - به روز رسانی نسخه اصلی، اغلب شامل مشکلات سازگاری با نسخه قبلی است.
  • Y - تغییرات نه چندان بزرگ، کاملاً با نسخه قبلی سازگار است.
  • Z شمارنده ای از عیوب است که ما پیدا کردیم و تعمیر کردیم.
بر این اساس، ما اولین نسخه - 0.1.0-SNAPSHOT - را خواهیم داشت، یعنی هنوز آپدیت های عمده ای نداشته ایم، فقط کمی از همه چیز، و هنوز به MVP نرسیده ایم، پس پسوند -SNAPSHOT وجود دارد. . بیایید این را در حافظه تغییر دهیم: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 19به فایل RELEASE_NOTES بروید، جایی که تغییرات پروژه را با هر نسخه جدید شرح خواهیم داد: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 20اولین ورودی ما. اکنون، با هر به روز رسانی نسخه بعدی، در اینجا توضیح خواهیم داد که دقیقا چه اتفاقی افتاده است. ما این مورد را مرتکب می‌شویم، توضیحی می‌نویسیم: JRTB-2: نسخه پروژه به‌روزرسانی شده و به RELEASE_NOTES اضافه شده است همه چیز دقیقاً مانند قبل است. ما منتظریم تا بیلد بگذرد و بتوانیم تغییرات خود را ادغام کنیم. فقط اینجا کمی متفاوت خواهد بود. من می‌خواهم مطمئن شوم که هر وظیفه در شاخه اصلی یک commit جداگانه است، بنابراین به سادگی فشار دادن یک درخواست کشش Merge برای ما کارساز نخواهد بود. گیت دارای گزینه git squash است که تمام commit ها را در یک جمع می کند و آنها را ادغام می کند. ما این گزینه را انتخاب می کنیم: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 21Squash and Merge را کلیک کنید، و به ما پیشنهاد می شود که پیام را ویرایش کنیم که در پایان خواهد بود: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 22بسیار راحت و مهمتر از همه، آنچه در تقاضا است. به هر حال، من چنین ویژگی را در bitbucket =/ ادغام را تأیید کنید. تنها چیزی که باقی می‌ماند این است که وضعیت کار را به Done در برد خود تغییر دهید، یک نظر با پیوندی به درخواست کشش بنویسید و آن را ببندید: "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 23تابلوی ما اکنون به این شکل است:"پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 24

نتیجه

امروز ما یک ربات تلگرام را مرحله به مرحله ایجاد کردیم و آن را در پروژه SpringBoot خود پیاده سازی کردیم. ربات کار می کند و پاسخ می دهد. ما بلافاصله از طریق ویژگی ها به داده های ربات دسترسی پیدا کردیم. بیشتر در آینده: ما یک قطعه بزرگ را انجام خواهیم داد - اجرای JRTB-3 - اضافه کردن یک الگوی فرمان برای پروژه خود. اوه یه چیز دیگه... من به شما گفتم که توکن را منتشر نمی کنم تا از آن استفاده نشود. اما از آنجایی که نزدیک به نیمه شب و بعد از پایان کار داشتم مقاله را می نوشتم، معلوم شد که یک توکن معتبر در مخزن قرار داده ام و گیت گاردین در نامه ای در این مورد به من گفت: از این بابت از "پروژه جاوا از A تا Z": افزودن ربات تلگرام به پروژه - 25آنها متشکرم! الان باید چیکار کنیم؟ دیگر امکان حذف آن از گیت وجود نخواهد داشت، زیرا حتی اگر یک commit جدید را بدون این توکن آپلود کنم، همچنان در نسخه قبلی باقی خواهد ماند. اما من نمی‌خواهم commit را حذف کرده و به عقب برگردانم. بنابراین من رفتم و توکن BotFather را که قبلا ذکر شد غیرفعال کردم. اکنون توکن موجود است، اما دیگر معتبر نیست. برای مشاهده تمام کدهای مربوط به آن قبل از انتشار مقاله، در حساب GitHub من مشترک شوید. از همه شما برای خواندن متشکرم، به زودی شما را می بینم.

فهرستی از تمام مواد این مجموعه در ابتدای این مقاله است.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION