td

package module
v0.15.1 Latest Latest
Warning

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

Go to latest
Published: Dec 27, 2020 License: MIT Imports: 0 Imported by: 2

README

td Go Reference codecov

Telegram client implementation in go.

Before using this library, read How Not To Get Banned guide.

Status

Work in progress. Only go1.15 is supported and no backward compatibility is provided.

Goal of this project is to implement Telegram client while providing building blocks for the other client or even server implementation without performance bottlenecks.

This project is fully non-commercial and not affiliated with any commercial organization (including Telegram LLC).

Features

  • Full MTProto 2.0 implementation in go
  • Code for Telegram types generated by ./cmd/gotdgen (based on gotd/tl parser)
  • Embedded official documentation
  • Pluggable session storage
  • Automatic re-connects with keepalive
  • Vendored Telegram public keys that are kept up-to-date
  • End-to-end and unit testing, fuzzing
  • No runtime reflection overhead
  • Secure PRNG used for crypto
  • 2FA support
  • MTProxy support

Example

You can see cmd/gotdecho for echo bot example.

Auth
User

You can use td/telegram/AuthFlow to simplify user authentication flow.

codePrompt := func(ctx context.Context) (string, error) {
    // NB: Use "golang.org/x/crypto/ssh/terminal" to prompt password.
    fmt.Print("Enter code: ")
    code, err := bufio.NewReader(os.Stdin).ReadString('\n')
    if err != nil {
        return "", err
    }
    return strings.TrimSpace(code), nil
}
// This will setup and perform authentication flow.
// If account does not require 2FA password, use telegram.CodeOnlyAuth
// instead of telegram.ConstantAuth.
if err := telegram.NewAuth(
    telegram.ConstantAuth(phone, password, telegram.CodeAuthenticatorFunc(codePrompt)),
    telegram.SendCodeOptions{},
).Run(ctx, client); err != nil {
    panic(err)
}
Bot

Use bot token from @BotFather.

if err := client.AuthBot(ctx, "token:12345"); err != nil {
    panic(err)
}
Calling MTProto directly

You can use generated tg.Client that allows calling any MTProto methods directly.

// Grab these from https://my.telegram.org/apps.
// Never share it or hardcode!
client := telegram.NewClient(appID, appHash, telegram.Options{})
if err := client.Connect(ctx); != nil {
    panic(err)
}
// Grab token from @BotFather.
if err := client.AuthBot(ctx, "token:12345"); err != nil {
    panic(err)
}
// updates.getState#edd4882a
state, err := tg.NewClient(client).UpdatesGetState(ctx, &tg.UpdatesGetStateRequest{})
if err != nil {
    panic(err)
}
// Got state: &{Pts:197 Qts:0 Date:1606855030 Seq:1 UnreadCount:106}
Generated code

Code output of gotdgen contains references to TL types, examples, URL to official documentation and extracted comments from it.

For example, the auth.Authorization type in tg/tl_auth_authorization_gen.go:

// AuthAuthorizationClass represents auth.Authorization generic type.
//
// See https://core.telegram.org/type/auth.Authorization for reference.
//
// Example:
//  g, err := DecodeAuthAuthorization(buf)
//  if err != nil {
//      panic(err)
//  }
//  switch v := g.(type) {
//  case *AuthAuthorization: // auth.authorization#cd050916
//  case *AuthAuthorizationSignUpRequired: // auth.authorizationSignUpRequired#44747e9a
//  default: panic(v)
//  }
type AuthAuthorizationClass interface {
	bin.Encoder
	bin.Decoder
	construct() AuthAuthorizationClass
}

Also, the corresponding auth.signIn method:

// AuthSignIn invokes method auth.signIn#bcd51581 returning error if any.
// Signs in a user with a validated phone number.
//
// See https://core.telegram.org/method/auth.signIn for reference.
func (c *Client) AuthSignIn(ctx context.Context, request *AuthSignInRequest) (AuthAuthorizationClass, error) {}

The generated constructors contain detailed official documentation, including links:

// FoldersDeleteFolderRequest represents TL type `folders.deleteFolder#1c295881`.
// Delete a peer folder¹
//
// Links:
//  1) https://core.telegram.org/api/folders#peer-folders
//
// See https://core.telegram.org/method/folders.deleteFolder for reference.
type FoldersDeleteFolderRequest struct {
    // Peer folder ID, for more info click here¹
    //
    // Links:
    //  1) https://core.telegram.org/api/folders#peer-folders
    FolderID int
}

