gogram

package module
v1.7.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 11, 2026 License: GPL-3.0 Imports: 29 Imported by: 1

README

Gogram
modern golang library for mtproto
documentation  •  releases  •  telegram chat

GoDoc Go Report Card License GitHub stars GitHub forks

Counter

⭐️ Gogram is a modern, elegant and concurrent MTProto API framework. It enables you to easily interact with the main Telegram API through a user account (custom client) or a bot identity (bot API alternative) using Go.


Gogram is currently in its stable release stage. While there may still be a few bugs, feel free to use it and provide feedback if you encounter any issues or rough edges. 😊

setup

please note that gogram requires Go 1.18 or later to support go-generics

go get -u github.com/amarnathcjd/gogram/telegram

quick start

package main

import "github.com/amarnathcjd/gogram/telegram"

func main() {
	client, err := telegram.NewClient(telegram.ClientConfig{
		AppID: 6, AppHash: "<app-hash>",
	})

	if err != nil {
		log.Fatal(err)
	}

	client.Conn()

	client.LoginBot("<bot-token>") // or client.Login("<phone-number>") for user account, or client.AuthPrompt() for interactive login

	client.On(telegram.OnMessage, func(message *telegram.NewMessage) error { // client.AddMessageHandler
			message.Reply("Hello from Gogram!")
        		return nil
	}, telegram.FilterPrivate) // waits for private messages only

	client.Idle() // block main goroutine until client is closed
}

support dev

If you'd like to support Gogram, you can consider:

key features

  • ready: 🚀 install gogram with go get and you are ready to go!
  • easy: 😊 makes the telegram api simple and intuitive, while still allowing advanced usages.
  • elegant: 💎 low-level details are abstracted and re-presented in a more convenient way.
  • fast: ⚡ backed by a powerful and concurrent library, gogram can handle even the heaviest workloads.
  • zero dependencies: 🛠️ no need to install anything else than gogram itself.
  • powerful: 💪 full access to telegram's api to execute any official client action and more.
  • feature-rich: 🌟 built-in support for file uploading, formatting, custom keyboards, message editing, moderation tools and more.
  • up-to-date: 🔄 gogram is always in sync with the latest telegram api changes and additions (tl-parser is used to generate the api layer).
Current Layer - 221 (Updated on 2026-01-12)

doing stuff

// sending a message

client.SendMessage("username", "Hello from Gogram!")

client.SendDice("username", "🎲")

client.On("message:/start", func(m *telegram.NewMessage) error {
    m.Reply("Hello from Gogram!") // m.Respond("...")
    return nil
})
// sending media

client.SendMedia("username", "<file-name>", &telegram.MediaOptions{ // filename/inputmedia,...
    Caption: "Hello from Gogram!",
    TTL: int32((math.Pow(2, 31) - 1)), //  TTL For OneTimeMedia
})

client.SendAlbum("username", []string{"<file-name>", "<file-name>"}, &telegram.MediaOptions{ // Array of filenames/inputmedia,...
    Caption: "Hello from Gogram!",
})

// with progress
var pm *telegram.ProgressManager
client.SendMedia("username", "<file-name>", &telegram.MediaOptions{
    Progress: func(a,b int) {
        if pm == nil {
            pm = telegram.NewProgressManager(a, 3) // 3 is edit interval
        }

        if pm.ShouldEdit(b) {
            fmt.Println(pm.GetStats(b)) // client.EditMessage("<chat-id>", "<message-id>", pm.GetStats())
        }
    },
})
// inline queries

client.On("inline:<pattern>", func(iq *telegram.InlineQuery) error { // client.AddInlineHandler
	builder := iq.Builder()
	builder.Article("<title>", "<description>", "<text>", &telegram.ArticleOptions{
			LinkPreview: true,
	})

	return nil
})
// callback queries

client.On("callback:<pattern>", func(cb *telegram.CallbackQuery) error { // client.AddCallbackHandler
    cb.Answer("This is a callback response", &CallbackOptions{
		Alert: true,
	})
    return nil
})

For more examples, check the examples directory.

features

  • basic mtproto implementation (layer 184)
  • updates handling system + cache
  • html, markdown parsing, friendly methods
  • support for flag2.0, layer 147
  • webrtc calls support
  • documentation for all methods
  • stabilize file uploading
  • stabilize file downloading
  • secret chats support
  • cdn dc support
  • reply markup builder helpers
  • reimplement file downloads (more speed + less cpu usage)

known issues

  • ~ file download, is cpu intensive
  • ~ open issues if found :)
  • ~ enhance peer caching (Fixed: improved locking, username persistence, debounced writes, min entity handling)

contributing

Gogram is an open-source project and your contribution is very much appreciated. If you'd like to contribute, simply fork the repository, commit your changes and send a pull request. If you have any questions, feel free to ask.

License

This library is provided under the terms of the GPL-3.0 License.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrAuthKeyInvalid = fmt.Errorf("auth key invalid (code -404) - too many failures")

Functions

func AnyError added in v1.6.7

func AnyError(err error, errs ...string) bool

func FormatDecodeError added in v1.6.10

func FormatDecodeError(err error) string

func RpcErrorToNative

func RpcErrorToNative(r *objects.RpcError, method ...string) error

func TryExpandError

func TryExpandError(errStr string) (nativeErrorName string, additionalData any)

Types

type BadMsgError

type BadMsgError struct {
	*objects.BadMsgNotification
	Description string
}

func BadMsgErrorFromNative

func BadMsgErrorFromNative(in *objects.BadMsgNotification) *BadMsgError

func (*BadMsgError) Error

func (e *BadMsgError) Error() string

type BadSystemMessageCode

type BadSystemMessageCode int32
const (
	ErrBadMsgUnknown             BadSystemMessageCode = 0
	ErrBadMsgIdTooLow            BadSystemMessageCode = 16
	ErrBadMsgIdTooHigh           BadSystemMessageCode = 17
	ErrBadMsgIncorrectMsgIdBits  BadSystemMessageCode = 18
	ErrBadMsgWrongContainerMsgId BadSystemMessageCode = 19 // this must never happen
	ErrBadMsgMessageTooOld       BadSystemMessageCode = 20
	ErrBadMsgSeqNoTooLow         BadSystemMessageCode = 32
	ErrBadMsgSeqNoTooHigh        BadSystemMessageCode = 33
	ErrBadMsgSeqNoExpectedEven   BadSystemMessageCode = 34
	ErrBadMsgSeqNoExpectedOdd    BadSystemMessageCode = 35
	ErrBadMsgServerSaltIncorrect BadSystemMessageCode = 48
	ErrBadMsgInvalidContainer    BadSystemMessageCode = 64
)

type Config

type Config struct {
	AuthKeyFile    string                // Path to auth key file for persistent sessions
	AuthAESKey     string                // AES-256 key for encrypting session file
	StringSession  string                // Base64 encoded session string
	SessionStorage session.SessionLoader // Custom session storage implementation
	MemorySession  bool                  // Keep session in memory only
	AppID          int32                 // Telegram API ID
	EnablePFS      bool                  // Enable Perfect Forward Secrecy

	FloodHandler      func(err error) bool  // Called on FLOOD_WAIT; return true to retry
	ErrorHandler      func(err error) bool  // Called on errors; return true to retry
	ConnectionHandler func(err error) error // Custom reconnection handler

	ServerHost      string         // Telegram server address (IP:port)
	PublicKey       *rsa.PublicKey // RSA public key for server verification
	DataCenter      int            // Data center ID (1-5)
	Logger          *utils.Logger  // Logger instance
	Proxy           *utils.Proxy   // Proxy configuration
	Mode            string         // Transport mode (Abridged, Intermediate, Full)
	Ipv6            bool           // Prefer IPv6 connections
	CustomHost      bool           // Use custom ServerHost instead of DC lookup
	LocalAddr       string         // Local address to bind (IP:port)
	Timeout         int            // TCP connection timeout (seconds)
	ReqTimeout      int            // RPC request timeout (seconds)
	UseWebSocket    bool           // Use WebSocket transport
	UseWebSocketTLS bool           // Use secure WebSocket (wss://)

	MaxReconnectAttempts int           // Max reconnection attempts (default: 2000)
	BaseReconnectDelay   time.Duration // Initial reconnect delay (default: 2s)
	MaxReconnectDelay    time.Duration // Maximum reconnect delay (default: 15m)

	OnMigration func() // Called after DC migration completes
}

type ErrResponseCode

type ErrResponseCode struct {
	Code           int64
	Message        string
	Description    string
	AdditionalInfo any // some errors has additional data like timeout seconds, dc id etc.
}

func (*ErrResponseCode) Error

func (e *ErrResponseCode) Error() string

type MTProto

type MTProto struct {
	Addr atomic.Value

	DcList *utils.DCOptions

	IpV6 bool

	Logger *utils.Logger
	// contains filtered or unexported fields
}

func NewMTProto

func NewMTProto(c Config) (*MTProto, error)

func (*MTProto) AddCustomServerRequestHandler

func (m *MTProto) AddCustomServerRequestHandler(handler func(i any) bool)

func (*MTProto) AppID

func (m *MTProto) AppID() int32

func (*MTProto) CreateConnection

func (m *MTProto) CreateConnection(withLog bool) error

func (*MTProto) DeleteSession

func (m *MTProto) DeleteSession() (err error)

func (*MTProto) Disconnect

func (m *MTProto) Disconnect() error

func (*MTProto) ExportAuth

func (m *MTProto) ExportAuth() (*session.Session, int)

func (*MTProto) ExportNewSender

