Hey there, fellow developer! Ready to dive into the world of Telegram bots using Go? You're in for a treat. The Telegram Bot API is a powerful tool, and when combined with Go's simplicity and efficiency, you've got a recipe for some seriously cool projects.
Go is an excellent choice for Telegram bot development due to its strong concurrency support, fast execution, and straightforward syntax. Let's get started!
Before we jump in, make sure you've got:
If you're missing any of these, take a quick detour to set them up. Don't worry, I'll wait!
Alright, let's get our hands dirty. Open up your terminal and let's create a new Go module:
mkdir telegram-bot cd telegram-bot go mod init github.com/yourusername/telegram-bot
Now, let's grab the Telegram bot library. We'll be using the excellent github.com/go-telegram-bot-api/telegram-bot-api/v5
package:
go get -u github.com/go-telegram-bot-api/telegram-bot-api/v5
Time to write some Go! Create a new file called main.go
and let's start with the basics:
package main import ( "log" "os" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN")) if err != nil { log.Panic(err) } bot.Debug = true log.Printf("Authorized on account %s", bot.Self.UserName) }
Make sure to set your bot token as an environment variable:
export TELEGRAM_APITOKEN=your_bot_token_here
Now, let's make our bot respond to messages:
func main() { // ... previous code ... u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates := bot.GetUpdatesChan(u) for update := range updates { if update.Message == nil { continue } log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You said: "+update.Message.Text) msg.ReplyToMessageID = update.Message.MessageID bot.Send(msg) } }
Run your bot with go run main.go
, and voilà! Your bot is now echoing messages.
Let's spice things up with some commands and inline keyboards:
func main() { // ... previous code ... for update := range updates { if update.Message != nil { switch update.Message.Command() { case "start": msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Welcome! I'm your friendly neighborhood bot.") bot.Send(msg) case "help": msg := tgbotapi.NewMessage(update.Message.Chat.ID, "I can echo your messages and show you a cool keyboard!") bot.Send(msg) case "keyboard": msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Check out this awesome keyboard!") msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup( tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("Option 1", "opt1"), tgbotapi.NewInlineKeyboardButtonData("Option 2", "opt2"), ), ) bot.Send(msg) default: // Echo the message msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) bot.Send(msg) } } else if update.CallbackQuery != nil { // Handle button presses callback := tgbotapi.NewCallback(update.CallbackQuery.ID, update.CallbackQuery.Data) bot.Request(callback) msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "You chose "+update.CallbackQuery.Data) bot.Send(msg) } } }
Don't forget to handle errors gracefully and log important events. The log
package is your friend here!
When you're ready to unleash your bot upon the world, you've got options:
Consider using webhooks instead of long-polling for production deployments. It's more efficient and responsive.
And there you have it! You've just built a Telegram bot in Go. Pretty cool, right? Remember, this is just the beginning. The Telegram Bot API offers a wealth of features to explore.
Keep coding, keep learning, and most importantly, have fun! If you get stuck, the Go and Telegram communities are always ready to lend a hand.
Happy botting!