feature: архитектура v2 — api + очередь + worker, удержание окна браузера (#78)
- Сервис api (FastAPI, без Chrome): POST /v2/tasks, GET /v2/tasks/{id} (доступ по cookie
сессии), DELETE /v2/sessions/current; /v1/solve — прежний контракт поверх очереди.
- Сервис worker (dramatiq + RabbitMQ): слоты браузера, окна сессий между задачами
(browser_idle_timeout 0–120 мин, простой — TTL ключа в Redis), heartbeat.
- Маршрутизация задач сессии в персональную очередь воркера с открытым окном.
- Redis: задачи, результаты (RESULT_TTL_HOURS), окна, воркеры. Прокси и ключ 2captcha
в Redis не сохраняются.
- Движок: AsyncStealthySession.run() — действия на текущей странице без навигации.
- Два образа (robotex-api, robotex-worker), compose с rabbitmq и redis,
make up/down/logs/smoke, релиз собирает все образы.
- Тесты: api + worker в одном процессе (fakeredis), настоящий воркер dramatiq на
StubBroker, браузерные тесты на новой схеме, smoke для запущенного стенда.
- Документация: README, API (v2), Deployment, Usage.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
fe509c25c3
commit
7b511d5d38
38 files changed
+2142
-545
No files matched your search
+19
-4
@@ -46,14 +46,29 @@ UA в ответе может измениться, когда на сервер
|
||||
localStorage, отпечаток), и повторно проходить антибот обычно не нужно — запрос заметно быстрее.
|
||||
- Одна сессия — один «человек»: держите для неё **один и тот же прокси**. Смена exit-IP внутри сессии выглядит
|
||||
подозрительно и обнуляет `cf_clearance`.
|
||||
- Не отправляйте два запроса одной сессии одновременно: профиль Chrome занят первым запросом.
|
||||
- Задачи одной сессии выполняются по очереди: вторая ждёт, пока закончится первая.
|
||||
- Для параллельной работы заводите несколько сессий, каждую со своим прокси.
|
||||
|
||||
## Синхронно или через задачи
|
||||
|
||||
- `/v1/solve` — проще: один запрос, один ответ. Держите соединение открытым до 3–4 минут (см. «Таймауты»).
|
||||
- `/v2/tasks` — запрос возвращается сразу, результат забираете по ссылке `GET /v2/tasks/{id}` с той же cookie
|
||||
`session_id`. Подходит, когда соединение нельзя держать долго, и для многошаговых сценариев.
|
||||
|
||||
Многошаговый сценарий (войти, затем несколько раз что-то сделать на сайте) — с удержанием окна:
|
||||
|
||||
1. `POST /v2/tasks` с `url` и `browser_idle_timeout`: окно останется открытым на это число минут простоя.
|
||||
2. Следующие задачи с той же cookie `session_id` и тем же `proxy` выполняются в открытом окне: без запуска Chrome
|
||||
и повторного антибота. Без `url` — на текущей странице.
|
||||
3. В конце — `DELETE /v2/sessions/current` или задача с `browser_idle_timeout: 0`: окно закроется и освободит слот.
|
||||
|
||||
Открытое окно занимает слот браузера, поэтому ставьте простой не больше, чем пауза между вашими шагами.
|
||||
|
||||
## Cookies
|
||||
|
||||
- Переданные в запросе `cookies` **заменяют** cookies профиля целиком. Не передали — профиль сохраняет свои.
|
||||
- Для постоянных cookies указывайте `expires` (unix-время). Cookie без `expires` — сессионная и пропадёт между
|
||||
запросами, потому что браузер перезапускается на каждый запрос.
|
||||
- Для постоянных cookies указывайте `expires` (unix-время). Cookie без `expires` — сессионная и пропадёт, как
|
||||
только закроется окно браузера (после задачи без `browser_idle_timeout`).
|
||||
- Обычно передавать cookies не нужно: профиль сам хранит то, что выдал сайт. Передавайте, только если сайт ведёт
|
||||
себя по-разному в зависимости от cookies (например, авторизация, полученная вне Robotex).
|
||||
|
||||
@@ -61,7 +76,7 @@ UA в ответе может измениться, когда на сервер
|
||||
|
||||
| Ответ | Что делать |
|
||||
|---|---|
|
||||
| `503`, `code: no_slots` | все браузеры заняты — повторить через `Retry-After` секунд |
|
||||
| `503`, `code: no_slots` | `/v1/solve`: все браузеры заняты — повторить через `Retry-After` секунд. Задачи v2 в этом случае ждут в очереди |
|
||||
| `challenge_failed` | антибот не пройден за отведённое время: повторить в той же сессии; при повторных неудачах — сменить прокси (и сессию) |
|
||||
| `action_failed` | упало действие: смотрите `error` и `actions[].result`; для отладки повторите с `"screenshot": true` |
|
||||
| `request_failed` | навигация не удалась: обычно прокси недоступен или сайт не отвечает |
|
||||
|
||||
Reference in new issue
Block a user