MCPcopy Index your code
hub / github.com/go-telegram-bot-api/telegram-bot-api

github.com/go-telegram-bot-api/telegram-bot-api @v5.5.1

repository ↗ · DeepWiki ↗ · release v5.5.1 ↗ · + Follow
719 symbols 1,689 edges 11 files 400 documented · 56% 2 cross-repo links updated 23mo agov5.5.1 · 2021-12-13★ 6,415110 open issues
README

Golang bindings for the Telegram Bot API

Go Reference Test

All methods are fairly self-explanatory, and reading the godoc page should explain everything. If something isn't clear, open an issue or submit a pull request.

There are more tutorials and high-level information on the website, go-telegram-bot-api.dev.

The scope of this project is just to provide a wrapper around the API without any additional features. There are other projects for creating something with plugins and command handlers without having to design all that yourself.

Join the development group if you want to ask questions or discuss development.

Example

First, ensure the library is installed and up to date by running go get -u github.com/go-telegram-bot-api/telegram-bot-api/v5.

This is a very simple bot that just displays any gotten updates, then replies it to that chat.

package main

import (
    "log"

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

func main() {
    bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
    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 := bot.GetUpdatesChan(u)

    for update := range updates {
        if update.Message != nil { // If we got a message
            log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)

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

            bot.Send(msg)
        }
    }
}

If you need to use webhooks (if you wish to run on Google App Engine), you may use a slightly different method.

package main

import (
    "log"
    "net/http"

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

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

    bot.Debug = true

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

    wh, _ := tgbotapi.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem")

    _, err = bot.SetWebhook(wh)
    if err != nil {
        log.Fatal(err)
    }

    info, err := bot.GetWebhookInfo()
    if err != nil {
        log.Fatal(err)
    }

    if info.LastErrorDate != 0 {
        log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
    }

    updates := bot.ListenForWebhook("/" + bot.Token)
    go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil)

    for update := range updates {
        log.Printf("%+v\n", update)
    }
}

If you need, you may generate a self-signed certificate, as this requires HTTPS / TLS. The above example tells Telegram that this is your certificate and that it should be trusted, even though it is not properly signed.

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3560 -subj "//O=Org\CN=Test" -nodes

Now that Let's Encrypt is available, you may wish to generate your free TLS certificate there.

Extension points exported contracts — how you extend this code

Chattable (Interface)
Chattable is any config type that can be sent. [74 implementers]
configs.go
PassportScopeElement (Interface)
PassportScopeElement supports using one or one of several elements. [2 implementers]
passport.go
BotLogger (Interface)
BotLogger is an interface that represents the required methods to log data. Instead of requiring the standard logger, w [1 …
log.go
HTTPClient (Interface)
HTTPClient is the type needed for the bot to perform HTTP requests.
bot.go
Fileable (Interface)
Fileable is any config type that can be sent that includes a file. [16 implementers]
configs.go
PassportElementError (Interface)
PassportElementError represents an error in the Telegram Passport element which was submitted that should be resolved by
passport.go
RequestFileData (Interface)
RequestFileData represents the data to be used for a file. [2 implementers]
configs.go

Core symbols most depended-on inside this repo

Error
called by 79
types.go
AddNonEmpty
called by 49
params.go
AddNonZero
called by 46
params.go
AddBool
called by 41
params.go
Send
called by 39
bot.go
AddFirstValid
called by 34
params.go
Request
called by 32
bot.go
AddInterface
called by 31
params.go

Shape

Method 277
Function 221
Struct 207
Interface 7
TypeAlias 7

Languages

Go100%

Modules by API surface

configs.go297 symbols
types.go132 symbols
helpers.go93 symbols
bot_test.go58 symbols
bot.go40 symbols
types_test.go32 symbols
passport.go26 symbols
helpers_test.go20 symbols
params_test.go9 symbols
params.go8 symbols
log.go4 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add telegram-bot-api \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact