FlareSolverr

0.4 NEW — универсальный обход Cloudflare/DDoS-Guard JS-челленджей с автокэшем сессий и опц. residential proxy.

FlareSolverr — это headless-Chrome за HTTP API, который рендерит сайт, проходит JS-проверку и возвращает финальный HTML + cookies + UserAgent. Lampac умеет:

  1. Глобально ходить через FlareSolverr для опт-ин балансеров и для JS-модулей с transport:"flaresolverr".
  2. Кэшировать cf_clearance / _ddg1 / прочие куки на 25 минут — после одного solve дальше летит обычный uTLS-Chrome (миллисекунды вместо 10–15 секунд).
  3. Совмещать с residential SOCKS5 — Chrome внутри FlareSolverr дойдёт до сайта через ваш прокси, обходя одновременно JS-челлендж и геоблок.

Запуск самого FlareSolverr

docker run -d --restart=always \
  --name=flaresolverr \
  -p 127.0.0.1:8191:8191 \
  -e LOG_LEVEL=info \
  ghcr.io/flaresolverr/flaresolverr:latest

Конфигурация в lampac

[online]
flaresolverr = "http://127.0.0.1:8191"
flaresolverr_balancers = ["kinogo", "vdbmovies", "kinobase", "redheadsound"]

flaresolverr_balancers — список opt-in балансеров и JS-модулей. Если балансер в списке — все его CF-fetch’и пойдут через FlareSolverr; если нет — стандартный путь без него. Можно править на лету через admin API, без перезапуска.

Совмещение с residential SOCKS5

Если для того же балансера зарегистрирован SOCKS5 (через [[proxy.direct.entries]] с balancers=["..."], или через VLESS-pool), Lampac автоматически передаёт его в FlareSolverr — Chrome дёрнет сайт через прокси.

[online]
flaresolverr = "http://127.0.0.1:8191"
flaresolverr_balancers = ["redheadsound"]

[[proxy.direct.entries]]
uri = "socks5://ua-residential.example.com:1080"
balancers = ["redheadsound"]

Получится: lampac → FlareSolverr → Chrome → SOCKS5 (UA residential) → upstream. Один round-trip, JS-челлендж пройден, IP — украинский.

Использование в JS-модулях

var res = http.get('https://target.example/page', {
  transport: 'flaresolverr',
  // proxy:    'socks5://1.2.3.4:1080',  // опц. явный override
  // balancer: 'mymodule',                // опц. — имя из реестра прокси
  timeout: 60                              // FlareSolverr медленный
});
if (res.ok) {
  console.log('html', res.text.length, 'bytes');
  console.log('cookies', res.cookies);     // cf_clearance + sessions
}

Если глобальный flaresolverr URL пуст или модуль не в flaresolverr_balancersForce=true не задан), ветка transport:'flaresolverr' тихо падает на обычный клиент — поведение деградирует, ошибок не вылетает.

Кэш сессий

После одного успешного solve FlareSolverr-результат (cookies + UA) кладётся в in-memory кэш по host. Следующие 25 минут запросы к тому же хосту идут без FlareSolverr — обычным uTLS-клиентом с подгруженными cookies. Если CDN ротировал challenge (403/503) — кэш инвалидируется, делается новый solve.

Эту логику дёргает любой Go-балансер парой строк:

import "lampac-go/internal/httpclient"

client, sess, ok := httpclient.FlareSolverrSessionClient(ctx, "kinogo", url, nil)
if ok {
  resp, _ := client.Do(req)   // с cf_clearance, без FlareSolverr
}

Admin API

Есть live-эндпойнт для редактирования URL/балансеров и просмотра кэша.

Получить состояние

curl -H 'Cookie: lampac_token=...' \
  https://your-lampac.example/admin/api/flaresolverr

Ответ:

{
  "url": "http://127.0.0.1:8191",
  "balancers": ["kinogo","redheadsound"],
  "sessions": [
    {"host":"kinogo.fm","user_agent":"Mozilla/5.0...",
     "solved_at_unix": 1745605200, "expires_at_unix": 1745606700}
  ]
}

Изменить URL и список балансеров

curl -X PUT -H 'Cookie: lampac_token=...' \
  -d '{"url":"http://127.0.0.1:8191","balancers":["kinogo","vdbmovies"]}' \
  https://your-lampac.example/admin/api/flaresolverr

Применяется немедленно к runtime-реестру. Также синхронизируется в live-конфиг (serverRef.cfgPtr), чтобы следующее сохранение из редактора TOML записало новый список на диск.

Сбросить кэш для одного хоста

curl -X DELETE -H 'Cookie: lampac_token=...' \
  'https://your-lampac.example/admin/api/flaresolverr?host=kinogo.fm'

После этого следующий запрос к kinogo.fm снова пойдёт через FlareSolverr (для отладки).

Когда FlareSolverr не нужен

  • Сайты без JS-челленджа — обычный uTLS+SOCKS5 справляется быстрее.
  • Геоблок без anti-bot — достаточно transport:"utls-socks5" с residential прокси.
  • TSPU на YouTube CDN — здесь работает zapret на kernel-уровне, FlareSolverr не нужен.

Лимиты

  • Один FlareSolverr-solve занимает 5–15 секунд (Chrome старт + JS-челлендж).
  • Контейнер ест ~300–500 МБ RAM (один Chrome instance).
  • Для нагруженных сетапов запускайте несколько контейнеров за reverse-proxy с round-robin.