iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 26
1
Modern Web

從零開始的點餐系統,Google好棒棒系列 第 26

[Day26] Telegram Bot 對話

在昨天講解了指令集後
今天來講解Bot的回傳方式

文字

這是最基本也是最基礎的純文字
在前幾天的程式碼裡

msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)

當中第二個參數就是回傳的文字

Keyboards

第二種是下方選單的按鈕清單
先建一組按鈕清單

  • 我的訂單
  • 團購清單
var command = tgbotapi.NewReplyKeyboard(
	tgbotapi.NewKeyboardButtonRow(
		tgbotapi.NewKeyboardButton("我的訂單"),
		tgbotapi.NewKeyboardButton("團購清單"),
	),
)

在msg新增 ReplyMarkup = command 即可

for update := range updates {
		if update.Message == nil { // ignore any non-Message Updates
			continue
		}

		log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)

		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "按鈕清單")
		msg.ReplyToMessageID = update.Message.MessageID
		msg.ReplyMarkup = command
		bot.Send(msg)
	}

Inline keyboards

Inline keyboards 有三種模式

  • NewInlineKeyboardButtonSwitch
  • NewInlineKeyboardButtonURL
  • NewInlineKeyboardButtonData

這裡只用到Data的部分當作回傳的資料內容
一樣先建立按鈕清單

var store = tgbotapi.NewInlineKeyboardMarkup(
	tgbotapi.NewInlineKeyboardRow(
		tgbotapi.NewInlineKeyboardButtonData("50嵐", "50嵐"),
		tgbotapi.NewInlineKeyboardButtonData("CoCo", "CoCo"),
	),
)

針對上面的Keyboard按鈕進行事件處理

switch update.Message.Text {
		case "我的訂單":
			returntext = "還沒實作"
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, returntext)
			msg.ReplyMarkup = command
			bot.Send(msg)
		case "團購清單":
			returntext = "店家資訊"
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, returntext)
			msg.ReplyMarkup = store
			bot.Send(msg)
		default:
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
			bot.Send(msg)
		}

針對InlineKeyboard按鈕進行處理

if update.CallbackQuery != nil {
			fmt.Print(update)

			bot.AnswerCallbackQuery(tgbotapi.NewCallback(update.CallbackQuery.ID, update.CallbackQuery.Data))

			bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Data))
		}

結果的Code

package main

import (
	"fmt"
	"log"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
)

var command = tgbotapi.NewReplyKeyboard(
	tgbotapi.NewKeyboardButtonRow(
		tgbotapi.NewKeyboardButton("我的訂單"),
		tgbotapi.NewKeyboardButton("團購清單"),
	),
)

var store = tgbotapi.NewInlineKeyboardMarkup(
	tgbotapi.NewInlineKeyboardRow(
		tgbotapi.NewInlineKeyboardButtonData("50嵐", "50嵐"),
		tgbotapi.NewInlineKeyboardButtonData("CoCo", "CoCo"),
	),
)

func main() {
	bot, err := tgbotapi.NewBotAPI("Token")
	if err != nil {
		log.Panic(err)
	}

	bot.Debug = true

	log.Printf("Authorized on account %s", bot.Self.UserName)

	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60

	updates, err := bot.GetUpdatesChan(u)
	returntext := ""
	for update := range updates {
		if update.CallbackQuery != nil {
			fmt.Print(update)

			bot.AnswerCallbackQuery(tgbotapi.NewCallback(update.CallbackQuery.ID, update.CallbackQuery.Data))

			bot.Send(tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Data))
		}

		if update.Message == nil { // ignore any non-Message Updates
			continue
		}

		log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)

		switch update.Message.Text {
		case "我的訂單":
			returntext = "還沒實作"
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, returntext)
			msg.ReplyMarkup = command
			bot.Send(msg)
		case "團購清單":
			returntext = "店家資訊"
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, returntext)
			msg.ReplyMarkup = store
			bot.Send(msg)
		default:
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
			bot.Send(msg)
		}

	}
}

結語

這樣就建立了一個超級簡單的對話機器人了
後面只要再針對他收到的資料進行處理
跟後端的系統串接 就可以開始準備使用機器人來做點餐的動作了


上一篇
[Day25] GoBot介紹-指令集
下一篇
[Day27] GO Bot主動傳送訊息
系列文
從零開始的點餐系統,Google好棒棒30

尚未有邦友留言

立即登入留言