func (m *MTProto) ExportNewSender(dcID int, mem bool, cdn ...bool) (*MTProto, error)

func (*MTProto) GetAddr added in v1.7.0

func (m *MTProto) GetAddr() string

func (*MTProto) GetAuthKey

func (m *MTProto) GetAuthKey() []byte

GetAuthKey returns the current auth key used for message encryption.

func (*MTProto) GetDC

func (m *MTProto) GetDC() int

func (*MTProto) GetSeqNo

func (m *MTProto) GetSeqNo() int32

GetSeqNo returns seqno

func (*MTProto) GetServerSalt

func (m *MTProto) GetServerSalt() int64

GetServerSalt returns current server salt

func (*MTProto) GetSessionID

func (m *MTProto) GetSessionID() int64

func (*MTProto) GetTransportType added in v1.6.7

func (m *MTProto) GetTransportType() string

func (*MTProto) HasCdnKey added in v1.4.8

func (m *MTProto) HasCdnKey(dc int32) (*rsa.PublicKey, bool)

func (*MTProto) ImportAuth

func (m *MTProto) ImportAuth(stringSession string) (bool, error)

func (*MTProto) ImportRawAuth

func (m *MTProto) ImportRawAuth(authKey, authKeyHash []byte, addr string, appID int32) (bool, error)

func (*MTProto) InvokeRequestWithoutUpdate

func (m *MTProto) InvokeRequestWithoutUpdate(data tl.Object, expectedTypes ...reflect.Type) error

func (*MTProto) IsTcpActive added in v1.6.0

func (m *MTProto) IsTcpActive() bool

func (*MTProto) LoadSession

func (m *MTProto) LoadSession(sess *session.Session) error

func (*MTProto) MakeRequest

func (m *MTProto) MakeRequest(msg tl.Object) (any, error)

func (*MTProto) MakeRequestCtx added in v1.3.21

func (m *MTProto) MakeRequestCtx(ctx context.Context, msg tl.Object) (any, error)

func (*MTProto) MakeRequestWithHintToDecoder

func (m *MTProto) MakeRequestWithHintToDecoder(msg tl.Object, expectedTypes ...reflect.Type) (any, error)

func (*MTProto) Ping

func (m *MTProto) Ping() time.Duration

func (*MTProto) Reconnect

func (m *MTProto) Reconnect(loggy bool) error

func (*MTProto) SaveSession

func (m *MTProto) SaveSession(mem bool) (err error)

func (*MTProto) SetAddr added in v1.7.0

func (m *MTProto) SetAddr(addr string)

func (*MTProto) SetAppID

func (m *MTProto) SetAppID(appID int32)

func (*MTProto) SetAuthKey

func (m *MTProto) SetAuthKey(key []byte)

func (*MTProto) SetCdnKeys added in v1.4.8

func (m *MTProto) SetCdnKeys(keys map[int32]*rsa.PublicKey)

func (*MTProto) SetTerminated added in v1.6.1

func (m *MTProto) SetTerminated(val bool)

func (*MTProto) SwitchDc

func (m *MTProto) SwitchDc(dc int) error

func (*MTProto) TcpState added in v1.6.0

func (m *MTProto) TcpState() *TcpState

func (*MTProto) Terminate

func (m *MTProto) Terminate() error

func (*MTProto) UpdateSeqNo

func (m *MTProto) UpdateSeqNo() int32

type TcpState added in v1.6.0

type TcpState struct {
	// contains filtered or unexported fields
}

TcpState represents a simple concurrency-safe state machine that can be either active or inactive. When the state becomes active, all goroutines waiting on WaitForActive() are released (via channel close). When the state becomes inactive again, a new channel is created for future waits.

func NewTcpState added in v1.6.0

func NewTcpState() *TcpState

func (*TcpState) GetActive added in v1.6.3

func (m *TcpState) GetActive() bool

GetActive safely returns the current active flag. It can be called concurrently with other methods.

func (*TcpState) SetActive added in v1.6.0

func (m *TcpState) SetActive(active bool)

SetActive updates the active flag. - If switching from false → true, the channel is closed to notify all waiters. - If switching from true → false, a new channel is created for future waits.

func (*TcpState) WaitForActive added in v1.6.0

func (m *TcpState) WaitForActive(ctx context.Context) error

WaitForActive blocks until the TcpState becomes active or until the provided context is canceled. Returns nil when the state is active, or ctx.Err() if canceled.

Directories

Path Synopsis
examples
auth command
bot command
broadcast command
buttons command
cache command
contextstore command
conversation command
download command
e2e command
fileid command
filters command
getchats command
gifts command
inline command
logger command
mtproxy command
multiple command
pfs command
progress command
proxy command
qrlogin command
react command
rtmp command
sessions/string command
sessions/tdata command
simple command
stars command
internal
cmd/tlgen module
e2e

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL