feat: Robotex landing on robotex.sokolab.xyz and announcement post

- projects section: standalone landing template and styles, served on a
  subdomain by the ingress Caddy (project) snippet
- Robotex landing in RU/EN, links to Redmine forum/issues
- blog post: Robotex is now a free service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
protokeyandClaude Opus 5.5 committed 2026-10-11 00:53:09 +04:00
1 parent bb26176277
commit e9748e1949
8 files changed
+552

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
---
title: "Projects"
build:
render: never
list: never
---
+6
View File
@@ -0,0 +1,6 @@
---
title: "Проекты"
build:
render: never
list: never
---
+104
View File
@@ -0,0 +1,104 @@
---
title: "Robotex"
tagline: "A browser for your bots, over an API"
description: "Robotex gets past anti-bot protection, runs a scenario on the page and hands your bot the cookies. From there the bot works with plain HTTP requests."
domain: "https://robotex.sokolab.xyz/"
badge: "Free · early access"
post: "/blog/robotex-browser-automation-api"
postLabel: "How Robotex works"
build:
list: never
sitemap:
disable: true
nav:
- { label: "Features", href: "#features" }
- { label: "How it works", href: "#how" }
- { label: "Community", href: "#community" }
cta:
- { label: "Request access", href: "https://redmine.sokolab.xyz/account/register", primary: true }
- { label: "How it works", href: "#how" }
problem:
title: "Why you need it"
lead: "Every website bot sooner or later runs into one of three problems:"
items:
- "a captcha"
- "anti-bot protection"
- "heavy JS that has to be rendered to submit a form"
text: "A spider built on raw HTTP requests is helpless here, you need a real browser. But a browser is heavy, it has to be hidden from detection and kept next to the bot. Robotex takes that job over: the browser is used only where there's no way around it."
features:
title: "Features"
items:
- title: "Scenarios"
text: "More than opening a page. Fill a form, click, move the mouse, wait for an element, grab a piece of HTML."
- title: "Anti-bot pages"
text: "Detects a Cloudflare check before and during a scenario and gets through it. If it escalates to an image captcha, sends it to a recognition service."
- title: "Captcha"
text: "The `captcha` step solves hCaptcha and other captchas via 2captcha before the form is submitted."
- title: "Profiles"
text: "Cookies, local storage and the browser fingerprint live in one profile. Locale and timezone match the proxy's geo. To the site it's still the same user."
- title: "Real Chrome"
text: "Chrome driven by Patchright, without the CDP leaks anti-bots use to detect automation."
- title: "Any language"
text: "It's a service, not a library. Your bot only needs an HTTP client, whatever it's written in."
how:
title: "How it works"
steps:
- "The bot sends a URL, an action scenario and its proxy to `POST /v1/solve`."
- "Robotex opens the page, passes the checks and runs the scenario. The browser profile is saved and returned in the `session_id` cookie."
- "The bot gets the cookies and User-Agent and keeps browsing on its own, **through the same proxy**. When it needs a browser again, it sends `session_id` and continues in the same profile."
code:
- caption: "Request"
body: |
POST /v1/solve
X-API-Key: <key>
{
"url": "https://example.com/login",
"actions": [
{"type": "fill", "selector": "#email", "value": "user@example.com"},
{"type": "fill", "selector": "#password", "value": "..."},
{"type": "click", "selector": "#submit"},
{"type": "wait_for", "selector": ".dashboard", "timeout": 30}
],
"proxy": "socks5://user:pass@host:port"
}
- caption: "Response"
body: |
{
"status": "ok",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
"cookies": [
{"name": "sessionid", "value": "...", "domain": ".example.com"}
],
"actions": [
{"type": "fill", "ok": true},
{"type": "fill", "ok": true},
{"type": "click", "ok": true},
{"type": "wait_for", "ok": true}
]
}
limits:
title: "Where it stands, honestly"
items:
- "**It's an early MVP.** I grant access manually, and the API may change."
- "**It's free.** You only pay for your own proxies and, if needed, 2captcha."
- "Proxy quality matters a lot: no fingerprint will help on a dirty IP."
- "Turnstile doesn't pass on every site yet, I'm working on stability."
community:
title: "Community"
lead: "Questions, ideas and bugs go to Redmine. Sign-up uses manual activation: register and I'll approve your account."
links:
- { title: "Forum", text: "Questions, ideas and scenario discussions.", href: "https://redmine.sokolab.xyz/projects/robotex/boards" }
- { title: "Bugs and requests", text: "Something broke or a feature is missing.", href: "https://redmine.sokolab.xyz/projects/robotex/issues" }
- { title: "Telegram", text: "Message me directly.", href: "https://t.me/xs0k0lx" }
- { title: "Source code", text: "The service code in my Gitea.", href: "https://git.sokolab.xyz/s0k0l/robotex" }
footer: "Use Robotex only on sites where you have the right to do so."
---
+104
View File
@@ -0,0 +1,104 @@
---
title: "Robotex"
tagline: "Браузер для ваших ботов по API"
description: "Robotex проходит анти-бот защиту, выполняет сценарий на странице и отдает боту куки. Дальше бот работает обычными HTTP запросами."
domain: "https://robotex.sokolab.xyz/"
badge: "Бесплатно · ранний доступ"
post: "/blog/robotex-browser-automation-api"
postLabel: "Как устроен Robotex"
build:
list: never
sitemap:
disable: true
nav:
- { label: "Возможности", href: "#features" }
- { label: "Как работает", href: "#how" }
- { label: "Сообщество", href: "#community" }
cta:
- { label: "Запросить доступ", href: "https://redmine.sokolab.xyz/account/register", primary: true }
- { label: "Как это работает", href: "#how" }
problem:
title: "Зачем это нужно"
lead: "Каждый бот под сайт рано или поздно упирается в одну из трех проблем:"
items:
- "капча"
- "анти-бот защита"
- "сложный JS, который нужно отрендерить, чтобы отправить форму"
text: "Паук на сырых HTTP запросах тут бессилен, нужен настоящий браузер. Но браузер тяжелый, его нужно прятать от детекта и держать рядом с ботом. Robotex берет эту работу на себя: браузер включается только там, где без него никак."
features:
title: "Возможности"
items:
- title: "Сценарии"
text: "Не просто открыть страницу. Заполнить форму, кликнуть, навести мышь, дождаться элемента, забрать кусок HTML."
- title: "Анти-бот страницы"
text: "Сам находит проверку Cloudflare до и во время сценария и проходит ее. Если она переросла в капчу с картинками, отправляет в сервис распознавания."
- title: "Капча"
text: "Шаг `captcha` в сценарии решает hCaptcha и другие капчи через 2captcha до отправки формы."
- title: "Профили"
text: "Куки, local storage и отпечаток браузера живут в одном профиле. Локаль и часовой пояс подбираются под гео прокси. Для сайта это все тот же пользователь."
- title: "Настоящий Chrome"
text: "Chrome под управлением Patchright, без утечек CDP, по которым анти-боты узнают автоматизацию."
- title: "Любой язык"
text: "Это сервис, а не библиотека. Боту нужен только HTTP клиент, на чем он написан, неважно."
how:
title: "Как это работает"
steps:
- "Бот отправляет в `POST /v1/solve` адрес, сценарий действий и свой прокси."
- "Robotex открывает страницу, проходит проверки и выполняет сценарий. Профиль браузера сохраняется и возвращается в куке `session_id`."
- "Бот получает куки и User-Agent и дальше ходит по сайту сам, **через тот же прокси**. Понадобится браузер снова, передаст `session_id` и продолжит в том же профиле."
code:
- caption: "Запрос"
body: |
POST /v1/solve
X-API-Key: <key>
{
"url": "https://example.com/login",
"actions": [
{"type": "fill", "selector": "#email", "value": "user@example.com"},
{"type": "fill", "selector": "#password", "value": "..."},
{"type": "click", "selector": "#submit"},
{"type": "wait_for", "selector": ".dashboard", "timeout": 30}
],
"proxy": "socks5://user:pass@host:port"
}
- caption: "Ответ"
body: |
{
"status": "ok",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
"cookies": [
{"name": "sessionid", "value": "...", "domain": ".example.com"}
],
"actions": [
{"type": "fill", "ok": true},
{"type": "fill", "ok": true},
{"type": "click", "ok": true},
{"type": "wait_for", "ok": true}
]
}
limits:
title: "Честно о текущем состоянии"
items:
- "**Это ранний MVP.** Доступ выдаю вручную, API может меняться."
- "**Бесплатно.** Платить нужно только за свои прокси и, если нужна, капчу в 2captcha."
- "Прокси решает многое: на грязном IP не поможет никакой отпечаток."
- "Turnstile проходит не на каждом сайте, над стабильностью работаю."
community:
title: "Сообщество"
lead: "Вопросы, идеи и баги принимаются в Redmine. Регистрация с ручной активацией: оставьте заявку, и я ее подтвержу."
links:
- { title: "Форум", text: "Вопросы, идеи и обсуждение сценариев.", href: "https://redmine.sokolab.xyz/projects/robotex/boards" }
- { title: "Баги и пожелания", text: "Что-то не работает или не хватает функции.", href: "https://redmine.sokolab.xyz/projects/robotex/issues" }
- { title: "Telegram", text: "Написать мне напрямую.", href: "https://t.me/xs0k0lx" }
- { title: "Исходники", text: "Код сервиса в моей Gitea.", href: "https://git.sokolab.xyz/s0k0l/robotex" }
footer: "Используйте Robotex только на сайтах, где у вас есть на это право."
---