שלום חברים יקרים שלי. כן, כן, בדיוק חברים. כבר כל כך הכרתי את סדרת המאמרים הזו, שאותם אנשים שכותבים באופן קבוע את הכרת התודה שלהם בתגובות ו/או מראים שהם קראו והבינו את החומר כבר התקרבו. אתה ואני נעים משני כיוונים לעבר אותה מטרה. אתה רוצה להבין, אבל אני רוצה להסביר. ולנו אותה מטרה סופית - בקשה כתובה שמובנת לך מתחילתה ועד סופה. אולי כבר שמעתם על הרבה ממה שאתאר במאמר זה. אני לא חושב שאספר לכם משהו חדש ויוצא דופן (אבל במסגרת הפרויקט יש צורך לדעת/לחזור על כך).
באביב כתבתי לעצמי בוט, אז נסתמך על ה"דפוסים" שלו.
לאחר מכן, אנו מתבקשים לתת שם לבוט הזה. מכיוון שמדובר בבוט למשימות בדיקה, השם שלו יתאים: [TEST] JavarushBot
עכשיו הגיע הזמן לתת שם ייחודי שלפיו תמיד ניתן למצוא אותו - שם המשתמש שלו: test_javarush_community
כפי שאמרתי למעלה, אתה צריך להוסיף את ה-_bot סיומת לשם משתמש, אז נכתוב שוב: test_javarush_community_bot
וזהו! הבוט נוצר. כעת, באמצעות שם המשתמש והאסימון, ניתן לחבר אותו לפרויקט שלנו. כמובן שלמען תפעול חלק של שרת הבדיקה, לא אציג את האסימון (בעצם סיסמה לגישה לבוט) של הבוט הזה לצפייה ציבורית.
בהתבסס על התיאור, אנחנו רק צריכים ליצור מחלקה חדשה, לרשת מ- TelegramLongPollingBot ולהוסיף את המחלקה הזו להקשר היישום של SpringBoot שלנו. יישום הקשר הוא המקום שבו מאוחסנים האובייקטים שנוצרו להפעלת הפרויקט. כדי להוסיף מחלקה, עליך להשתמש באחת ההערות: @Component, @Service, @Repository, @Controller. או הערת @Bean אם נוצרה באמצעות מתודה במחלקת תצורה (כלומר, במחלקה שמסומנת עם הערת Configuration). אני מבין שכל זה אולי עדיין נראה בלתי מובן. אבל כשתתחיל להבין את זה, תראה שאין שם שום דבר מסובך. כדי להבין במהירות את Spring Boot, אני ממליץ על ספר מגניב - Spring In Action 5th Edition. אם יש רצון, אוכל לכתוב סדרת מאמרים המבוססים על הספר הזה. בוא נחזור. בחבילה המכילה JavarushTelegramBotApplication, אנו יוצרים את חבילת הבוט , שתכיל את בוט הטלגרם שלנו. השם שלו יהיה JavaRushTelegramBot :
ל-SpringBoot יש הערה נהדרת - @Value. אם נעשה בו שימוש נכון, הוא ימשוך את הערכים מקובץ application.properties. אנו מעדכנים את הפרויקט בכך:
מהלוגים אנו רואים שהבוט התחיל. אז, זה הזמן ללכת לטלגרם ולכתוב לבוט:
אנחנו לוחצים על התחל ומיד מקבלים תשובה:
בואו נכתוב עוד שטויות לבדוק:
וזהו, בשלב זה אנחנו יכולים לומר שמשימת ה-JRTB-2 שלנו הושלמה . אתה לא באמת יכול לכתוב כאן מבחנים עדיין, אז נשאיר הכל כמו שהוא. בשלב הבא אתה צריך ליצור commit חדש:
שימו לב לשם ה-commit: שוב אני מפנה את תשומת לבכם לכך. התחייבות מכילה תחילה את שם המשימה, ולאחר מכן תיאור מפורט יותר של מה שנעשה. לחץ על Commit and Push... ואשר על ידי לחיצה נוספת על Push :
עבור לפרויקט שלנו . כמו בעבר, GitHub כבר ראתה את הסניף החדש ומציעה ליצור בקשת משיכה ל-main. אנחנו לא מתנגדים ויוצרים אותו:
כרגיל, כבר בחרנו תווית, פרויקט והקצנו לי אותו. לבסוף, לחץ על צור בקשת משיכה. בוא נחכה קצת בזמן שהבנייה תעבור - וזהו, בקשת המשיכה מוכנה למיזוג:
הגרסה היא 0.0.1-SNAPSHOT . זוהי גרסת החובה. ונתחיל בעדכון גרסת הפרויקט עם כל בעיה חדשה שנפתרה. עד שנגיע ל-MVP, הגרסה תגיע עם הסיומת -SNAPSHOT. מה תהיה ערכת ניהול הגרסאות? XYZ-SNAPSHOT איפה:
עבור לקובץ RELEASE_NOTES, שם נתאר את השינויים בפרויקט עם כל גרסה חדשה:
הערך הראשון שלנו. כעת, עם כל עדכון גרסה עוקב, נתאר כאן מה בדיוק קרה. אנו מבצעים את המקרה הזה, כותבים תיאור: JRTB-2: גרסת פרויקט מעודכנת ונוספה ל-RELEASE_NOTES הכל בדיוק כמו קודם. אנחנו מחכים שהבנייה תעבור ונוכל למזג את השינויים שלנו. רק כאן זה יהיה קצת אחרת. אני רוצה לוודא שכל משימה בסניף הראשי היא התחייבות נפרדת, כך שפשוט דחיפה של בקשת משיכה של מיזוג לא תעבוד עבורנו. ל-Git יש את אפשרות ה-git squash, שאוסף את כל ההתחייבויות לאחד וממזג אותם. אנו בוחרים באפשרות זו:
לוחצים על Squash and Merge, ומוצע לנו לערוך את ההודעה שתהיה בסופו של דבר:
נוחה מאוד והכי חשוב מה מבוקש. דרך אגב, לא ראיתי תכונה כזו ב-bitbucket =/ אשר את המיזוג. הדבר היחיד שנותר הוא לשנות את סטטוס המשימה לסיום בלוח שלנו, לכתוב תגובה עם קישור לבקשת המשיכה ולסגור אותה:
הלוח שלנו נראה כעת כך:
תודה להם על זה! מה לעשות עכשיו? לא ניתן יהיה יותר למחוק אותו מה-git, שכן גם אם אני מעלה commit חדש ללא האסימון הזה, הוא עדיין יישאר בקוד הישן. אבל אני לא רוצה למחוק ולהחזיר את ה-commit לאחור. אז הלכתי והשבתתי את האסימון מה-BotFather שכבר הוזכר. עכשיו האסימון שם, אבל הוא כבר לא תקף. הירשם לחשבון GitHub שלי כדי לראות את כל הקוד שלו לפני פרסום המאמר. תודה לכולכם שקראתם, נתראה בקרוב.
אנו כותבים JRTB-2
נעשה את אותו הדבר כפי שעשינו במאמר עם המשימה JRTB-0 :- אנו מעדכנים את הסניף הראשי בפרויקט המקומי באמצעות השילוב ctrl + t .
- בהתבסס על הסניף הראשי, אנו יוצרים:
- הוסף בוט.
- אנו יוצרים commit חדש עם תיאור של מה שנעשה ודוחפים אותו ל-GitHub.
- צור בקשת משיכה עבור הסניף הראשי ובדוק אותה שוב. אנחנו מחכים שהבנייה תעבור (פעולות github), תמזג אותו לסניף הראשי.
- סגור את המשימה המתאימה.
מהו בוט טלגרם
אנחנו, מפתחים, יכולים לדמיין עבודה עם בוט טלגרם כמו זה: אנחנו משתמשים בלקוח שלהם כדי לעבוד איתם. יש לנו ספרייה מוכנה לעבודה. יש קבוצה של פעולות שלאחריהן בוט הטלגרם יידע שהוא משויך לתוכנית שלנו. וכבר בתוך התוכנית נלמד איך לקבל מכתבים, פקודות ואיכשהו לעבד אותם. יש דבר כזה פקודה בבוטים של טלגרם : היא מתחילה עם קו נטוי "/". אחריו נכתוב מיד את המילה ביחד, וזה ייחשב לפקודה. לדוגמה, ישנן שתי פקודות שכולם צריכים לדעת:- /start — התחל לעבוד עם הבוט;
- /stop - סיום עבודה עם הבוט.
צור בוט עם BotFather
כדי לחבר בוט, תחילה עליך ליצור אותו. לטלגרם יש גישה - יצירת בוט עם שם ייחודי משלו. זה ילווה גם באסימון (מחרוזת גדולה שעובדת כמו סיסמה). כבר יצרתי בוט עבור JavaRush - @javarush_community_bot . הבוט הזה עדיין ריק ואינו יכול לעשות דבר. העיקר שיהיה _bot בסוף השם . כדי להראות איך עושים זאת, אצור בוט שעליו נבדוק את הפונקציונליות שלנו. במונחים של פרויקטים אמיתיים, זו תהיה סביבת מבחן. והעיקרית שלנו תהיה סביבת הפרוד (פרוד - ייצור, כלומר הסביבה האמיתית עליה יבוצע הפרויקט). כמובן שניתן יהיה להוסיף סביבה נוספת - סביבת ארגז חול: ארגז חול משותף, משתנה ונגיש יותר לכל משתתפי הפיתוח. אבל זה רק יסבך את המצב בשלב יצירת הפרויקט. לעת עתה, בואו ניצור שני בוטים נוספים לבדיקה ולסביבת ארגז חול. הצעד הראשון הוא ליצור (לרשום) בוט בטלגרם עצמו. עלינו למצוא את הבוט: @BotFather ולכתוב לו את הפקודה: /newbot!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 4](https://cdn.javarush.com/images/article/da251e55-7d65-405d-8269-eae59ddec3fd/1080.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 5](https://cdn.javarush.com/images/article/cf774e29-d1bd-45ac-be63-4eec1ace7c8b/1080.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 6](https://cdn.javarush.com/images/article/bc2012c9-a5fd-409c-9afb-d731c2498ba9/1080.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 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. !["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 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 .
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 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 ומחפשים את הבוט שלנו בטלגרם: !["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 10](https://cdn.javarush.com/images/article/0e5175c2-2cea-4294-b6d8-2d7b42e5d0ec/1080.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 11](https://cdn.javarush.com/images/article/1bed4559-f9bf-43e5-b4b8-dcdd4eb4a2ed/512.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 12](https://cdn.javarush.com/images/article/392c2361-b04e-411e-8750-44ff8ac05b56/512.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 13](https://cdn.javarush.com/images/article/42578b38-d572-40a1-8c58-b56c9848dba3/512.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 14](https://cdn.javarush.com/images/article/fab24536-9f78-4d76-87aa-94662b19ad7b/512.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 15](https://cdn.javarush.com/images/article/bb41a8e6-2dee-4b14-be36-460e23b60ace/512.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 16](https://cdn.javarush.com/images/article/75880a98-5812-49e7-bc02-09d2d4fb5ff5/800.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 17](https://cdn.javarush.com/images/article/f63be8c4-31ec-47fb-af9b-dc621e0f3489/800.jpeg)
גירסאות
איכשהו פספסתי את הנקודה שאנחנו צריכים לעשות גרסאות. לשם כך נבצע מספר שינויים נוספים בסניף שלנו. אנו חוזרים ל-IDEA ומסתכלים על גרסת הפרויקט בזיכרון:!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 18](https://cdn.javarush.com/images/article/5637da0d-2fe8-4d59-8674-f1790d03a305/512.jpeg)
- X - עדכון גרסה מרכזי, מכיל לעתים קרובות בעיות עם תאימות לאחור עם הגרסה הקודמת;
- Y - שינויים לא גדולים במיוחד, תואם באופן מלא לגרסה הקודמת;
- Z הוא מונה של ליקויים שמצאנו ותיקנו.
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 19](https://cdn.javarush.com/images/article/44e2a45c-6291-4fdf-bda5-042e6a7ba595/800.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 20](https://cdn.javarush.com/images/article/138e13d9-499b-45d4-a2e7-e20d81cdf3a5/800.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 21](https://cdn.javarush.com/images/article/24112b77-07f4-4eb6-b649-5faf70bcf2d6/800.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 22](https://cdn.javarush.com/images/article/a583cdfc-9d42-4f03-b956-feeda0294423/800.jpeg)
!["פרויקט ג'אווה מא' עד ת': הוספת בוט טלגרם לפרויקט - 23](https://cdn.javarush.com/images/article/d04861f7-8bc2-45c1-b589-6c9b328c2afb/800.jpeg)
!["פרויקט ג'אווה מא' עד ת'": הוספת בוט טלגרם לפרויקט - 24](https://cdn.javarush.com/images/article/9a32e01a-6370-4fae-b8a5-ba7203aa5c89/800.jpeg)
סיכום
היום יצרנו בוט טלגרם צעד אחר צעד ויישמנו אותו בפרויקט SpringBoot שלנו. הבוט עובד ונותן תשובות. עשינו גישה מיידית לנתוני הבוט דרך מאפיינים. עוד יבואו: נעשה יצירה גדולה - נבצע JRTB-3 - נוסיף תבנית פקודה לפרויקט שלנו. אה, עוד משהו... אמרתי לך שלא אפרסם את האסימון כדי שלא ייעשה בו שימוש. אבל מאז שכתבתי את המאמר קרוב יותר לחצות ואחרי העבודה, התברר שפרסמתי אסימון תקף במאגר, ו-GitGuardian סיפר לי על כך במכתב:!["פרויקט ג'אווה מא' עד ת'": הוספת בוט טלגרם לפרויקט - 25](https://cdn.javarush.com/images/article/573a85c7-ed5f-4f7a-84b4-daf515eedb33/512.jpeg)
GO TO FULL VERSION