Skip to content

スクリプト API 付録

目的

サイトのページスクリプトと API インターセプトスクリプトで使用できる window.api の機能を説明します。設定読み取り、HTTP リクエスト、ユーザーデータ、DOM ツール、汎用ツール、リクエストヘッダーとレスポンスヘッダーの読み取りを含みます。

ページスクリプトと通常 API インターセプトスクリプトは window.api を使用できます。SSE スクリプトは data が渡されることだけが保証され、通常 window.api には依存しません。

ts
interface Window {
  api: {
    user: UserApi;
    http: HttpApi;
    config: Record<string, unknown>;
    dom: DomApi;
    utils: UtilsApi;
    header(headerName: string, isRequestHeader: boolean): Promise<string | string[] | undefined>;
  };
}

api.config

サイトスクリプト環境のカスタム設定を読み取ります。

ts
config: Record<string, unknown>

例:

js
const apiBase = api.config.apiBase;

api.http

api.http はユーザースクリプト向けの HTTP ヘルパーです。api.http.ajax はブラウザーのメインプロセス内で実際のリクエストを実行するため、ページの CORS ポリシーに制限されません。

api.http.ajax(options)

HTTP リクエストを送信します。

ts
ajax(options: {
  url: string;
  method?: string;
  data?: any;
  headers?: Record<string, string>;
  timeout?: number;
  dataType?: 'json' | 'text' | 'html' | 'arrayBuffer';
  contentType?: string;
  processData?: boolean;
}): Promise<{
  ok: boolean;
  status: number;
  statusText: string;
  data?: any;
  error?: string;
  timeout?: boolean;
}>
オプション既定値説明
urlstring-リクエスト URL。
methodstringGETHTTP メソッド。
dataany-リクエストデータ。GETHEAD ではクエリ文字列へシリアライズされ、それ以外のメソッドではリクエスト本文に書き込まれます。
headersRecord<string, string>{}リクエストヘッダー。
timeoutnumber-タイムアウト時間(ミリ秒)。0 より大きい場合のみ有効です。
dataType'json' | 'text' | 'html' | 'arrayBuffer'jsonレスポンスの解析方式。
contentTypestringapplication/x-www-form-urlencoded; charset=UTF-8リクエスト本文の Content-Type。
processDatabooleantruedata を自動的にシリアライズするかどうか。false にすると、data をそのままリクエスト本文として渡します。

戻り値:

フィールド説明
okbooleanHTTP 2xx レスポンスでは true。解析エラー、HTTP エラー、タイムアウト、中止、ネットワークエラーでは false
statusnumberHTTP ステータスコード。0 はタイムアウト、中止、またはネットワークレベルの失敗を示します。
statusTextstringHTTP ステータステキスト。HTTP 以外の失敗では timeoutabort、または error
dataany解析に成功したレスポンスデータ。
errorstring解析失敗または HTTP 以外の失敗時のエラーメッセージ。
timeoutboolean設定されたタイムアウトによりリクエストが中止された場合は true

例:

js
const ret = await api.http.ajax({
  url: 'https://example.com/api/profile',
  method: 'GET',
  dataType: 'json',
  timeout: 10000
});

if (ret.ok) {
  console.log(ret.data);
}
js
const ret = await api.http.ajax({
  url: 'https://example.com/api/items',
  method: 'POST',
  contentType: 'application/json',
  data: { name: 'demo' }
});

api.user

api.user は、スクリプト実行中のユーザー関連データを読み書きします。

共通パラメーター:

パラメーターデフォルト説明
sitebooleanfalseサイト別に保存するかどうか。
accountbooleanfalseアカウント別に保存するかどうか。
didbooleanfalseデバイス別に保存するかどうか。

api.user.put(name, value, site, account, did)

指定したキー値を保存します。

ts
put(
  name: string,
  value: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean }>

例:

js
await api.user.put('token', 'abc123');

api.user.get(name, site, account, did)

指定したキー値を読み取ります。

ts
get(
  name: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ value: string | null, status: boolean }>

例:

js
const ret = await api.user.get('token');
console.log(ret.value);

api.user.remove(name, site, account, did)

指定したキー値を削除します。

ts
remove(
  name: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean }>

例:

js
await api.user.remove('token');

api.user.incr(name, step, site, account, did)

指定したキーの数値を step 分増やします。キーが存在しない場合は、値 step で作成します。

ts
incr(
  name: string,
  step?: number,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean, value: number | string }>

例:

js
const ret = await api.user.incr('count', 1);
console.log(ret.value);

api.user.decr(name, step, site, account, did)

指定したキーの数値を step 分減らします。キーが存在しない場合は、値 step * -1 で作成します。

ts
decr(
  name: string,
  step?: number,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<{ status: boolean, value: number | string }>

例:

js
const ret = await api.user.decr('count', 1);
console.log(ret.value);

api.user.startsWith(prefix, site, account, did)

キー名が指定したプレフィックスで始まるすべてのデータを検索します。

ts
startsWith(
  prefix: string,
  site?: boolean,
  account?: boolean,
  did?: boolean
): Promise<Array<{ name: string, value: string }>>

例:

js
const items = await api.user.startsWith('cache:');

api.user.countAll(name, site, account)

指定したキー名のレコード数を集計します。

ts
countAll(
  name: string,
  site?: boolean,
  account?: boolean
): Promise<{ value: number, status: boolean }>

例:

js
const ret = await api.user.countAll('token');
console.log(ret.value);

api.user.sumAll(name, site, account)

指定したキー名に対応する値の数値合計を集計します。

ts
sumAll(
  name: string,
  site?: boolean,
  account?: boolean
): Promise<{ value: number, status: boolean }>

例:

js
const ret = await api.user.sumAll('score');
console.log(ret.value);

api.dom

api.dom は DOM クエリ、可視性判定、接続リスナー、サイズリスナー、オーバーレイ作成機能を提供します。

セレクター対応:

書式説明
.button.primaryCSS セレクター。
xpath://div[@id="app"]XPath セレクター。
.dialog:p一致した要素の親要素を返します。
.dialog:p2一致した要素の 2 階層上の親要素を返します。
.header:bottomオーバーレイ境界メソッドで対象要素の下端を使用します。
.sidebar:rightオーバーレイ境界メソッドで対象要素の右端を使用します。

api.dom.createMutationObserver(ele, bindStr, childList, subtree, attributes, characterData, fn)

MutationObserver を作成してキャッシュします。ele[bindStr] が既に存在する場合は、既存の observer を直接返します。

ts
createMutationObserver(
  ele: Element,
  bindStr: string,
  childList: boolean,
  subtree: boolean,
  attributes: boolean,
  characterData: boolean,
  fn: (mutations: MutationRecord[]) => void
): MutationObserver

例:

js
api.dom.createMutationObserver(
  document.body,
  '__bodyObserver__',
  true,
  true,
  false,
  false,
  (mutations) => console.log(mutations)
);

api.dom.querySelector(doc, cssOrXPathSelector)

最初に一致する要素を検索します。

ts
querySelector(doc: Document, cssOrXPathSelector: string): HTMLElement | null

例:

js
const el = api.dom.querySelector(document, 'xpath://button[contains(.,"Submit")]');

api.dom.querySelectorAll(doc, cssOrXPathSelector)

一致するすべての要素を検索します。

ts
querySelectorAll(doc: Document, cssOrXPathSelector: string): HTMLElement[]

例:

js
const buttons = api.dom.querySelectorAll(document, 'button.primary');

api.dom.isVisible(ele)

要素が可視の交差領域にあるか判定します。

ts
isVisible(ele: HTMLElement): Promise<boolean>

例:

js
if (await api.dom.isVisible(el)) {
  console.log('visible');
}

api.dom.getVisibleRect(ele)

要素の現在の可視領域の矩形を取得します。

ts
getVisibleRect(ele: HTMLElement): Promise<DOMRectReadOnly>

例:

js
const rect = await api.dom.getVisibleRect(el);
console.log(rect.left, rect.top, rect.width, rect.height);

api.dom.getConnectListeners()

現在の接続リスナー一覧を取得します。

ts
getConnectListeners(): Array<{
  querySelector: string;
  callback: (isConnected: boolean) => void;
  isConnected?: boolean;
}>

例:

js
api.dom.addConnectListener('.modal', () => {});
console.log(api.dom.getConnectListeners());

api.dom.addConnectListener(cssOrXPathSelector, callback)

対象要素がドキュメントに現れる、またはドキュメントから消えるかを監視します。

ts
addConnectListener(
  cssOrXPathSelector: string,
  callback: (isConnected: boolean) => void
): void

例:

js
api.dom.addConnectListener('.dialog', (isConnected) => {
  console.log('dialog:', isConnected);
});

api.dom.removeConnectListener(cssOrXPathSelectors)

指定したセレクターに対応する接続リスナーを削除します。

ts
removeConnectListener(cssOrXPathSelectors: string[]): void

例:

js
api.dom.removeConnectListener(['.dialog', '.toast']);

api.dom.addResizeListener(cssOrXPathSelector, bindWindowStr, callback, createObserver, delayTime)

対象要素のサイズと位置の変化を監視します。要素が存在しない場合、コールバックは new DOMRect(0, 0, 0, 0) を受け取ります。

ts
addResizeListener(
  cssOrXPathSelector: string,
  bindWindowStr: string,
  callback: (rect: DOMRect) => void,
  createObserver?: boolean,
  delayTime?: number
): ResizeObserver | (() => void)

例:

js
api.dom.addResizeListener('.target', '__targetResize__', (rect) => {
  console.log(rect.width, rect.height);
});

api.dom.createOverlayBy(cssOrXPathSelector, bindWindowStr, createObserver, delayTime, fn)

対象要素の可視領域に追従する fixed 配置のオーバーレイを作成します。

ts
createOverlayBy(
  cssOrXPathSelector: string,
  bindWindowStr: string,
  createObserver?: boolean,
  delayTime?: number,
  fn?: (rect: DOMRectReadOnly) => void
): HTMLElement

例:

js
const overlay = api.dom.createOverlayBy('.target', '__overlay__');
overlay.style.border = '2px solid #f00';
overlay.style.pointerEvents = 'none';
overlay.style.zIndex = '999999';

api.dom.createOverlayByBorder(bindWindowStr, top, right, bottom, left, createObserver, delayTime)

4 つの辺から fixed 配置のオーバーレイを作成します。各辺は数値ピクセル値またはセレクターにできます。セレクター境界では :top:right:bottom:left を使用できます。

ts
createOverlayByBorder(
  bindWindowStr: string,
  top: string | number,
  right: string | number,
  bottom: string | number,
  left: string | number,
  createObserver?: boolean,
  delayTime?: number
): HTMLElement

例:

js
const panel = api.dom.createOverlayByBorder(
  '__centerPanel__',
  'header:bottom',
  20,
  'footer:top',
  '.sidebar:right'
);
panel.style.background = 'rgba(0,0,0,.08)';

api.utils

api.utils.wait(fn, timeoutMs, intervalMs)

条件関数が真値を返すまでポーリングします。

ts
wait(
  fn: () => boolean,
  timeoutMs: number,
  intervalMs?: number
): Promise<void>

タイムアウト後は Error("Timeout: function did not return true in time.") を投げます。

例:

js
await api.utils.wait(
  () => !!api.dom.querySelector(document, '.ready'),
  10000,
  200
);

api.utils.runScript(code, callback)

現在のページで JavaScript コードを実行します。

ts
runScript(
  code: string,
  callback?: (result: any, error: Error) => void
): Promise<any>

例:

js
const title = await api.utils.runScript('document.title');
console.log(title);

api.header(headerName, isRequestHeader)

リモートブラウザーが記録したリクエストヘッダーまたはレスポンスヘッダーを読み取ります。

ts
header(
  headerName: string,
  isRequestHeader: boolean
): Promise<string | string[] | undefined>
パラメーター説明
headerNamestringリクエストヘッダーまたはレスポンスヘッダー名。読み取り時に小文字へ変換されます。
isRequestHeaderbooleantrue はリクエストヘッダー、false はレスポンスヘッダーを読み取ります。

注意:

  • サイト設定に追加されたリクエストヘッダーまたはレスポンスヘッダーのみ記録されます。
  • リクエストヘッダーは、リモートブラウザーがリクエスト送信時に送った header です。
  • レスポンスヘッダーは、リモートブラウザーがレスポンス受信時に受け取った header です。
  • レスポンスヘッダーは文字列配列を返す場合があります。

例:

js
const cookie = await api.header('cookie', true);
const setCookie = await api.header('set-cookie', false);

Sa2web 1.0.0