- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
程式語言:Go
官方 API
telegram-bot-api GitHub
功能:實現各式進階用法
- Package:github.com/go-telegram-bot-api/telegram-bot-api
官方 API
telegram-bot-api GitHub
功能:實現各式進階用法
送出訊息
// 送出訊息 func (t *TeleBot) sendMessage(chatID int64, m string) { msg := tgbotapi.NewMessage(chatID, m) t.botAPI.Send(msg) }
建立下拉式鍵盤選單
- location & contact 只能使用在 private chat
在其餘 chat 使用,會導致無法顯示
func (t *TeleBot) creatReplyKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ReplyKeyboardMarkup") msg.ReplyMarkup = tgbotapi.ReplyKeyboardMarkup{ Keyboard: [][]tgbotapi.KeyboardButton{ tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(1,1)"), tgbotapi.NewKeyboardButtonLocation("location(1,2)"), tgbotapi.NewKeyboardButtonContact("contact(1,3)"), ), tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(2,1)"), tgbotapi.NewKeyboardButtonLocation("location(2,2)"), tgbotapi.NewKeyboardButtonContact("contact(2,3)"), ), }, } t.botAPI.Send(msg) }
移除下拉式鍵盤選單
func (t *TeleBot) removeReplyKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "remove ReplyKeyboardMarkup") msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{ RemoveKeyboard: true, } t.botAPI.Send(msg) }
建立一次性鍵盤選單並調整為最佳化尺寸
func (t *TeleBot) creatReplyKeyboardMarkupOnetimeResize(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ReplyKeyboardMarkupOneTimeSize") msg.ReplyMarkup = tgbotapi.ReplyKeyboardMarkup{ Keyboard: [][]tgbotapi.KeyboardButton{ tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(1,1)"), tgbotapi.NewKeyboardButtonLocation("location(1,2)"), tgbotapi.NewKeyboardButtonContact("contact(1,3)"), ), tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(2,1)"), tgbotapi.NewKeyboardButtonLocation("location(2,2)"), tgbotapi.NewKeyboardButtonContact("contact(2,3)"), ), }, OneTimeKeyboard: true, ResizeKeyboard: true, } t.botAPI.Send(msg) }
建立聊天選單
func (t *TeleBot) creatInlineKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "inlineButton") str := "cmd" msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("text(1,1)", "callback_data"), tgbotapi.NewInlineKeyboardButtonURL("url(1,3)", "https://core.telegram.org/bots/api#inlinekeyboardmarkup"), tgbotapi.NewInlineKeyboardButtonSwitch("switch_inline_query(1,3)", "cmd"), tgbotapi.InlineKeyboardButton{ Text: "switch_inline_query_current_chat(1,4)", SwitchInlineQueryCurrentChat: &str, }, ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("text(2,1)", "callback_data"), tgbotapi.NewInlineKeyboardButtonURL("url(2,2)", "https://core.telegram.org/bots/api#inlinekeyboardmarkup"), tgbotapi.NewInlineKeyboardButtonSwitch("switch_inline_query(2,3)", "cmd"), tgbotapi.InlineKeyboardButton{ Text: "switch_inline_query_current_chat(2,4)", SwitchInlineQueryCurrentChat: &str, }, ), ) t.botAPI.Send(msg) }
送出強迫回覆訊息
func (t *TeleBot) sendForceReply(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ForceReply") msg.ReplyMarkup = tgbotapi.ForceReply{ ForceReply: true, } t.botAPI.Send(msg) }
送出 Markdown 格式
func (t *TeleBot) sendMarkdown(chatID int64) { markdown := `*bold text*" _italic text_" [inline URL](http://www.example.com/)" [inline mention of a user](tg://user?id=123456789)` markdown += "`inline fixed-width code`\n" markdown += "```block_language\npre-formatted fixed-width code block```" msg := tgbotapi.NewMessage(chatID, markdown) msg.ParseMode = tgbotapi.ModeMarkdown t.botAPI.Send(msg) }
送出 HTML 格式
func (t *TeleBot) sendHTML(chatID int64) { htmlT := `<b>bold</b>, <strong>bold</strong> <i>italic</i>, <em>italic</em> <a href="http://www.example.com/">inline URL</a> <a href="tg://user?id=123456789">inline mention of a user</a> <code>inline fixed-width code</code> <pre>pre-formatted fixed-width code block</pre>` msg := tgbotapi.NewMessage(chatID, htmlT) msg.ParseMode = tgbotapi.ModeHTML t.botAPI.Send(msg) }
送出照片
func (t *TeleBot) sendPhoto(chatID int64) { msg := tgbotapi.NewPhotoShare(chatID, "https://www.logaster.com/blog/wp-content/uploads/2013/06/jpg.png") msg.Caption = "caption" t.botAPI.Send(msg) }
針對聊天選單做出回覆
// demo 聊天選單 var replyMarkup = tgbotapi.NewInlineKeyboardMarkup( ... tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("callback_data", "callback_data"), tgbotapi.NewInlineKeyboardButtonData("callback_data_alert", "callback_data_alert"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("edited text(也可改 markup)", "edited_text"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("edited reply markup", "edited_reply_markup"), ), ) // 回覆空訊息,表示已處理 CallbackQuery func (t *TeleBot) emptyAnswer(CallbackQueryID string) { configAlert := tgbotapi.NewCallback(CallbackQueryID, "") t.botAPI.AnswerCallbackQuery(configAlert) } // 送出對應的 CallbackQuery 回覆 & 對應指令的動作 func (t *TeleBot) sendAnswerCallbackQuery() { for update := range t.updates { if update.Message == nil && update.CallbackQuery == nil { continue } if update.Message != nil { switch update.Message.Text { case "/demo": t.demo(update.Message.Chat.ID) } } if update.CallbackQuery != nil { chatID := update.CallbackQuery.Message.Chat.ID switch update.CallbackQuery.Data { case "ReplyKeyboardMarkup": go t.creatReplyKeyboardMarkup(chatID) go t.emptyAnswer(update.CallbackQuery.ID) ... case "callback_data": config := tgbotapi.NewCallback(update.CallbackQuery.ID, "callbackAnswer") go t.botAPI.AnswerCallbackQuery(config) case "callback_data_alert": configAlert := tgbotapi.NewCallbackWithAlert(update.CallbackQuery.ID, "callbackAnswerAlert") go t.botAPI.AnswerCallbackQuery(configAlert) case "edited_text": editText := tgbotapi.NewEditMessageText( update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, "edited text(有改到)", ) replyMarkup.InlineKeyboard[7][0].Text = "edited text(也可改 markup) 已修改" editText.ReplyMarkup = &replyMarkup go t.botAPI.Send(editText) go t.emptyAnswer(update.CallbackQuery.ID) case "edited_reply_markup": replyMarkup.InlineKeyboard[8][0].Text = "edited reply markup 已修改" editReplyMarkup := tgbotapi.NewEditMessageReplyMarkup( update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, replyMarkup, ) go t.botAPI.Send(editReplyMarkup) go t.emptyAnswer(update.CallbackQuery.ID) } } } }
完整程式碼
package main import ( "log" "github.com/go-telegram-bot-api/telegram-bot-api" ) type TeleBot struct { botAPI *tgbotapi.BotAPI updates tgbotapi.UpdatesChannel } // 送出訊息 func (t *TeleBot) sendMessage(chatID int64, m string) { msg := tgbotapi.NewMessage(chatID, m) t.botAPI.Send(msg) } // 建立下拉式鍵盤選單 func (t *TeleBot) creatReplyKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ReplyKeyboardMarkup") msg.ReplyMarkup = tgbotapi.ReplyKeyboardMarkup{ Keyboard: [][]tgbotapi.KeyboardButton{ tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(1,1)"), tgbotapi.NewKeyboardButtonLocation("location(1,2)"), tgbotapi.NewKeyboardButtonContact("contact(1,3)"), ), tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(2,1)"), tgbotapi.NewKeyboardButtonLocation("location(2,2)"), tgbotapi.NewKeyboardButtonContact("contact(2,3)"), ), }, } t.botAPI.Send(msg) } // 移除下拉式鍵盤選單 func (t *TeleBot) removeReplyKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "remove ReplyKeyboardMarkup") msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{ RemoveKeyboard: true, } t.botAPI.Send(msg) } // 建立一次性鍵盤選單並調整為最佳化尺寸 func (t *TeleBot) creatReplyKeyboardMarkupOnetimeResize(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ReplyKeyboardMarkupOneTimeSize") msg.ReplyMarkup = tgbotapi.ReplyKeyboardMarkup{ Keyboard: [][]tgbotapi.KeyboardButton{ tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(1,1)"), tgbotapi.NewKeyboardButtonLocation("location(1,2)"), tgbotapi.NewKeyboardButtonContact("contact(1,3)"), ), tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("button(2,1)"), tgbotapi.NewKeyboardButtonLocation("location(2,2)"), tgbotapi.NewKeyboardButtonContact("contact(2,3)"), ), }, OneTimeKeyboard: true, ResizeKeyboard: true, } t.botAPI.Send(msg) } // 建立聊天選單 func (t *TeleBot) creatInlineKeyboardMarkup(chatID int64) { msg := tgbotapi.NewMessage(chatID, "inlineButton") str := "cmd" msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("text(1,1)", "callback_data"), tgbotapi.NewInlineKeyboardButtonURL("url(1,3)", "https://core.telegram.org/bots/api#inlinekeyboardmarkup"), tgbotapi.NewInlineKeyboardButtonSwitch("switch_inline_query(1,3)", "cmd"), tgbotapi.InlineKeyboardButton{ Text: "switch_inline_query_current_chat(1,4)", SwitchInlineQueryCurrentChat: &str, }, ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("text(2,1)", "callback_data"), tgbotapi.NewInlineKeyboardButtonURL("url(2,2)", "https://core.telegram.org/bots/api#inlinekeyboardmarkup"), tgbotapi.NewInlineKeyboardButtonSwitch("switch_inline_query(2,3)", "cmd"), tgbotapi.InlineKeyboardButton{ Text: "switch_inline_query_current_chat(2,4)", SwitchInlineQueryCurrentChat: &str, }, ), ) t.botAPI.Send(msg) } // 送出強迫回覆訊息 func (t *TeleBot) sendForceReply(chatID int64) { msg := tgbotapi.NewMessage(chatID, "ForceReply") msg.ReplyMarkup = tgbotapi.ForceReply{ ForceReply: true, } t.botAPI.Send(msg) } // demo 聊天選單 var replyMarkup = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("ReplyKeyboardMarkup", "ReplyKeyboardMarkup"), tgbotapi.NewInlineKeyboardButtonData("removeReplyKeyboardMarkup", "removeReplyKeyboardMarkup"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("ReplyKeyboardMarkupOneTimeSize", "ReplyKeyboardMarkupOneTimeSize"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("InlineKeyboardMarkup", "InlineKeyboardMarkup"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("ForceReply", "ForceReply"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Markdown_HTML", "Markdown_HTML"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Photo", "Photo"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("callback_data", "callback_data"), tgbotapi.NewInlineKeyboardButtonData("callback_data_alert", "callback_data_alert"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("edited text(也可改 markup)", "edited_text"), ), tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("edited reply markup", "edited_reply_markup"), ), ) // demo 指令用 func (t *TeleBot) demo(chatID int64) { msg := tgbotapi.NewMessage(chatID, "inlineButton") msg.ReplyMarkup = replyMarkup t.botAPI.Send(msg) } // 回覆空訊息,表示已處理 CallbackQuery func (t *TeleBot) emptyAnswer(CallbackQueryID string) { configAlert := tgbotapi.NewCallback(CallbackQueryID, "") t.botAPI.AnswerCallbackQuery(configAlert) } // 送出對應的 CallbackQuery 回覆 & 對應指令的動作 func (t *TeleBot) sendAnswerCallbackQuery() { for update := range t.updates { if update.Message == nil && update.CallbackQuery == nil { continue } if update.Message != nil { switch update.Message.Text { case "/demo": t.demo(update.Message.Chat.ID) } } if update.CallbackQuery != nil { chatID := update.CallbackQuery.Message.Chat.ID switch update.CallbackQuery.Data { case "ReplyKeyboardMarkup": go t.creatReplyKeyboardMarkup(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "removeReplyKeyboardMarkup": go t.removeReplyKeyboardMarkup(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "ReplyKeyboardMarkupOneTimeSize": go t.creatReplyKeyboardMarkupOnetimeResize(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "InlineKeyboardMarkup": go t.creatInlineKeyboardMarkup(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "ForceReply": go t.sendForceReply(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "Markdown_HTML": go t.sendMarkdown(chatID) go t.sendHTML(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "Photo": go t.sendPhoto(chatID) go t.emptyAnswer(update.CallbackQuery.ID) case "callback_data": config := tgbotapi.NewCallback(update.CallbackQuery.ID, "callbackAnswer") go t.botAPI.AnswerCallbackQuery(config) case "callback_data_alert": configAlert := tgbotapi.NewCallbackWithAlert(update.CallbackQuery.ID, "callbackAnswerAlert") go t.botAPI.AnswerCallbackQuery(configAlert) case "edited_text": editText := tgbotapi.NewEditMessageText( update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, "edited text(有改到)", ) replyMarkup.InlineKeyboard[7][0].Text = "edited text(也可改 markup) 已修改" editText.ReplyMarkup = &replyMarkup go t.botAPI.Send(editText) go t.emptyAnswer(update.CallbackQuery.ID) case "edited_reply_markup": replyMarkup.InlineKeyboard[8][0].Text = "edited reply markup 已修改" editReplyMarkup := tgbotapi.NewEditMessageReplyMarkup( update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, replyMarkup, ) go t.botAPI.Send(editReplyMarkup) go t.emptyAnswer(update.CallbackQuery.ID) } } } } // 送出 markdown 格式 func (t *TeleBot) sendMarkdown(chatID int64) { markdown := `*bold text*" _italic text_" [inline URL](http://www.example.com/)" [inline mention of a user](tg://user?id=123456789)` markdown += "`inline fixed-width code`\n" markdown += "```block_language\npre-formatted fixed-width code block```" msg := tgbotapi.NewMessage(chatID, markdown) msg.ParseMode = tgbotapi.ModeMarkdown t.botAPI.Send(msg) } // 送出 HTML 格式 func (t *TeleBot) sendHTML(chatID int64) { htmlT := `<b>bold</b>, <strong>bold</strong> <i>italic</i>, <em>italic</em> <a href="http://www.example.com/">inline URL</a> <a href="tg://user?id=123456789">inline mention of a user</a> <code>inline fixed-width code</code> <pre>pre-formatted fixed-width code block</pre>` msg := tgbotapi.NewMessage(chatID, htmlT) msg.ParseMode = tgbotapi.ModeHTML t.botAPI.Send(msg) } // 送出照片 func (t *TeleBot) sendPhoto(chatID int64) { msg := tgbotapi.NewPhotoShare(chatID, "https://www.logaster.com/blog/wp-content/uploads/2013/06/jpg.png") msg.Caption = "caption" t.botAPI.Send(msg) } func main() { bot, err := tgbotapi.NewBotAPI("595702885:AAFIXbar3bl-a0H0YyWiKOvbX_u9X6s0FPs") if err != nil { log.Fatal(err) } bot.Debug = true teleBot := TeleBot{ botAPI: bot, } u := tgbotapi.NewUpdate(0) u.Timeout = 60 teleBot.updates, err = bot.GetUpdatesChan(u) teleBot.sendAnswerCallbackQuery() }
留言
張貼留言