API リファレンス

paprika_client の全公開関数。 SessionPage を継承するので page.* はセッションでもそのまま使えます。

概要

主に async Python接続PaprikaClientPage クラスSession の順で読むのが定石です。

コード例の表示モード

接続

async_paprika.connect(base_url=None, *, token=None, timeout=180.0) → PaprikaClient

ハブへの接続。接続先は 引数 → PAPRIKA_HUBhttp://localhost:8000

async with async_paprika.connect() as cli:
    ...
with sync_paprika.connect() as cli:
    ...
use Paprika\Client\Paprika;

$cli = Paprika::connect();   // PAPRIKA_HUB or http://localhost:8000
// ...

同期版(sync_paprika)

async/await を使えない・使いたくない場面(簡単なスクリプト、ノートブック、既存の同期コード)向けに、 非同期 API を 1:1 でブロッキングに写した同期ファサードがあります。裏でバックグラウンドの asyncio ループに橋渡しするだけなので、メソッド名・引数・戻り値は async 版と同一(await を外すだけ)。

例1: セッションを動かす

Hacker News のトップ記事をクリックして、辿り着いた先の URL とタイトルを表示します。

from paprika_client import sync_paprika

with sync_paprika.connect() as cli:                      # await 不要
    with cli.session("https://news.ycombinator.com") as page:
        page.locator(".athing .titleline > a").first.click()
        st = page.state()
        print("url:  ", st.url)
        print("title:", st.title)

実行結果(例):

url:   https://www.anthropic.com/research/glasswing-initial-update
title: Project Glasswing: An initial update \ Anthropic

例2: fetch で画像を一括取得

Wikipedia の記事を fetch ジョブで丸ごと取得し、保存された画像の URL を表示します。

from paprika_client import sync_paprika

with sync_paprika.connect() as cli:
    job = cli.fetch("https://en.wikipedia.org/wiki/Cat", scroll=True)
    imgs = cli.job_images(job.job_id)
    print("status:", job.status)
    print("images:", len(imgs))
    print("first 3:")
    for u in imgs[:3]:
        print(" ", u)

実行結果(例):

status: completed
images: 49
first 3:
  http://your-hub.example:8000/jobs/08dbe3379087/assets/120px-Felis_chaus_-_…jpg
  http://your-hub.example:8000/jobs/08dbe3379087/assets/120px-Gustav_chocolate.jpg
  http://your-hub.example:8000/jobs/08dbe3379087/assets/120px-Orange_tabby_cat_…jpg

本リファレンスの cli.* / page.* / loc.* がそのまま(同期で)使えます。 connect(base_url=None, *, token=None, timeout=180.0, auto_start=True) が既定でループを起動します。 既定では各アクションが [paprika] page.X(...) 形式でログに流れます(無効化は PAPRIKA_CLIENT_ACTION_LOG=0)。

PHP SDK

PHP からも同じハブを叩けます。同期・外部依存なし (ext-curl のみ)・PHP 8.1+。 Composer パッケージ paprika/client。命名は Python 版を snake_case → camelCase に直したもの (例: job_imagesjobImages)。

現在は Job API + Session ライフサイクル(投入・状態取得・アセット・セッション開閉)まで対応しています。 Page/Locator/walk は順次対応予定です。当面 Page 操作が必要なときは Python 版または HTTP API をご利用ください。

インストール

composer require paprika/client

例: fetch ジョブを投げて画像を集める

<?php
require 'vendor/autoload.php';

use Paprika\Client\Paprika;

$cli = Paprika::connect();   // PAPRIKA_HUB or http://localhost:8000
$job = $cli->fetch('https://en.wikipedia.org/wiki/Cat', scroll: true);
echo "status: {$job['status']}\n";

foreach ($cli->jobImages($job['job_id']) as $u) {
    echo $u, "\n";
}

例: ライブセッションを開く

use Paprika\Client\Paprika;
use Paprika\Client\Session;

$cli = Paprika::connect();
$cli->session('https://example.com', function (Session $sess) use ($cli) {
    echo "noVNC: ", $cli->baseUrl() . $sess->novncUrl, "\n";
    // 順次対応: $sess->goto(...), $sess->locator(...) ...
});

現在使える $cli->* メソッド (Python 版と1:1)

PHP メソッド説明 / Python 版
$cli->health()疎通確認 / cli.health()
$cli->listWorkers() / listSessions()一覧 / list_workers / list_sessions
$cli->createJob($url, $opts)POST /jobs / create_job
$cli->fetch($url, $opts = [], wait: true, ...)fetch 投入+完了待ち / fetch
$cli->getJob($id) / listJobs() / jobResult($id)状態 / get_job / list_jobs / job_result
$cli->waitJob($id, pollInterval: 2.0, timeout: 600.0)終端まで待機 / wait_job
$cli->cancelJob($id) / deleteJob($id)中止 / 削除
$cli->jobAssets($id, kind: null, absolute: true, details: false)asset 一覧 / job_assets
$cli->jobImages($id)画像ショートカット / job_images
$cli->downloadJobAssets($id, $destDir, kind: 'image')ローカル保存 / download_job_assets
$cli->openSession(initialUrl: null, ...) → Sessionセッション確保 / open_session
$cli->session($url, $closure, $kwargs = [])クロージャ自動 close 形 / Python の async with cli.session(...)

Session の現行サーフェス

