integration with CloakBrowser
This commit is contained in:
parent
b90fb85ab3
commit
f45b81aff1
6 changed files with 158 additions and 25 deletions
13
.env.example
13
.env.example
|
|
@ -15,6 +15,19 @@ TELEGRAM_HOME_CHANNEL=
|
||||||
BROWSER_URL=http://browser:9222
|
BROWSER_URL=http://browser:9222
|
||||||
BROWSER_VIEW_URL=
|
BROWSER_VIEW_URL=
|
||||||
|
|
||||||
|
# Browser engine for browser-use container:
|
||||||
|
# - chromium: default local Chromium
|
||||||
|
# - cloak: CloakBrowser stealth browser over the same CDP/noVNC pipeline
|
||||||
|
BROWSER_ENGINE=cloak
|
||||||
|
|
||||||
|
# CloakBrowser options are used only when BROWSER_ENGINE=cloak.
|
||||||
|
CLOAK_HEADLESS=false
|
||||||
|
CLOAK_HUMANIZE=true
|
||||||
|
CLOAK_HUMAN_PRESET=default
|
||||||
|
CLOAK_PROXY=
|
||||||
|
CLOAK_GEOIP=false
|
||||||
|
CLOAK_ARGS=
|
||||||
|
|
||||||
BROWSER_API_HOST=0.0.0.0
|
BROWSER_API_HOST=0.0.0.0
|
||||||
BROWSER_API_PORT=8088
|
BROWSER_API_PORT=8088
|
||||||
BROWSER_USE_RPC_URL=http://browser:8787/run
|
BROWSER_USE_RPC_URL=http://browser:8787/run
|
||||||
|
|
|
||||||
36
READ.md
36
READ.md
|
|
@ -14,6 +14,42 @@ docker compose logs tunnel
|
||||||
```
|
```
|
||||||
После команды логов листаешь терминал и ищешь ссылку https в рамке. Её вписываешь в переменную BROWSER_VIEW_URL.
|
После команды логов листаешь терминал и ищешь ссылку https в рамке. Её вписываешь в переменную BROWSER_VIEW_URL.
|
||||||
Чтобы увидеть действия агента, переходишь по данной сслыке и выбираешь vnc.html.
|
Чтобы увидеть действия агента, переходишь по данной сслыке и выбираешь vnc.html.
|
||||||
|
|
||||||
|
## Выбор браузера
|
||||||
|
|
||||||
|
Browser-use контейнер поддерживает два движка через одну и ту же CDP/noVNC схему:
|
||||||
|
|
||||||
|
```env
|
||||||
|
BROWSER_ENGINE=chromium
|
||||||
|
```
|
||||||
|
|
||||||
|
`chromium` — обычный локальный Chromium, используется по умолчанию.
|
||||||
|
|
||||||
|
```env
|
||||||
|
BROWSER_ENGINE=cloak
|
||||||
|
```
|
||||||
|
|
||||||
|
`cloak` — CloakBrowser stealth-режим для задач, где важны fingerprint,
|
||||||
|
WebGL/Canvas/OS/CDP-сигналы и антибот-проверки. Telegram live-логи, noVNC,
|
||||||
|
CDP-порт `9222` и browser-use RPC остаются теми же.
|
||||||
|
|
||||||
|
Дополнительные настройки CloakBrowser в `.env`:
|
||||||
|
|
||||||
|
```env
|
||||||
|
CLOAK_HEADLESS=false
|
||||||
|
CLOAK_HUMANIZE=true
|
||||||
|
CLOAK_HUMAN_PRESET=default
|
||||||
|
CLOAK_PROXY=
|
||||||
|
CLOAK_GEOIP=false
|
||||||
|
CLOAK_ARGS=
|
||||||
|
```
|
||||||
|
|
||||||
|
После смены `BROWSER_ENGINE` пересобери и перезапусти контейнеры:
|
||||||
|
|
||||||
|
```commandline
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
Далее в мессенджере просишь агента сделать что-то через tool browser-use.
|
Далее в мессенджере просишь агента сделать что-то через tool browser-use.
|
||||||
Во время выполнения Hermes будет обновлять одно progress-сообщение в Telegram:
|
Во время выполнения Hermes будет обновлять одно progress-сообщение в Telegram:
|
||||||
текущая страница, короткие действия, ошибки и просьба помочь, если замечена капча
|
текущая страница, короткие действия, ошибки и просьба помочь, если замечена капча
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
procps \
|
procps \
|
||||||
curl \
|
curl \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
fonts-freefont-ttf \
|
||||||
|
fonts-unifont \
|
||||||
|
fonts-ipafont-gothic \
|
||||||
|
fonts-wqy-zenhei \
|
||||||
|
fonts-tlwg-loma-otf \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|
@ -23,12 +29,16 @@ RUN mkdir -p /src/browser_data
|
||||||
|
|
||||||
RUN python3 -m pip install --no-cache-dir --break-system-packages \
|
RUN python3 -m pip install --no-cache-dir --break-system-packages \
|
||||||
"browser-use>=0.12.5" \
|
"browser-use>=0.12.5" \
|
||||||
"langchain-openai>=0.3.0"
|
"langchain-openai>=0.3.0" \
|
||||||
|
"cloakbrowser[geoip]>=0.3.0"
|
||||||
|
|
||||||
|
RUN python3 -m cloakbrowser install
|
||||||
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
COPY cloak_browser_launcher.py /src/cloak_browser_launcher.py
|
||||||
COPY browser_use_runner.py /src/browser_use_runner.py
|
COPY browser_use_runner.py /src/browser_use_runner.py
|
||||||
RUN chmod +x /entrypoint.sh
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
EXPOSE 6080 9222 8787
|
EXPOSE 6080 9222 8787
|
||||||
|
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
|
||||||
|
|
@ -614,7 +614,7 @@ async def run_browser_task(task, run_id=None):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.info("Creating Browser...")
|
logger.info("Creating Browser...")
|
||||||
_append_event(run_id, "setup", "Подключаюсь к Chromium через CDP.")
|
_append_event(run_id, "setup", "Подключаюсь к браузеру через CDP.")
|
||||||
browser = Browser(cdp_url=cdp_url)
|
browser = Browser(cdp_url=cdp_url)
|
||||||
logger.info("Browser created")
|
logger.info("Browser created")
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
|
|
|
||||||
62
browser_env/cloak_browser_launcher.py
Normal file
62
browser_env/cloak_browser_launcher.py
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
import asyncio
|
||||||
|
import os
|
||||||
|
import shlex
|
||||||
|
import signal
|
||||||
|
|
||||||
|
from cloakbrowser import launch_async
|
||||||
|
|
||||||
|
|
||||||
|
def _env_bool(name, default):
|
||||||
|
raw = os.getenv(name)
|
||||||
|
if raw is None:
|
||||||
|
return default
|
||||||
|
return raw.strip().lower() in {"1", "true", "yes", "on"}
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
debug_port = os.getenv("CHROME_LOCAL_DEBUG_PORT", "9223")
|
||||||
|
args = [
|
||||||
|
f"--remote-debugging-port={debug_port}",
|
||||||
|
"--remote-debugging-address=127.0.0.1",
|
||||||
|
"--remote-allow-origins=*",
|
||||||
|
"--window-size=1280,720",
|
||||||
|
"--no-sandbox",
|
||||||
|
"--disable-dev-shm-usage",
|
||||||
|
"--ozone-platform=x11",
|
||||||
|
]
|
||||||
|
extra_args = os.getenv("CLOAK_ARGS", "").strip()
|
||||||
|
if extra_args:
|
||||||
|
args.extend(shlex.split(extra_args))
|
||||||
|
|
||||||
|
launch_kwargs = {
|
||||||
|
"headless": _env_bool("CLOAK_HEADLESS", False),
|
||||||
|
"humanize": _env_bool("CLOAK_HUMANIZE", True),
|
||||||
|
"args": args,
|
||||||
|
}
|
||||||
|
|
||||||
|
if launch_kwargs["humanize"]:
|
||||||
|
launch_kwargs["human_preset"] = os.getenv("CLOAK_HUMAN_PRESET", "default")
|
||||||
|
|
||||||
|
proxy = os.getenv("CLOAK_PROXY", "").strip()
|
||||||
|
if proxy:
|
||||||
|
launch_kwargs["proxy"] = proxy
|
||||||
|
|
||||||
|
if _env_bool("CLOAK_GEOIP", False):
|
||||||
|
launch_kwargs["geoip"] = True
|
||||||
|
|
||||||
|
browser = await launch_async(**launch_kwargs)
|
||||||
|
print(f"CloakBrowser started on 127.0.0.1:{debug_port}", flush=True)
|
||||||
|
|
||||||
|
stop_event = asyncio.Event()
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
for sig in (signal.SIGINT, signal.SIGTERM):
|
||||||
|
loop.add_signal_handler(sig, stop_event.set)
|
||||||
|
|
||||||
|
try:
|
||||||
|
await stop_event.wait()
|
||||||
|
finally:
|
||||||
|
await browser.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main())
|
||||||
|
|
@ -11,6 +11,7 @@ CHROME_LOCAL_DEBUG_PORT="${CHROME_LOCAL_DEBUG_PORT:-9223}"
|
||||||
CHROME_PUBLIC_DEBUG_PORT="${CHROME_PUBLIC_DEBUG_PORT:-9222}"
|
CHROME_PUBLIC_DEBUG_PORT="${CHROME_PUBLIC_DEBUG_PORT:-9222}"
|
||||||
BROWSER_USE_RPC_PORT="${BROWSER_USE_RPC_PORT:-8787}"
|
BROWSER_USE_RPC_PORT="${BROWSER_USE_RPC_PORT:-8787}"
|
||||||
CHROME_PROFILE_DIR="${CHROME_PROFILE_DIR:-/src/browser_data}"
|
CHROME_PROFILE_DIR="${CHROME_PROFILE_DIR:-/src/browser_data}"
|
||||||
|
BROWSER_ENGINE="${BROWSER_ENGINE:-chromium}"
|
||||||
|
|
||||||
MAX_RESTARTS="${MAX_RESTARTS:-10}"
|
MAX_RESTARTS="${MAX_RESTARTS:-10}"
|
||||||
RESTART_WINDOW_SEC="${RESTART_WINDOW_SEC:-60}"
|
RESTART_WINDOW_SEC="${RESTART_WINDOW_SEC:-60}"
|
||||||
|
|
@ -147,26 +148,38 @@ while true; do
|
||||||
|
|
||||||
rm -f "${CHROME_PROFILE_DIR}/SingletonLock" "${CHROME_PROFILE_DIR}/SingletonCookie" "${CHROME_PROFILE_DIR}/SingletonSocket" 2>/dev/null || true
|
rm -f "${CHROME_PROFILE_DIR}/SingletonLock" "${CHROME_PROFILE_DIR}/SingletonCookie" "${CHROME_PROFILE_DIR}/SingletonSocket" 2>/dev/null || true
|
||||||
|
|
||||||
log "starting Chromium (local DevTools:${CHROME_LOCAL_DEBUG_PORT})"
|
case "${BROWSER_ENGINE,,}" in
|
||||||
chromium \
|
chromium)
|
||||||
--no-sandbox \
|
log "starting Chromium (local DevTools:${CHROME_LOCAL_DEBUG_PORT})"
|
||||||
--disable-dev-shm-usage \
|
chromium \
|
||||||
--ozone-platform=x11 \
|
--no-sandbox \
|
||||||
--remote-debugging-port="${CHROME_LOCAL_DEBUG_PORT}" \
|
--disable-dev-shm-usage \
|
||||||
--remote-debugging-address=127.0.0.1 \
|
--ozone-platform=x11 \
|
||||||
--remote-allow-origins='*' \
|
--remote-debugging-port="${CHROME_LOCAL_DEBUG_PORT}" \
|
||||||
--window-size=1280,720 \
|
--remote-debugging-address=127.0.0.1 \
|
||||||
--user-data-dir="${CHROME_PROFILE_DIR}" \
|
--remote-allow-origins='*' \
|
||||||
--disable-blink-features=AutomationControlled \
|
--window-size=1280,720 \
|
||||||
--no-first-run \
|
--user-data-dir="${CHROME_PROFILE_DIR}" \
|
||||||
--disable-gpu \
|
--disable-blink-features=AutomationControlled \
|
||||||
--mute-audio \
|
--no-first-run \
|
||||||
--no-default-browser-check \
|
--disable-gpu \
|
||||||
--disable-software-rasterizer \
|
--mute-audio \
|
||||||
--disable-features=site-per-process \
|
--no-default-browser-check \
|
||||||
--disable-crash-reporter \
|
--disable-software-rasterizer \
|
||||||
--disable-extensions \
|
--disable-features=site-per-process \
|
||||||
--disable-sync &
|
--disable-crash-reporter \
|
||||||
|
--disable-extensions \
|
||||||
|
--disable-sync &
|
||||||
|
;;
|
||||||
|
cloak|cloakbrowser)
|
||||||
|
log "starting CloakBrowser (local DevTools:${CHROME_LOCAL_DEBUG_PORT})"
|
||||||
|
python3 -u /src/cloak_browser_launcher.py &
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "fatal: unsupported BROWSER_ENGINE=${BROWSER_ENGINE}; expected chromium or cloak"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
CHROME_PID=$!
|
CHROME_PID=$!
|
||||||
wait "$CHROME_PID" || CHROME_EXIT=$?
|
wait "$CHROME_PID" || CHROME_EXIT=$?
|
||||||
|
|
@ -183,7 +196,7 @@ while true; do
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RESTART_COUNT=$((RESTART_COUNT + 1))
|
RESTART_COUNT=$((RESTART_COUNT + 1))
|
||||||
log "Chromium exited with code=${CHROME_EXIT}; restart ${RESTART_COUNT}/${MAX_RESTARTS} in current window"
|
log "${BROWSER_ENGINE} exited with code=${CHROME_EXIT}; restart ${RESTART_COUNT}/${MAX_RESTARTS} in current window"
|
||||||
|
|
||||||
if [ "$RESTART_COUNT" -ge "$MAX_RESTARTS" ]; then
|
if [ "$RESTART_COUNT" -ge "$MAX_RESTARTS" ]; then
|
||||||
log "fatal: too many Chromium restarts in ${RESTART_WINDOW_SEC}s"
|
log "fatal: too many Chromium restarts in ${RESTART_WINDOW_SEC}s"
|
||||||
|
|
@ -194,4 +207,3 @@ while true; do
|
||||||
unset CHROME_EXIT
|
unset CHROME_EXIT
|
||||||
unset CHROME_PID
|
unset CHROME_PID
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue