windbridges / browser-server-client
Browser Server API Client
Requires
- php: ^7.3|^8.0
- ext-json: *
- guzzlehttp/guzzle: ^7.2
This package is auto-updated.
Last update: 2025-05-08 06:58:31 UTC
README
PHP API
Создаем объект API и авторизуемся на сервисе:
use WindBridges\BrowserServerClient\BrowserServerClient; $api = new BrowserServerClient('172.31.192.1'); $api->auth('AUTH_TOKEN');
Вызов startSession() приводит к открытию нового окна браузера и возвращает данные сессии, соответствующие новому окну:
$session = $api->startSession();
Используя socketUri сессии, можно подключиться к окну браузера с помощью любой библиотеки, понимающей DevTools protocol. Здесь мы будем использовать headless-chromium-php
:
use HeadlessChromium\BrowserFactory; $browser = BrowserFactory::connectToBrowser($session->getSocketUri()); $page = $browser->createPage();
Полный пример:
use WindBridges\BrowserServerClient\BrowserServerClient; use HeadlessChromium\BrowserFactory; $api = new BrowserServerClient('172.31.192.1'); $api->auth('AUTH_TOKEN'); $session = $api->startSession(); $browser = BrowserFactory::connectToBrowser($session->getSocketUri()); $page = $browser->createPage();
Иногда бывает гораздо удобнее дать сессии имя и обращаться к ней по нему, чтобы не хранить идентификаторы сессий, которые назначаются случайным образом. При запросе сессии по имени, сервис будет проверять, открыта ли данная сессия, и если нет, то автоматически создавать ее:
use WindBridges\BrowserServerClient\BrowserServerClient; use HeadlessChromium\BrowserFactory; $api = new BrowserServerClient('172.31.192.1'); $api->auth('AUTH_TOKEN'); // Если сессия с именем 'test-session' не существует, то она будет создана $session = $api->requireSession('test-session'); $browser = BrowserFactory::connectToBrowser($session->getSocketUri()); $page = $browser->createPage();
Эту же тактику можно использовать и для страниц браузера. Например, если вам нужна одна вкладка для работы, то можно назначить ей уникальное имя, чтобы не следить за закрытием ненужных вкладок в процессе запуска скрипта:
use WindBridges\BrowserServerClient\BrowserServerClient; $api = new BrowserServerClient('172.31.192.1'); $api->auth('AUTH_TOKEN'); // Если сессия с именем 'test-session' не существует, то она будет создана $session = $api->requireSession('test-session'); $sessionPage = $session->requirePage('test-page');
$sessionPage->getSocketUri()
будет каждый раз содержать uri одной и той же страницы. Однако headless-chromium-php
не позволяет напрямую подключиться к открытой вкладке, поэтому нужно использовать workaround. В будущем для этой цели будет создан хелпер, позволяющий выполнять эти действия в несколько строк.
Workaround для подключения к существующей странице:
use WindBridges\BrowserServerClient\BrowserServerClient; use HeadlessChromium\BrowserFactory; use HeadlessChromium\Communication\Message; use HeadlessChromium\Page; $api = new BrowserServerClient('172.31.192.1'); $api->auth('AUTH_TOKEN'); // Если сессия с именем 'test-session' не существует, то она будет создана $session = $api->requireSession('test-session'); $sessionPage = $session->requirePage('test-page'); $browser = BrowserFactory::connectToBrowser($session->getSocketUri()); $target = $browser->getTarget($sessionPage->getTargetId()); $frameTreeResponse = $target->getSession()->sendMessageSync(new Message('Page.getFrameTree')); if (!$frameTreeResponse->isSuccessful()) { throw new Exception('Cannot read frame tree'); } $page = new Page($target, $frameTreeResponse['result']['frameTree']); $page->getSession()->sendMessageSync(new Message('Page.enable')); $page->getSession()->sendMessageSync(new Message('Network.enable')); $page->getSession()->sendMessageSync(new Message('Runtime.enable')); $page->getSession()->sendMessageSync(new Message('Page.setLifecycleEventsEnabled', ['enabled' => true])); // $page->addPreScript($pagePreScript);