Добавил прокси для Телеграм
This commit is contained in:
+28
-3
@@ -6,6 +6,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@@ -135,7 +136,11 @@ func runServe(args []string) error {
|
|||||||
if cfg.Telegram.Token == "" {
|
if cfg.Telegram.Token == "" {
|
||||||
return fmt.Errorf("telegram enabled, but token is empty")
|
return fmt.Errorf("telegram enabled, but token is empty")
|
||||||
}
|
}
|
||||||
api, terr := tgbotapi.NewBotAPI(cfg.Telegram.Token)
|
tgClient, perr := telegramHTTPClient(cfg.Telegram.Proxy)
|
||||||
|
if perr != nil {
|
||||||
|
return perr
|
||||||
|
}
|
||||||
|
api, terr := tgbotapi.NewBotAPIWithClient(cfg.Telegram.Token, tgbotapi.APIEndpoint, tgClient)
|
||||||
if terr != nil {
|
if terr != nil {
|
||||||
logger.Error("telegram bot disabled: cannot connect", "err", terr)
|
logger.Error("telegram bot disabled: cannot connect", "err", terr)
|
||||||
} else {
|
} else {
|
||||||
@@ -182,6 +187,24 @@ func runServe(args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// telegramHTTPClient собирает HTTP-клиент бота с опц. прокси. Таймаута уровня
|
||||||
|
// клиента нет намеренно — он порвал бы long-poll; вместо этого ограничиваем
|
||||||
|
// установление соединения (dial/TLS из DefaultTransport) и ожидание заголовков
|
||||||
|
// ответа с запасом над long-poll (30с в tgbot). Так мёртвый прокси не подвешивает
|
||||||
|
// ни отправку уведомлений, ни приёмный цикл навсегда — клиент переподключится.
|
||||||
|
func telegramHTTPClient(proxy string) (*http.Client, error) {
|
||||||
|
transport := http.DefaultTransport.(*http.Transport).Clone()
|
||||||
|
if proxy != "" {
|
||||||
|
proxyURL, err := url.Parse(proxy)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("telegram: parse proxy %q: %w", proxy, err)
|
||||||
|
}
|
||||||
|
transport.Proxy = http.ProxyURL(proxyURL)
|
||||||
|
}
|
||||||
|
transport.ResponseHeaderTimeout = 45 * time.Second
|
||||||
|
return &http.Client{Transport: transport}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// metadataProviders собирает включённые конфигом базы метаданных. Для
|
// metadataProviders собирает включённые конфигом базы метаданных. Для
|
||||||
// сериалов Jellyfin привычнее tvdbid, поэтому TVDB идёт первым.
|
// сериалов Jellyfin привычнее tvdbid, поэтому TVDB идёт первым.
|
||||||
func metadataProviders(cfg *config.Config) ([]metadata.Provider, error) {
|
func metadataProviders(cfg *config.Config) ([]metadata.Provider, error) {
|
||||||
@@ -197,7 +220,9 @@ func metadataProviders(cfg *config.Config) ([]metadata.Provider, error) {
|
|||||||
}
|
}
|
||||||
out = append(out, p)
|
out = append(out, p)
|
||||||
}
|
}
|
||||||
if cfg.Metadata.TVDB.Enabled {
|
// TVDB/TMDB включаются ключом: если enabled, но ключ пуст — тихо
|
||||||
|
// пропускаем (сервис стартует), а не падаем.
|
||||||
|
if cfg.Metadata.TVDB.Enabled && cfg.Metadata.TVDB.APIKey != "" {
|
||||||
p, err := metadata.NewTVDB(metadata.TVDBConfig{
|
p, err := metadata.NewTVDB(metadata.TVDBConfig{
|
||||||
APIKey: cfg.Metadata.TVDB.APIKey,
|
APIKey: cfg.Metadata.TVDB.APIKey,
|
||||||
Proxy: cfg.Metadata.TVDB.Proxy,
|
Proxy: cfg.Metadata.TVDB.Proxy,
|
||||||
@@ -208,7 +233,7 @@ func metadataProviders(cfg *config.Config) ([]metadata.Provider, error) {
|
|||||||
}
|
}
|
||||||
out = append(out, p)
|
out = append(out, p)
|
||||||
}
|
}
|
||||||
if cfg.Metadata.TMDB.Enabled {
|
if cfg.Metadata.TMDB.Enabled && cfg.Metadata.TMDB.APIKey != "" {
|
||||||
p, err := metadata.NewTMDB(metadata.TMDBConfig{
|
p, err := metadata.NewTMDB(metadata.TMDBConfig{
|
||||||
APIKey: cfg.Metadata.TMDB.APIKey,
|
APIKey: cfg.Metadata.TMDB.APIKey,
|
||||||
Proxy: cfg.Metadata.TMDB.Proxy,
|
Proxy: cfg.Metadata.TMDB.Proxy,
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ type Telegram struct {
|
|||||||
Token string `toml:"token"`
|
Token string `toml:"token"`
|
||||||
AllowedUserIDs []int64 `toml:"allowed_user_ids"`
|
AllowedUserIDs []int64 `toml:"allowed_user_ids"`
|
||||||
WebBaseURL string `toml:"web_base_url"` // для deep-link «открыть в вебе» (опц.)
|
WebBaseURL string `toml:"web_base_url"` // для deep-link «открыть в вебе» (опц.)
|
||||||
|
Proxy string `toml:"proxy"` // опц. HTTP-прокси для api.telegram.org
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTP — параметры веб-сервера.
|
// HTTP — параметры веб-сервера.
|
||||||
|
|||||||
@@ -24,7 +24,12 @@ func newHTTPClient(proxy string, timeout time.Duration) (*http.Client, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("metadata: parse proxy %q: %w", proxy, err)
|
return nil, fmt.Errorf("metadata: parse proxy %q: %w", proxy, err)
|
||||||
}
|
}
|
||||||
transport = &http.Transport{Proxy: http.ProxyURL(u)}
|
// Клонируем дефолтный транспорт (dial/TLS-таймауты, keep-alive), а не
|
||||||
|
// собираем голый — иначе при живом-но-залипшем прокси полагались бы
|
||||||
|
// только на общий Client.Timeout. Он остаётся верхней границей запроса.
|
||||||
|
t := http.DefaultTransport.(*http.Transport).Clone()
|
||||||
|
t.Proxy = http.ProxyURL(u)
|
||||||
|
transport = t
|
||||||
}
|
}
|
||||||
return &http.Client{Timeout: timeout, Transport: transport}, nil
|
return &http.Client{Timeout: timeout, Transport: transport}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user