แล้วบอทคืออะไร? คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่ ในการเริ่มต้น คุณต้องตรวจสอบเอกสารอย่างเป็นทางการสำหรับไลบรารีที่ใช้ในการพัฒนาบอท Telegram (ต่อไปนี้เรียกว่า "API") ได้ที่ นี่
ทุกอย่างสามารถเข้าถึงได้และชัดเจนมาก ดูเหมือนว่าเราจะสามารถเขียนโค้ดและชื่นชมยินดีได้! แต่มันไม่ง่ายอย่างนั้น หลังจากใช้เวลาค้นหาอยู่พักใหญ่ ผมก็พบเกร็ดความรู้เล็กๆ น้อยๆ เกี่ยวกับการพัฒนาบอท เช่น วิธีสร้างคีย์บอร์ด จัดการ
ขอบคุณที่อ่านบทความยาวๆ ฉันหวังว่าบางคนจะพบว่ามันมีประโยชน์และจะช่วยให้คุณประหยัดเวลาในส่วนที่ทำให้ฉันมีปัญหาระหว่างการพัฒนา

CallbackQuery
และอื่น ๆ แต่ฉันไม่พบคำแนะนำที่สมบูรณ์และละเอียดถี่ถ้วนสำหรับการพัฒนาบอต Java นั่นทำให้ฉันเขียนบทความนี้ มีเว็บไซต์จำนวนมากที่คุณสามารถสร้างบอทที่ปรับใช้ได้ง่ายของคุณเอง แต่ความจริงก็คือ บอทส่วนใหญ่ที่สร้างขึ้นนั้นให้ข้อมูลอ้างอิงและสิ่งที่คล้ายกัน บอทของเราเป็นเว็บแอปพลิเคชันที่เต็มเปี่ยม คุณสามารถผูกฐานข้อมูล ดำเนินการคำขอ API ต่างๆ แยกวิเคราะห์เว็บไซต์ ทำการคำนวณที่ซับซ้อน และอื่นๆ อีกมากมาย ความเป็นไปได้ถูกจำกัดด้วยจินตนาการของคุณเท่านั้น ฉันหวังว่าข้อความข้างต้นจะช่วยอธิบายสิ่งที่ฉันกำลังจะเขียนให้ชัดเจนขึ้น การลงทะเบียนบอทบน Telegram นั้นง่ายมาก กระบวนการนี้มีรายละเอียดอธิบายไว้ในเอกสารประกอบที่เชื่อมโยงกับด้านบน สำหรับแอปพลิเคชันของเรา คุณจะต้องทราบชื่อบอทและโทเค็นที่คุณได้รับเมื่อลงทะเบียนบอทเท่านั้น โดยพื้นฐานแล้ว บอทเป็นเพียงเว็บแอปพลิเคชันบนคอนโซล ไม่มีส่วนหน้ามีเพียงการประมวลผลคำสั่งเท่านั้น หากคุณต้องการที่จะเชี่ยวชาญไฮเบอร์เนตหรือเรียนรู้วิธีแยกวิเคราะห์JSONนี่คือโครงการสำหรับคุณ เริ่มต้นด้วยการเพิ่มการพึ่งพาpom.xml
(ฉันจะถือว่าคุณกำลังใช้ Maven) คุณสามารถทำได้ดังนี้:
<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 creating a message and sending it.
* @param chatId chat id
* @param s The String that you want 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());
}
}
/**
* This method returns the bot's name, which was specified during registration.
* @return bot name
*/
@Override
public String getBotUsername() {
return "BotName";
}
/**
* This method returns the bot's token for communicating with the Telegram server
* @return the bot's token
*/
@Override
public String getBotToken() {
return "BotToken";
}
}
และตอนนี้เนื้อหาของmain
วิธีการ:
public static void main(String[] args) {
ApiContextInitializer.init();
TelegramBotApi telegramBotApi = new TelegramBotApi();
try {
telegramBotApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
}
หลังจากกรอกgetBotUsername()
และgetBotToken()
วิธีการแล้วให้เริ่มบอท สำหรับตอนนี้ มันแค่เปลี่ยนเส้นทางข้อความใดๆ ที่เราส่งไปให้เรา เหมือนกับ " มิเรอร์ " มันทำงานดังนี้: เมื่อคุณเริ่มแอปพลิเคชัน มันจะเริ่มส่งคำขอไปยังเซิร์ฟเวอร์ Telegram ทุกๆ n วินาที ที่ URL ต่อไปนี้: https://api.telegram.org/BotToken/getMeโดยที่ BotToken เป็นโทเค็นของบอทของคุณ . ในการตอบสนอง จะได้รับ JSON ที่มีข้อความทั้งหมด แต่ละข้อความเหล่านี้ได้รับการประมวลผลโดยไลบรารีและส่งผ่านไปยังOnUpdateReceived(Update update)
เมธอดเป็น anUpdate
วัตถุ. และนั่นคือสิ่งที่เราทำงานร่วมกัน ความสวยงามของบ็อต Telegram มีอยู่ในที่นี้: พวกมันสามารถทำงานบนคอมพิวเตอร์เครื่องใดก็ได้ การทดสอบนั้นเพียงแค่ต้องเริ่มแอปพลิเคชัน และคุณไม่จำเป็นต้องปรับใช้กับโฮสต์หลังจากการเปลี่ยนแปลงแต่ละครั้ง สะดวกมาก แน่นอน คุณสามารถกำหนดค่าบอทให้ทำงานโดยใช้เว็บฮุคได้ คุณสามารถค้นหาเส้นทางได้บนอินเทอร์เน็ต เพื่อความง่าย เราจะใช้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 rows
List<KeyboardRow> keyboard = new ArrayList<>();
// First keyboard row
KeyboardRow keyboardFirstRow = new KeyboardRow();
// Add buttons to the first keyboard row
keyboardFirstRow.add(new KeyboardButton("Hi"));
// Second keyboard row
KeyboardRow keyboardSecondRow = new KeyboardRow();
// Add the buttons to the second keyboard row
keyboardSecondRow.add(new KeyboardButton("Help");
// Add all of the keyboard rows to the list
keyboard.add(keyboardFirstRow);
keyboard.add(keyboardSecondRow);
// and assign this list to our keyboard
replyKeyboardMarkup.setKeyboard(keyboard);
}
เราเรียกเมธอดนี้ว่าsendMsg()
เมธอด หลังจากส่งข้อความไปแล้ว นี่คือวิธีที่เราตั้งค่าแป้นพิมพ์สำหรับข้อความนั้น เมื่อเราส่งข้อความนี้ถึงผู้ใช้ เขาจะเห็นข้อความในข้อความของเราและปุ่ม 2 ปุ่มที่เขียนว่า"สวัสดี"และ"ช่วยเหลือ" ซึ่ง อยู่ด้านล่างอีกปุ่มหนึ่ง เมื่อคลิกปุ่มใดปุ่มหนึ่ง บอทจะส่งข้อความที่มีข้อความของปุ่มนั้น ดังนั้น หากไคลเอ็นต์คลิก"Help"บอทจะได้รับข้อความ"Help" ดูเหมือนว่าลูกค้าจะเขียน"Help"และส่งข้อความถึงบอท เอง จากนั้นคุณประมวลผลข้อความ
InlineKeyboardMarkup
นี่เป็นอาร์เรย์ของอาร์เรย์ด้วย มันคล้ายกับ Markup ก่อนหน้า แต่ตรรกะทำงานแตกต่างกันเล็กน้อยที่นี่ แป้นพิมพ์ประเภทนี้แนบมากับข้อความเฉพาะและมีไว้สำหรับข้อความนั้นเท่านั้น ต่อไปนี้เป็นวิธีการตั้งค่าแป้นพิมพ์แบบอินไลน์:
private void setInline() {
List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
List<InlineKeyboardButton> buttons1 = new ArrayList<>();
buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
buttons.add(buttons1);
InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
markupKeyboard.setKeyboard(buttons);
}
สร้าง a List
ภายในList
และเพิ่มปุ่มอินไลน์ในแถวแรก ปุ่มนี้สามารถมี URL ลิงก์ไปยังช่อง หรือCallbackQuery
ซึ่งฉันจะเขียนถึงในภายหลัง นี่คือที่ที่เราตั้งค่าข้อความของปุ่ม ซึ่งเป็นสิ่งที่ผู้ใช้จะเห็น จากนั้นเราตั้งค่าข้อมูลที่จะส่งไปยังบอท ในตัวอย่างของเรา ผู้ใช้เห็น "สวัสดี" และเมื่อกดปุ่ม หมายเลข 17 จะถูกส่งไปยังบอท นี่คือของCallbackQuery
เรา คำสองสามคำเกี่ยวกับCallbackQuery
. ในการรับข้อมูลนี้จากUpdate
วัตถุ คุณต้องดำเนินupdate.getCallbackQuery()
การ เมธอดนี้ส่งคืน a 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
ยัง ทุกวัตถุในโทรเลขมีรหัสของตัวเอง ในการส่งการตอบกลับไปยังรายการใดรายการหนึ่ง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 หากคุณส่งเป็นเท็จ จะหายไปหลังจาก 5 วินาที ทั้งหมดนี้เป็นคุณลักษณะพื้นฐานของไลบรารี Telegram Bot หากต้องการ คุณสามารถเรียนรู้สิ่งต่างๆ เช่น วิธีส่งมัลติมีเดีย ตำแหน่งทางภูมิศาสตร์ ฯลฯ เรามาเริ่มปรับใช้บอทของเรากับแพลตฟอร์มโฮสติ้งกัน สำหรับโครงการของฉัน ฉันเลือกHeroku. ฉันคิดว่ามันเป็นแพลตฟอร์มโฮสติ้งที่ค่อนข้างสะดวกด้วย CLI ของตัวเอง ไม่มีค่าใช้จ่าย แต่ในแผนนี้ บอทของคุณจะจำศีลหลังจากไม่ได้รับคำขอเป็นเวลา 30 นาที มันจะตื่นขึ้นเมื่อได้รับการร้องขอ สิ่งนี้เกิดขึ้นเร็วมาก คุณจะไม่ทันสังเกตด้วยซ้ำ (แน่นอนว่าการเชื่อมต่อฐานข้อมูลจะไม่เริ่มใหม่) แผนฟรีจำกัดด้วยฐานข้อมูล 5MB พื้นที่ดิสก์ 100MB ข้อมูล 2TB ต่อเดือน และ 1 ไดโน dyno คือแอปพลิเคชันที่กำลังทำงานอยู่ของคุณ ฉันจะบอกทันทีว่าการติดตั้งใช้งานนั้นทำให้ฉันลำบาก เนื่องจากฉันไม่เคยติดตั้งแอปพลิเคชันของฉันมาก่อน ในระหว่างการปรับใช้ Heroku ต้องการไฟล์ชื่อ Procfile (ไม่มีนามสกุล) เราสร้างมันในรูทโปรเจ็กต์ ข้างใน เราเขียนworker: sh target/bin/workerBot
ว่า โดยที่workerBotเป็นชื่อที่ระบุpom.xml
ใน อาย_สคริปต์ที่สร้างโดยMaven Application Assembler Plugin (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 the 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