Ба ҳар ҳол ботҳо чист? Шумо метавонед дар ин бора ба таври муфассал дар ин ҷо бихонед . Аввалан, шумо бояд ҳуҷҷатҳои расмии китобхонаро барои таҳияи ботҳо дар Telegram (минбаъд API номида мешавад) хонед. Вай дар ин ҷо хобидааст . Ҳама чиз дар он ҷо хеле дастрас ва фаҳмо аст. Чунин ба назар мерасад, ки нависед ва шод бошед! Аммо ин чандон оддӣ нест. Пас аз сарф кардани вақти зиёд дар системаҳои ҷустуҷӯ, ман пораҳои донишро дар бораи таҳияи ботҳо пайдо кардам, масалан, чӣ гуна сохтани клавиатура, коркарди CallbackQuery ва ғайра. Ман ҳеҷ гоҳ дастури мукаммал ва ҳамаҷониба барои таҳияи ботҳо дар Java наёфтаам. Ин маро водор кард, ки ин мақоларо нависам. Дар Интернет сайтҳои зиёде мавҷуданд, ки шумо метавонед боти худро бо ҷойгиркунии омода созед. Аммо гап дар он аст. ки дар кисми зиёди он ботхо сохта мешаванд, ки маълумоти замина ва гайраро таъмин карда метавонанд. Боти мо як веб-барномаи мукаммалест, ки шумо метавонед ба пойгоҳи додаҳо пайваст кунед, ба API-ҳои гуногун дархост кунед, сайтҳоро таҳлил кунед, ҳисобҳои мураккаб анҷом диҳед ва ғайра. Масъала танҳо бо тасаввуроти шумо маҳдуд аст. Умедворам, ки дар ин сатрхо ба шумо каме тавзех додаам, ки дар бораи он чи хохам нависам. Бақайдгирии бот дар Telegram хеле содда аст; ин раванд дар ҳуҷҷатҳо дар истиноди боло муфассал тавсиф шудааст. Барои замимаи мо ба шумо танҳо номи бот ва нишонаеро, ки ҳангоми бақайдгирӣ гирифта мешавад, бидонед. Аслан, бот танҳо як веб-барномаи консолӣ аст. Не фронтент, коркарди фармони холис. Агар шумо хоҳед, ки Hibernate-ро хуб азхуд кунед ё тарзи таҳлor JSON-ро омӯзед, пас ин лоиҳа барои шумост. Биёед бо дохил кардани вобастагӣ ба pom.xml оғоз кунем (мо гумон мекунем, ки шумо Maven-ро истифода мебаред). Шумо метавонед инро чунин иҷро кунед:
InlineKeyboardMarkup Ин инчунин массиви массивҳост, он ба Markup-и қаблӣ монанд аст, аммо мантиқи амалиётӣ дар ин ҷо каме фарқ мекунад. Чунин клавиатура ба паёми мушаххас пайваст аст ва танҳо барои он вуҷуд дорад. Ин аст усули насб кардани клавиатураи Inline
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>3.5</version>
</dependency>
Сипас, мо синф эҷод мекунем Bot
ва онро аз class мерос мегирем 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 setting up a message and sending it.
* @param chatId chat id
* @param s The string 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());
}
}
/**
* The method returns the name of the bot specified during registration.
* @return bot name
*/
@Override
public String getBotUsername() {
return ”BotName”;
}
/**
* The method returns the bot's token to communicate with the Telegram server
* @return token for the bot
*/
@Override
public String getBotToken() {
return ”BotToken”;
}
}
Хуб, мундариҷаи усул main
:
public static void main(String[] args) {
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
}
Бо ворид кардани он ба усулҳо getBotUsername()
, getBotToken()
мо ботро оғоз мекунем. Ҳоло ӯ танҳо ҳар паёмеро, ки мо ба ӯ мефиристем, ба мо равона мекунад, як навъ «оина». Ҳамааш ба таври зерин кор мекунад: вақте ки шумо барномаро оғоз мекунед, он ба serverи Telegram як маротиба дар як сония дар URL-и зерин фиристодани дархости GET-ро оғоз мекунад: https://api.telegram.org/BotToken/getMe, ки дар он BotToken ҷойгир аст. аломати боти шумо, ки дар ҷавоби JSON дорои ҳама паёмҳо мебошад. Ҳар як чунин паём аз ҷониби китобхона коркард карда мешавад ва ба метод OnUpdateReceived(Update update)
ҳамчун an object меояд Update
. Ин аст он чизе ки мо бо он кор мекунем. Ин зебоии ботҳои Telegram аст, онҳо метавонанд дар ҳама гуна компютер кор кунанд, барои санҷиш шумо танҳо барномаро оғоз кардан лозим аст, пас аз ҳар як тағирот ба шумо лозим нест, ки онро дар хостинг ҷойгир кунед. Ин хеле қулай аст. Албатта, ботро метавон бо истифода аз вебхук танзим кард; дастурро дар Интернет пайдо кардан мумкин аст; барои содда, мо бо истифода аз LongPolling кор хоҳем кард. Тарзи коркарди паёмҳо ва чӣ дар ҷавоб фиристодан танҳо бо асбобҳои забонӣ ва китобхона маҳдуд аст, ҳама чиз дар ихтиёри шумост. Шумо метавонед бот созед, ки видеоҳоро дар YouTube барои шумо ҷустуҷӯ кунад, шумо метавонед бот созед, ки ҳар рӯз он чизеро, ки шумо ба худатон мефиристед, ба шумо мефиристад, масалан, дар як сол, як навъ капсулаи вақт. Ё шумо метавонед омӯзед, ки чӣ тавр ба системаҳои CRM ҳамроҳ шавед ва ботҳо барои тиҷорати хурд созед, ҳама чиз бо тасаввуроти шумо маҳдуд аст. Ба пеш. «/»
Онҳое, ки ботҳоро истифода кардаанд, медонанд, ки бо онҳо бо истифода аз фармонҳое, ки аз аломат сар мешавад , муошират кардан қулай аст /start
. Аммо роҳи қулайтар вуҷуд дорад - тугмаҳо. Ду намуди тугмаҳо вуҷуд доранд: тугмаҳое, ки дар зери майдони воридот пайдо мешаванд ReplyKeyboardMarkup
ва тугмаҳое, ки бевосита дар зери паёме, ки ба онҳо пайванданд, пайдо мешаванд InlineKeyboardMarkup
. Дар ҳуҷҷатҳо шумо метавонед бо тавсифи онҳо ба таври мухтасар шинос шавед. ReplyKeyboardMarkup. Аслан ин як қатор массивҳои тугмаҳо мебошад, 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 strings
List<KeyboardRow> keyboard = new ArrayList<>();
// First line of the keyboard
KeyboardRow keyboardFirstRow = new KeyboardRow();
// Add buttons to the first line of the keyboard
keyboardFirstRow.add(new KeyboardButton(“Привет”));
// Second line of the keyboard
KeyboardRow keyboardSecondRow = new KeyboardRow();
// Add buttons to the second line of the keyboard
keyboardSecondRow.add(new KeyboardButton(“Помощь”);
// Add all keyboard strings to the list
keyboard.add(keyboardFirstRow);
keyboard.add(keyboardSecondRow);
// and set this list to our keyboard
replyKeyboardMarkup.setKeyboard(keyboard);
}
Дар усул sendMsg()
, мо ин усулро тавассути интиқоли паём ба он меномем ва ҳамин тавр клавиатураро барои ин паём муқаррар мекунем. Вақте ки мо ин паёмро ба корбар мефиристем, ӯ матни паёмеро, ки мо муқаррар кардаем ва инчунин 2 тугмаеро, ки Салом ва Ёрӣ мегӯянд, дар паҳлӯи ҳамдигар хоҳад дид. Бо пахш кардани ин тугмаҳо ба бот паёме фиристода мешавад, ки матни он он чизест, ки дар тугма навишта шудааст. Яъне, агар муштарӣ "Кӯмак" пахш кунад, бот паём бо матни "Кӯмак" мегирад. Барои ӯ, гӯё худи муштарӣ матни «Кӯмак»-ро навишта, ба ӯ фиристодааст. Хуб, пас шумо чунин паёмҳоро коркард мекунед.
private void setInline() {
List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
List<InlineKeyboardButton> buttons1 = new ArrayList<>();
buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
buttons.add(buttons1);
InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
markupKeyboard.setKeyboard(buttons);
}
List
Дар , эҷод кунед List
, тугмаи Inline ба сатри аввал илова кунед. Чунин тугма метавонад URL, истинод ба канал ё -ро дар бар гирад CallbackQuery
, ки ман дар бораи он каме дертар менависам. Дар ин ҷо мо матнро барои тугмаи худ насб мекунем, ки корбар онро мебинад ва сипас маълумотеро, ки ба бот фиристода мешавад, таъин мекунем. Дар мисоли мо, корбар "Салом" -ро мебинад ва ҳангоми клик ба бот рақами 17 фиристода мешавад, ин мост CallbackQuery
. Якчанд сухан дар бораи CallbackQuery
. Барои ба даст овардани чунин маълумот аз an object, 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
. Ҳар як an object дар Telegram ID-и худро дорад. Барои фиристодани посух ба ягон мушаххас, CallbackQuery
мо бояд танҳо id-и онро бидонем, ки мо онро аз an objectи мувофиқ мегирем. Барои фиристодани ҷавоб, ба ин усул занг занед:
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 аломат зиёд бошад! Ҳангоми фиристодани чунин посух, муштарӣ равзанаи поп-апро мегирад, ки дар он паём навишта мешавад. Чунин равзана пас аз пайдо шудани он метавонад чанд сония нопадид шавад ё то он даме ки корбар OK-ро пахш накунад, овезон монад. Барои иваз кардани ин режимҳо, мо ба answer.setShowAlert(true)
. Вақте ки true
тиреза овезон мешавад, то даме ки шумо OK-ро пахш кунед, вақте ки false
он пас аз 5 сония нопадид мешавад. Аслан, ин ҳама хусусиятҳои асосии китобхонаи ботҳои Telegram мебошанд. Агар хоҳед, шумо метавонед аз ҳуҷҷатҳо чунин чизҳоро, аз қабor фиристодани мултимедия, геолокатсия ва ғайраро омӯзед. Биёед ба ҷойгиркунии боти худ дар хостинг гузарем. Барои лоиҳаи худ ман Ҳерокуро интихоб кардам, зеро ба андешаи ман он хостинги хеле қулай аст, ки CLI-и худро дорад. Ин ройгон аст, аммо бо ин суръат боти шумо пас аз 30 дақиқа, агар ягон дархост вуҷуд надошта бошад, ба ҳолати интизорӣ мегузарад. Вақте ки ба ӯ дархост фиристода мешавад, ӯ аз хоб бедор мешавад. Ин хеле зуд рух медиҳад, шумо ҳатто пай намебаред (агар, албатта, пайвастшавӣ ба пойгоҳи додаҳо барқарор нашавад). Маҳдудияти нақшаи ройгон 5МБ пойгоҳи додаҳо, фазои диски 100МБ, трафики 2ТБ дар як моҳ, 1 дино мебошад. Dino барномаи иҷрошавандаи шумост. Ман дарҳол мегӯям, ки ин марҳилаи ҷойгиркунӣ буд, ки барои ман мушкилот ба бор овард, зеро ман қаблан ҳеҷ гоҳ барномаҳои худро ҷойгир накарда будам. Ҳангоми ҷойгиркунӣ, Heroku файлеро бо номи Procfile (бе васеъшавӣ) талаб мекунад. Мо онро дар решаи лоиҳа эҷод мекунем, дар он ҷо worker: sh target/bin/workerBot
workerBot нависед - номе, ки мо дар pom.xml
скрипти sh муайян мекунем, ки бо истифода аз плагини Maven appassembler-maven-plugin тавлид мешавад, оғоз мешавад. Скрипт иҷроиши кӯзаи тартибдодашударо тавсиф мекунад. Номи синфи оғозшаванда дар байни <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 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