WindBridges / browser-server-client
浏览器服务器API客户端
dev-master
2021-03-07 21:29 UTC
Requires
- php: ^7.3|^8.0
- ext-json: *
- guzzlehttp/guzzle: ^7.2
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);