fix(admin): кнопка «Проверить документацию» возвращает на /admin/news + браузерный UA для nsd.ru
Три бага в Doc-watcher / Новостях, всплывшие при первом ручном прогоне:
1. setupFlash после POST в /admin/news/check-docs редиректил на
/admin/setup, а не на /admin/news, и оператор «выпадал» с ленты.
Теперь setupFlash смотрит Referer и возвращает на любой из
/admin/wizard, /admin/news, /admin/setup — на ту страницу с которой
пришёл POST.
2. http.DefaultClient в news.go и cacerts.go подхватывал HTTPS_PROXY
из окружения и шёл через корпоративный zetit, который блокирует
nsd.ru (CONNECT 403). Заменил на noProxyClient с явно отключённой
проксификацией (Transport.Proxy = nil) — doc-watcher всегда идёт
напрямую, независимо от ENV.
3. nsd.ru отдаёт 403 на запросы с UA «bj-server/1.0» (антибот). Заменил
на стандартный Chrome User-Agent + браузерные Accept/Accept-Language.
После этого moex-most-dlya-m2m.pdf найден и скачан, новость
«Обновлена документация» опубликована.
Кроме того, по запросу — убрана форма «Добавить вручную» с /admin/news.
В UI остался только мониторинг: автоматическая лента событий +
ручная кнопка «🔄 Проверить обновления документации сейчас».
Handler /admin/news/add сохранён в коде на случай ручного ввода
инцидентов в будущем.
This commit is contained in:
@@ -50,6 +50,18 @@ func EnsureDocSources(rc *RuntimeConfig) {
|
||||
// pdfHrefRe — ищет в HTML href'ы, заканчивающиеся на .pdf (case-insensitive).
|
||||
var pdfHrefRe = regexp.MustCompile(`(?i)href="([^"]+\.pdf)"`)
|
||||
|
||||
// noProxyClient — HTTP-клиент, который игнорирует переменные окружения
|
||||
// HTTPS_PROXY / HTTP_PROXY. Корпоративный прокси zetit блокирует
|
||||
// nsd.ru — поэтому doc-watcher ходит на внешние сайты НРД напрямую.
|
||||
// Transport.Proxy = nil отключает любую проксификацию (включая
|
||||
// автодетект через env).
|
||||
var noProxyClient = &http.Client{
|
||||
Timeout: 90 * time.Second,
|
||||
Transport: &http.Transport{
|
||||
Proxy: nil,
|
||||
},
|
||||
}
|
||||
|
||||
// CheckDocSources обходит все DocSource из настроек, парсит HTML, ищет
|
||||
// новые PDF и скачивает их в DOC/. На каждое нововведение эмитирует
|
||||
// NewsItem типа "doc-update". Возвращает суммарную строку для лога.
|
||||
@@ -121,8 +133,10 @@ func fetchPDFLinks(ctx context.Context, pageURL string) ([]string, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("User-Agent", "bj-server/1.0 (doc-watcher)")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36")
|
||||
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
|
||||
req.Header.Set("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8")
|
||||
resp, err := noProxyClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -174,8 +188,10 @@ func checkPDF(ctx context.Context, pdfURL string, known map[string]string) (stri
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
req.Header.Set("User-Agent", "bj-server/1.0 (doc-watcher)")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36")
|
||||
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
|
||||
req.Header.Set("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8")
|
||||
resp, err := noProxyClient.Do(req)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
@@ -225,8 +241,10 @@ func downloadPDFToDOC(ctx context.Context, pdfURL string) (string, error) {
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
req.Header.Set("User-Agent", "bj-server/1.0 (doc-watcher)")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36")
|
||||
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
|
||||
req.Header.Set("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8")
|
||||
resp, err := noProxyClient.Do(req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user