81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gotd/td/session"
|
|
"github.com/gotd/td/telegram"
|
|
"github.com/gotd/td/telegram/auth"
|
|
"github.com/gotd/td/tg"
|
|
)
|
|
|
|
func main() {
|
|
apiID := mustEnvInt("TELEGRAM__API_ID")
|
|
apiHash := mustEnv("TELEGRAM__API_HASH")
|
|
sessionFile := mustEnv("TELEGRAM__SESSION_FILE")
|
|
|
|
phone := strings.TrimSpace(os.Getenv("TELEGRAM__PHONE"))
|
|
if phone == "" {
|
|
phone = prompt("Phone (e.g. +79991234567): ")
|
|
}
|
|
|
|
password := strings.TrimSpace(os.Getenv("TELEGRAM__PASSWORD"))
|
|
if password == "" {
|
|
password = prompt("2FA password (empty if not set): ")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
client := telegram.NewClient(apiID, apiHash, telegram.Options{
|
|
SessionStorage: &session.FileStorage{Path: sessionFile},
|
|
})
|
|
|
|
err := client.Run(ctx, func(ctx context.Context) error {
|
|
return client.Auth().IfNecessary(ctx, auth.NewFlow(
|
|
auth.Constant(phone, password, auth.CodeAuthenticatorFunc(
|
|
func(ctx context.Context, sentCode *tg.AuthSentCode) (string, error) {
|
|
return prompt("Enter code: "), nil
|
|
},
|
|
)),
|
|
auth.SendCodeOptions{},
|
|
))
|
|
})
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "auth failed: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Println("✓ Authorized")
|
|
}
|
|
|
|
func mustEnv(key string) string {
|
|
value := strings.TrimSpace(os.Getenv(key))
|
|
if value == "" {
|
|
fmt.Fprintf(os.Stderr, "missing required env: %s\n", key)
|
|
os.Exit(1)
|
|
}
|
|
return value
|
|
}
|
|
|
|
func mustEnvInt(key string) int {
|
|
raw := mustEnv(key)
|
|
v, err := strconv.Atoi(raw)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "invalid int in %s: %v\n", key, err)
|
|
os.Exit(1)
|
|
}
|
|
return v
|
|
}
|
|
|
|
func prompt(label string) string {
|
|
fmt.Print(label)
|
|
reader := bufio.NewReader(os.Stdin)
|
|
value, _ := reader.ReadString('\n')
|
|
return strings.TrimSpace(value)
|
|
}
|