парсер
This commit is contained in:
76
tg_parser/pkg/telegram/telegram.go
Normal file
76
tg_parser/pkg/telegram/telegram.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package telegram
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"github.com/gotd/td/session"
|
||||
"github.com/gotd/td/telegram"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
ApiID int `envconfig:"TELEGRAM__API_ID" required:"true"`
|
||||
ApiHash string `envconfig:"TELEGRAM__API_HASH" required:"true"`
|
||||
SessionFile string `envconfig:"TELEGRAM__SESSION_FILE" required:"true"`
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
*telegram.Client
|
||||
cancel context.CancelFunc
|
||||
done chan struct{}
|
||||
}
|
||||
|
||||
func New(cfg Config) (*Client, error) {
|
||||
ctx := context.Background()
|
||||
|
||||
tg := telegram.NewClient(cfg.ApiID, cfg.ApiHash, telegram.Options{
|
||||
SessionStorage: &session.FileStorage{Path: cfg.SessionFile},
|
||||
})
|
||||
|
||||
runCtx, cancel := context.WithCancel(ctx)
|
||||
|
||||
ready := make(chan struct{})
|
||||
done := make(chan struct{})
|
||||
|
||||
client := &Client{
|
||||
Client: tg,
|
||||
cancel: cancel,
|
||||
done: done,
|
||||
}
|
||||
|
||||
go func() {
|
||||
err := tg.Run(runCtx, func(ctx context.Context) error {
|
||||
status, err := tg.Auth().Status(ctx)
|
||||
if err != nil {
|
||||
close(ready)
|
||||
return fmt.Errorf("telegram.Auth error: %w", err)
|
||||
}
|
||||
if !status.Authorized {
|
||||
close(ready)
|
||||
return fmt.Errorf("session not authorized")
|
||||
}
|
||||
|
||||
close(ready)
|
||||
|
||||
<-ctx.Done()
|
||||
return ctx.Err()
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("telegram client stopped")
|
||||
}
|
||||
|
||||
close(done)
|
||||
}()
|
||||
|
||||
<-ready
|
||||
|
||||
return client, nil
|
||||
}
|
||||
|
||||
func (c *Client) Close() {
|
||||
c.cancel()
|
||||
<-c.done
|
||||
}
|
||||
Reference in New Issue
Block a user