Contributions

Huge thanks to every contributor, dealing with a project of such scale is impossible alone.

Special thanks:

  • tdakkota
    • Two-factor authentication (SRP)
    • Proxy support
    • Update dispatcher
    • Complete transport support (abridged, padded intermediate and full)
    • Telegram server for end-to-end testing
    • Multiple major refactorings, including critical cryptographical scope reduction
    • Code generation improvements (vector support, multiple modes for pretty-print)
    • And many other cool things and performance improvements
  • zweihander
    • Background pings
    • Links in generated documentation
    • Message acknowledgements
    • Retries
    • RPC Engine

Reference

The MTProto protocol description is hosted by Telegram.

Most important parts for client impelemtations:

Current implementation does not conform to security guidelines and should be used only as reference or for testing.

Prior art

License

MIT License

Created by Aleksandr (ernado) Razumov

2020

Documentation

Overview

Package td implements MTProto encoding and decoding.

Directories

Path Synopsis
Package bin implements binary serialization and deserialization for TL, providing Buffer that can decode and encode basic Type Language types.
Package bin implements binary serialization and deserialization for TL, providing Buffer that can decode and encode basic Type Language types.
cmd
dltl
Binary dltl fetches .tl schema from remote repo.
Binary dltl fetches .tl schema from remote repo.
gotdchats
Binary gotdchats implements chat list request example using testing server.
Binary gotdchats implements chat list request example using testing server.
gotdecho
Binary gotdecho provides example of Telegram echo bot.
Binary gotdecho provides example of Telegram echo bot.
gotdgen
Binary gotdgen generates go source code from TL schema.
Binary gotdgen generates go source code from TL schema.
mtprint
Binary mtprint pretty-prints MTProto message from binary file.
Binary mtprint pretty-prints MTProto message from binary file.
examples module
bg-run Module
gif-download Module
Package internal contains unexported implementation details of Telegram client.
Package internal contains unexported implementation details of Telegram client.
crypto
Package crypto implements cryptographical primitives for MTproto.
Package crypto implements cryptographical primitives for MTproto.
crypto/srp
Package srp contains implementation of Secure Remote Password protocol.
Package srp contains implementation of Secure Remote Password protocol.
gen
Package gen implements code generation from TL schema.
Package gen implements code generation from TL schema.
gen/example
Package td contains generated code from example schema and is used for codegen testing.
Package td contains generated code from example schema and is used for codegen testing.
gen/internal
Code generated for package internal by go-bindata DO NOT EDIT.
Code generated for package internal by go-bindata DO NOT EDIT.
mt
Package mt contains generated code based on mtproto schema.
Package mt contains generated code based on mtproto schema.
proto
Package proto implements MTProto 2.0 primitives.
Package proto implements MTProto 2.0 primitives.
proto/codec
Package codec contains MTProto transport encoding implementations.
Package codec contains MTProto transport encoding implementations.
testutil
Package testutil wraps helpers for testing.
Package testutil wraps helpers for testing.
tmap
Package tmap provides type mapping facility that maps type id to type name.
Package tmap provides type mapping facility that maps type id to type name.
Package telegram implements Telegram client.
Package telegram implements Telegram client.
internal
Code generated for package internal by go-bindata DO NOT EDIT.
Code generated for package internal by go-bindata DO NOT EDIT.
internal/e2etest
Package e2etest contains some helpers to make external E2E tests using Telegram staging server.
Package e2etest contains some helpers to make external E2E tests using Telegram staging server.
internal/exchange
Package exchange contains Telegram key exchange algorithm flows.
Package exchange contains Telegram key exchange algorithm flows.
internal/rpc
Package rpc implements rpc engine.
Package rpc implements rpc engine.
internal/tgtest
Package tgtest provides test Telegram server for end-to-end test.
Package tgtest provides test Telegram server for end-to-end test.
Package tg contains generated types from MTProto Telegram API.
Package tg contains generated types from MTProto Telegram API.
Package transport contains different MTProto transport implementations.
Package transport contains different MTProto transport implementations.

Jump to

Keyboard shortcuts

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