例外

クラス用途
Paprika\Client\PaprikaErrorHTTP/トランスポート系エラー。$e->statusCode で HTTP コード取得 (transport なら null)
Paprika\Client\PaprikaActionErrorPage/Locator 系の失敗 (Page サーフェス対応後に本格使用)

PaprikaClient (cli.*)

メソッド説明
cli.health() → dict疎通確認
cli.list_workers() → list接続中ワーカー一覧
cli.list_sessions() → listセッション一覧
cli.session(url=None, **kw)セッションを開く(async with / await)。kw: parent_job_id / worker_id / lane_hint / idle_ttl_s / absolute_ttl_s / use_profile
cli.open_session(...) → Session手動でセッション確保(await page.close() で解放)

Job ライフサイクル

メソッド説明
cli.create_job(url, **opts) → dictPOST /jobs。投入のみ。optsJobOptions(mode / scroll / goal / use_profile / cookies_from …の全フィールド)
cli.fetch(url, *, wait=True, poll_interval=2.0, timeout=600.0, scroll=True, **opts) → dictfetch 投入 + 完了待ち。wait=False で投げっぱなし
cli.get_job(id) → dict現在の状態(status / progress …)
cli.list_jobs() → list全ジョブ(新しい順)
cli.wait_job(id, *, poll_interval=2.0, timeout=600.0) → dict終了状態まで待つ
cli.job_result(id) → dict最終結果(assets / links / 最終URL)
cli.cancel_job(id) / delete_job(id) → dict中止 / 削除

asset(画像・動画)取得

メソッド説明
cli.job_assets(id, *, kind=None, absolute=True, details=False) → listキャプチャ済み asset 一覧。kind=image/video/audio/other/None、details=メタ付き dict
cli.job_images(id, **kw) → listjob_assets(kind="image") のショートカット
cli.download_job_assets(id, dest_dir, *, kind="image") → list[str]ディスクに保存。保存パス一覧を返す

Page クラス全メソッド

Page クラスの全メソッド (ナビゲーション・取得・JS 実行・収集・拡張機能コマンド・タブ操作) は単独ページに分けました。引数・戻り値・例まで含む詳細はこちらへ:

→ Page クラス リファレンス

Page クラスへの古いアンカー (#nav, #getters, #evaluate, #assets, #agent-ext, #tabs) は api-page.html へ自動転送されます。

Session 固有

SessionPage + 複数タブ操作の拡張:

注意 popup を閉じるのに await sess[-1].close() は使わないこと(セッション全体を殺すことがある)。sess.close_popups() を使う。

Locator

page.locator(sel) / get_by_*() が返す要素参照。解決はアクション時です(click()wait_for() を呼んだ時点で初めて DOM を探します)。

全メソッド(クリック・入力・取得・状態判定・チェーン・待機)と用例は Locator リファレンス に集約しました。

rows = page.locator(".item")
for r in await rows.all():
    print(await r.get_attribute("data-id"))
await rows.first.click()
rows = page.locator(".item")
for r in rows.all():
    print(r.get_attribute("data-id"))
rows.first.click()
PHP の Locator は順次対応中です(チェーン API $page->locator(...)->first()->click() を実装予定)。

サイト巡回(walk / Walker)

「サイト X のページを N 件巡回」のようなクロールを、キュー・重複除去・ドメイン/パスのフィルタ・ オフスコープ redirect 対応まで込みで回す高レベルヘルパー。walk(page, **opts)Visit を yield する非同期イテレータ(クラス版は Walker)。

全オプション(15 項目)・Visit フィールド・attempt 跨ぎ再開・パスの正規表現フィルタなどの完全リファレンスは walk リファレンス に集約しました。

from paprika_client import async_paprika, walk

async with async_paprika.connect() as cli:
    async with cli.session("https://example.com", parent_job_id="crawl") as page:
        async for visit in walk(page, target_pages=50, same_domain=True):
            print(visit.n, visit.depth, visit.url)
            await page.save_assets("out/images")   # 各ページで画像保存など
walk は現状 async API のみ sync ファサードからは未公開です。同期スクリプトの中で使う場合は、asyncio.run() で 上の async 例をラップしてください。
PHP の walk は順次対応中です(Walker / Visit クラスを Python 版と同シェイプで移植予定)。

ワンショットヘルパー

1 動作だけしてセッションを閉じる糖衣です。インポートは from paprika_client import snapshot, outline, state, run です。

関数説明
await snapshot(url, *, wait=2.0, full_page=False, path=None) → bytes開いて PNG
await outline(url, *, wait=2.0) → stroutline 文字列
await state(url, *, wait=2.0) → dicturl/title…
await run(actions, *, initial_url=None) → dictact.* のアクション列を実行

ライブログ(WebSocket)

ジョブの実行ログを **リアルタイム** で受信する WebSocket。長時間ジョブやライブ表示で使います。

ws://<hub>/jobs/{job_id}/events?since=N

メッセージは JSON 1 行({type: "log" | "done" | "error", data: ...})。since= で途中接続・再接続にも追従できます。

仕様・JS/Python の実装例・再接続戦略は WebSocket リファレンス を参照。

例外

例外発生条件
PaprikaErrorHTTP レベルのエラー(404 / 5xx / ネットワーク)
PaprikaActionError200 だが action が NO_MATCH / ERR: を返した(.status に生文字列)