บอทคืออะไรกันแน่? คุณสามารถอ่านรายละเอียดเกี่ยวกับเรื่องนี้ได้ที่นี่ ขั้นแรก คุณต้องอ่านเอกสารอย่างเป็นทางการสำหรับไลบรารีสำหรับการพัฒนาบอทบน Telegram (ต่อไปนี้จะเรียกว่า API) เธอนอนอยู่ที่ นี่
ทุกสิ่งที่นั่นเข้าถึงได้และเข้าใจได้มาก ดูเหมือนว่าจะเขียนและชื่นชมยินดี! แต่มันไม่ง่ายขนาดนั้น หลังจากใช้เวลาส่วนใหญ่ในเสิร์ชเอ็นจิ้น ฉันพบเกร็ดความรู้เกี่ยวกับการพัฒนาบอท เช่น วิธีสร้างคีย์บอร์ด ประมวลผล CallbackQuery และอื่นๆ ฉันไม่เคยพบคำแนะนำที่สมบูรณ์และครอบคลุมสำหรับการพัฒนาบอทใน Java สิ่งนี้ทำให้ฉันต้องเขียนบทความนี้ มีเว็บไซต์มากมายบนอินเทอร์เน็ตที่คุณสามารถสร้างบอทของคุณเองด้วยการปรับใช้แบบสำเร็จรูป แต่ประเด็นก็คือ โดยส่วนใหญ่แล้ว บอทจะถูกสร้างขึ้นซึ่งสามารถให้ข้อมูลพื้นหลังและอื่นๆ ได้ บอทของเราเป็นเว็บแอปพลิเคชันเต็มรูปแบบที่คุณสามารถผูกฐานข้อมูล ส่งคำขอไปยัง API ต่างๆ แยกวิเคราะห์ไซต์ ทำการคำนวณที่ซับซ้อน ฯลฯ เรื่องนี้ถูกจำกัดด้วยจินตนาการของคุณเท่านั้น ฉันหวังว่าในบรรทัดเหล่านี้ฉันได้อธิบายให้คุณฟังเล็กน้อยเกี่ยวกับสิ่งที่ฉันจะเขียน การลงทะเบียนบอทใน Telegram นั้นง่ายมาก กระบวนการนี้อธิบายไว้โดยละเอียดในเอกสารประกอบที่ลิงก์ด้านบน สำหรับการสมัครของเรา คุณจะต้องทราบชื่อของบอทและโทเค็นที่คุณจะได้รับเมื่อลงทะเบียนเท่านั้น โดยพื้นฐานแล้ว บอทเป็นเพียงเว็บแอปพลิเคชันคอนโซล ไม่มีส่วนหน้า การประมวลผลคำสั่งล้วนๆ หากคุณต้องการเชี่ยวชาญ Hibernate เป็นอย่างดีหรือเรียนรู้วิธีแยกวิเคราะห์ JSON โปรเจ็กต์นี้เหมาะสำหรับคุณ เริ่มต้นด้วยการรวมการพึ่งพาใน pom.xml (เราถือว่าคุณกำลังใช้ Maven) คุณสามารถทำได้เช่นนี้:
InlineKeyboardMarkup นี่เป็นอาร์เรย์ของอาร์เรย์เช่นกัน ซึ่งคล้ายกับมาร์กอัปก่อนหน้า แต่ตรรกะการทำงานที่นี่แตกต่างออกไปเล็กน้อย แป้นพิมพ์ดังกล่าวเชื่อมโยงกับข้อความเฉพาะและมีไว้เพื่อข้อความนั้นเท่านั้น ต่อไปนี้เป็นวิธีการติดตั้งแป้นพิมพ์แบบอินไลน์
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>3.5</version>
</dependency>
จากนั้นเราสร้างคลาสBot
สืบทอดมาจากคลาส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()
เราจะเปิดบอท สำหรับตอนนี้ เขาเปลี่ยนเส้นทางมาหาเราเฉพาะข้อความใด ๆ ที่เราส่งถึงเขาเท่านั้น ซึ่งเป็น "กระจกเงา" ทุกอย่างทำงานดังนี้: เมื่อคุณเปิดแอปพลิเคชัน แอปพลิเคชันจะเริ่มส่งคำขอ GET ไปยังเซิร์ฟเวอร์ Telegram ทุกๆ n วินาทีที่ URL ต่อไปนี้: https://api.telegram.org/BotToken/getMe โดยที่ BotToken อยู่ โทเค็นของบอทของคุณ โดยรับในการตอบกลับ JSON ที่มีข้อความทั้งหมด แต่ละข้อความดังกล่าวได้รับการประมวลผลโดยไลบรารีและมาถึงวิธีการOnUpdateReceived(Update update)
ในรูปแบบUpdate
วัตถุ นั่นคือสิ่งที่เราร่วมงานด้วย นี่คือข้อดีของบอท Telegram ซึ่งสามารถทำงานบนคอมพิวเตอร์เครื่องใดก็ได้ สำหรับการทดสอบที่คุณเพียงแค่ต้องเปิดแอปพลิเคชัน คุณไม่จำเป็นต้องปรับใช้กับโฮสต์หลังจากการเปลี่ยนแปลงแต่ละครั้ง มันสะดวกสบายมาก แน่นอนว่าบอทสามารถกำหนดค่าให้ทำงานโดยใช้ webhook ได้ คู่มือนี้สามารถพบได้บนอินเทอร์เน็ต เพื่อความง่าย เราจะทำงานโดยใช้ LongPolling วิธีประมวลผลข้อความและสิ่งที่จะส่งตอบกลับนั้นถูกจำกัดโดยเครื่องมือภาษาและไลบรารีเท่านั้น ส่วนอย่างอื่นจะขึ้นอยู่กับดุลยพินิจของคุณ คุณสามารถสร้างบอทที่จะค้นหาวิดีโอบน YouTube ให้คุณได้ คุณสามารถสร้างบอทที่จะส่งสิ่งที่คุณส่งถึงตัวคุณเองทุกวัน เช่น แคปซูลเวลาประเภทหนึ่งภายในหนึ่งปี หรือคุณสามารถเรียนรู้วิธีบูรณาการเข้ากับระบบ CRM และสร้างบอทสำหรับธุรกิจขนาดเล็ก ทุกอย่างถูกจำกัดด้วยจินตนาการของคุณ ไปข้างหน้า. ผู้ที่เคยใช้บอทรู้ดีว่าการโต้ตอบกับบอทโดยใช้คำสั่งที่ขึ้นต้นด้วยเครื่องหมาย«/»
เป็นต้น เป็นเรื่อง/start
ที่ สะดวก แต่มีวิธีที่สะดวกกว่าคือปุ่ม ปุ่มมีสองประเภท: ปุ่มที่ปรากฏใต้ช่องป้อนข้อมูลReplyKeyboardMarkup
และปุ่มที่ปรากฏใต้ข้อความที่เชื่อมโยงInlineKeyboardMarkup
อยู่ ในเอกสารประกอบ คุณสามารถทำความคุ้นเคยกับคำอธิบายโดยย่อได้ ตอบกลับKeyboardMarkup. 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);
}
ใน method sendMsg()
เราเรียกเมธอดนี้โดยการส่งข้อความไปให้เมธอด ดังนั้นการตั้งค่าคีย์บอร์ดสำหรับข้อความนั้น เมื่อเราส่งข้อความนี้ให้ผู้ใช้เขาจะเห็นข้อความที่เราตั้งไว้พร้อมปุ่ม 2 ปุ่มที่เขียนว่า Hello และ Help อยู่ข้างๆ กัน เมื่อคลิกที่ปุ่มเหล่านี้ ข้อความจะถูกส่งไปยังบอท ซึ่งเป็นข้อความที่เขียนอยู่บนปุ่ม นั่นคือหากลูกค้าคลิก "ช่วยเหลือ" บอทจะได้รับข้อความพร้อมข้อความ "ช่วยเหลือ" สำหรับเขา มันเหมือนกับว่าลูกค้าเองเขียนข้อความ “ช่วยเหลือ” และส่งไปให้เขา ถ้าอย่างนั้นคุณก็ประมวลผลข้อความดังกล่าว
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
กับ หากต้องการรับข้อมูลดังกล่าวจากออบเจ็กต์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
สามารถส่งคำตอบ แต่ละวัตถุใน Telegram มีรหัสของตัวเอง หากต้องการส่งการตอบกลับไปยังรายการใดรายการหนึ่งCallbackQuery
เราเพียงต้องทราบรหัสซึ่งเราจะได้รับจากวัตถุที่เกี่ยวข้อง หากต้องการส่งคำตอบ ให้เรียกวิธีนี้:
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 ตัวอักษร! เมื่อส่งการตอบกลับ ลูกค้าจะได้รับหน้าต่างป๊อปอัปสำหรับเขียนข้อความ หน้าต่างดังกล่าวอาจหายไปไม่กี่วินาทีหลังจากที่ปรากฏขึ้น หรืออาจค้างจนกว่าผู้ใช้จะกดตกลง หากต้องการเปลี่ยนโหมดเหล่านี้ เราเรียกไฟล์answer.setShowAlert(true)
. เมื่อtrue
หน้าต่างค้างจนกว่าคุณจะกด OK เมื่อfalse
หน้าต่างหายไปหลังจากผ่านไป 5 วินาที โดยหลักการแล้ว สิ่งเหล่านี้คือคุณสมบัติพื้นฐานทั้งหมดของไลบรารีบอท Telegram หากต้องการ คุณสามารถเรียนรู้สิ่งต่างๆ เช่น การส่งมัลติมีเดีย ตำแหน่งทางภูมิศาสตร์ ฯลฯ ได้จากเอกสารประกอบ มาดูการนำบอทของเราไปใช้งานบนโฮสติ้งกันดีกว่า สำหรับโปรเจ็กต์ของฉัน ฉันเลือก Heroku เพราะในความคิดของฉัน มันเป็นโฮสติ้งที่ค่อนข้างสะดวกซึ่งมี CLI ของตัวเอง ใช้งานได้ฟรี แต่ในอัตรานี้ บอทของคุณจะเข้าสู่โหมดไฮเบอร์เนตหลังจากผ่านไป 30 นาที หากไม่มีคำขอใดๆ เมื่อมีการส่งคำขอถึงเขา เขาก็ตื่นขึ้นมา สิ่งนี้เกิดขึ้นค่อนข้างเร็ว คุณจะไม่สังเกตเห็นด้วยซ้ำ (ยกเว้นในกรณีที่มีการเชื่อมต่อกับฐานข้อมูลอีกครั้ง) ขีดจำกัดของแผนฟรีคือฐานข้อมูล 5MB พื้นที่ดิสก์ 100MB ปริมาณการใช้งาน 2TB ต่อเดือน 1 dino Dino เป็นแอปพลิเคชั่นที่ทำงานอยู่ของคุณ ฉันจะบอกทันทีว่าขั้นตอนการปรับใช้นี่แหละที่ทำให้เกิดปัญหาสำหรับฉัน เนื่องจากฉันไม่เคยปรับใช้แอปพลิเคชันมาก่อน เมื่อปรับใช้ Heroku ต้องใช้ไฟล์ชื่อ Procfile (ไม่มีนามสกุล) worker: sh target/bin/workerBot
เราสร้างมันขึ้นมาในรูทของโปรเจ็กต์ เขียน workerBotที่นั่น - ชื่อที่เราระบุในpom.xml
สคริปต์ sh ที่สร้างขึ้นโดยใช้ปลั๊กอิน Maven appassembler-maven-plugin จะเปิดตัว สคริปต์อธิบายการรัน jar ที่คอมไพล์แล้ว ชื่อของคลาสที่จะเปิดตัวจะถูกระบุระหว่าง <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