- 取得連結
- 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()
- }
留言
張貼留言