[텔레그램 봇] Go Telegram Bot With Golang

시작하기

  1. API 받기 및 bot생성

👉🏻BotFather

/help 명령어를 통해 가능한 기능들 확인
father
/newbot 으로 생성해서 순서대로 시키는대로 하면 토큰이 나온다.

  1. Library Example 따라하기

https://github.com/mymmrac/telego

데이터 수신방법 2가지

using long polling (bot.UpdatesViaLongPolling)
using webhook (bot.UpdatesViaWebhook)

유틸을 사용해서 메시지말고 다양한 형태로 보낼수있다.

Message(chatID, text) => SendMessageParams
Photo(chatID, photoFile) => SendPhotoParams
Location(chatID, latitude, longitude) => SendLocationParams

Or other useful methods like:

ID(intID) => ChatID
File(namedReader) => InputFile

채팅방 Input 기능

/명령어 , 키보드버튼, 인라인버튼

예제에는 Bot과의 Interaction 기능 ,외부 서버와 Integration 기능은 없다.

  1. 실전소스 with Golang
1
2
3
4
5
6
7
8
9
10
11
12
13
import (
"fmt"
"io"
"os"
"strconv"

"github.com/mymmrac/telego"
th "github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
log "github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"

)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
botToken := "6048725563:xxxx" // set token

bot, err := telego.NewBot(botToken) // telego 생성
if err != nil {
fmt.Println(err)
os.Exit(1)
}

// Get updates channel
updates, _ := bot.UpdatesViaLongPolling(nil) // 폴링방식으로

// Create bot handler and specify from where to get updates
bh, _ := th.NewBotHandler(bot, updates)

// Stop handling updates
defer bh.Stop()

// Stop getting updates
defer bot.StopLongPolling()
1
2
3
4
5
6
7
8
9
10
//인라인 키보드 생성 EXAM
inlineInit := tu.InlineKeyboard(
tu.InlineKeyboardRow( // 한줄
tu.InlineKeyboardButton("버튼이름").WithCallbackData("콜백왔을때 구분값"), //버튼
),
tu.InlineKeyboardRow( // 두줄
tu.InlineKeyboardButton("버튼이름").WithCallbackData("콜백왔을때 구분값"),
tu.InlineKeyboardButton("버튼이름").WithCallbackData("콜백왔을때 구분값"),
),
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Register new handler with match on command `/start`
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
// Send message with inline keyboard
var introduce = "Welcome ~"

_, _ = bot.SendMessage(tu.Messagef(
tu.ID(id),
fmt.Sprintf("Hello %s! \n%s", name, introduce),
))

params := &telego.SendPhotoParams{
ChatID: tu.ID(id),
Photo: tu.FileByURL("any picture.png"), // 그림도 내보내기
ReplyMarkup: inlineInit, // 인라인 버튼 내보내기
}
_, _ = bot.SendPhoto(params)
}, th.CommandEqual("start")) // 봇채팅방에서 입력한 커맨드 명령어가 start일때
1
2
3
4
//inline button click 시  callback 처리
bh.HandleCallbackQuery(func(bot *telego.Bot, query telego.CallbackQuery) {
// 후처리
}, th.AnyCallbackQueryWithMessage(), th.CallbackDataEqual("콜백왔을때 구분값"))
1
2
// inline button에 웹앱 링크걸기
tu.InlineKeyboardButton("Open the Webapp").WithWebApp(&telego.WebAppInfo{URL: uri}),