bauta문서

Playwright 연결

게이트웨이를 거쳐 Playwright를 페르소나에 연결하거나, 페르소나 파일로 bauta 브라우저를 직접 실행합니다.

Playwright는 CDP로 페르소나에 연결합니다. 게이트웨이를 거치면 연결 호출만 바뀌며, bauta 브라우저를 직접 실행하고 페르소나 파일을 넘길 수도 있습니다.

게이트웨이 시작

bauta를 설치하고 설정했다면(시작하기), 페르소나를 만들고 게이트웨이를 시작합니다.

bauta geo update                              # 프록시 출구 위치를 찾는 데이터베이스
bauta persona new shop --from win-intel
bauta serve

이제 페르소나마다 자기 CDP 엔드포인트 http://127.0.0.1:9222/persona/<name>이 생깁니다.

Python에서 연결

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222/persona/shop")
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.evaluate("navigator.platform"))  # Win32
    browser.close()

Node.js에서 연결

const { chromium } = require("playwright-core");

const browser = await chromium.connectOverCDP("http://127.0.0.1:9222/persona/shop");
const page = await browser.newPage();
await page.goto("https://example.com");
await browser.close();

클라이언트에는 자기 페르소나의 페이지만 보이며, 브라우저를 혼자 쓰는 것과 같습니다. 페르소나는 자기 프로필을 가지므로, 다음에 연결할 때도 쿠키와 저장소가 그대로 있습니다. 페르소나의 브라우저는 마지막 클라이언트가 떠나고 30초 뒤에 닫히며, bauta serve --idle로 바꿀 수 있습니다.

bauta 브라우저 직접 실행

게이트웨이 없이 실행하면 브라우저는 환경 변수에서 라이선스와 페르소나 파일을 받습니다. 아래의 페르소나 파일과 폰트 파일은 bauta-browser 리포지토리를 체크아웃한 곳에 있습니다.

# 한 번만: Windows로 보이는 Linux 호스트가 쓰는 Windows 폰트 환경(fonttools 필요: pip install fonttools)
personas/fonts/fetch.sh

bauta setup   # 한 번만: 지금 무료 세션을 활성화하고 계정(GitHub)을 안내합니다. ~/.bauta/license를 씁니다

BAUTA_LICENSE=~/.bauta/license \
BAUTA_PLUGIN_CONFIG=$PWD/personas/win-intel.json \
FONTCONFIG_FILE=$PWD/personas/fonts/win.conf \
  /path/to/bauta/chrome --user-data-dir="$(mktemp -d)" https://example.com
변수내용
BAUTA_LICENSE라이선스 파일. bauta setup이 ~/.bauta/license에 씁니다.
BAUTA_PLUGIN_CONFIG페르소나 파일의 절대 경로.
FONTCONFIG_FILE페르소나와 짝을 이루는 폰트 환경. win-intel.json에는 personas/fonts/win.conf입니다.

/path/to/bauta/chrome은 bauta 브라우저이며, bauta browser fetch가 이 머신에 맞는 브라우저를 내려받습니다.

브라우저는 실행할 때 한 번 라이선스를 확인하고 페르소나를 읽은 뒤, 여는 모든 페이지에 페르소나를 넘깁니다. 그래서 샌드박스가 켜진 채로 유지됩니다. stderr에는 [bauta] persona: <file>을 출력합니다. 페이지에 실제 머신이 보인다면 stderr가 이유를 알려 줍니다. 라이선스가 없거나, 만료되었거나, 우리가 발급한 것이 아닌 경우, 또는 페르소나 파일을 읽을 수 없거나 내용이 서로 모순되는 경우입니다. 브라우저가 실행되는 동안 라이선스가 만료되어도 브라우저는 멈추지 않습니다.

Playwright에서는 같은 변수를 launch()에 넘깁니다.

import os
from playwright.sync_api import sync_playwright

env = dict(os.environ,
           BAUTA_LICENSE="/abs/path/license",
           BAUTA_PLUGIN_CONFIG="/abs/path/personas/win-intel.json",
           FONTCONFIG_FILE="/abs/path/personas/fonts/win.conf")
with sync_playwright() as p:
    browser = p.chromium.launch(executable_path="/path/to/bauta/chrome", headless=False, env=env)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.evaluate("navigator.platform"))  # Win32
const { chromium } = require("playwright-core");

const env = {
  ...process.env,
  BAUTA_LICENSE: "/abs/path/license",
  BAUTA_PLUGIN_CONFIG: "/abs/path/personas/win-intel.json",
  FONTCONFIG_FILE: "/abs/path/personas/fonts/win.conf",
};
const browser = await chromium.launch({ executablePath: "/path/to/bauta/chrome", headless: false, env });
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.evaluate("navigator.platform")); // Win32

시간대와 로캘은 실행 시 설정입니다. 게이트웨이는 페르소나에서 이 값을 설정하며, 브라우저를 직접 실행할 때는 그 환경에 TZ, 그리고 LANGUAGE와 LANG(예: en_US와 en_US.UTF-8)을 설정합니다.

번들된 모든 페르소나는 navigator.webdriver에 false로 답하므로, 자동화된 실행이 스스로를 드러내지 않습니다.

클릭과 사용자 활성화

스크립트로 실행한 동작은 사람이 아니라 페이지가 한 것입니다. page.evaluate 같은 호출은 페이지에 사용자 활성화(user activation)를 주지 않습니다. 사용자 활성화는 사람의 클릭이나 키 입력으로, Chrome은 팝업을 열거나 전체 화면으로 바꾸거나 클립보드에 쓸 때 이를 요구합니다. 이런 호출에 활성화를 준다면, 페이지는 아무 입력도 없이 생긴 활성화를 보게 됩니다. 사람이 필요한 동작에는 클릭을 쓰세요.

page.click("text=Open")

"humanize": true인 페르소나는 클릭과 타이핑이 사람 손처럼 움직입니다.

페르소나의 정체성은 고정됩니다

클라이언트가 자체 User-Agent, 뷰포트, 로캘, 시간대를 설정하면 설정한 것처럼 응답하지만, 페이지에는 페르소나의 값이 그대로 보입니다.

다음

이 페이지 내용