WindBridges/browser-server-client

浏览器服务器API客户端

dev-master 2021-03-07 21:29 UTC

This package is auto-updated.

Last update: 2024-09-08 05:17:01 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 连接到浏览器窗口。在这里,我们将使用 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);