Skip to content

WebDiff SDK

自定义脚本 任务在客户端本地执行脚本时,会自动下发内置 WebDiff SDKwebdiff 包),用于读取运行环境、Cookie Plus 登录态、发送通知、编排其它任务等。

执行前客户端会在 脚本工作目录script-workspace)生成 SDK 文件与本次任务专用的 webdiff-context.json无需在 npm / pip 依赖中单独安装 webdiff

引入方式

语言引入
JavaScript / TypeScriptconst webdiff = require('webdiff')import webdiff from 'webdiff'
Python 3import webdiff
Shellsource "$WEBDIFF_HOME/webdiff.sh"(脚本开头加载一次)

进程环境变量

变量说明
WEBDIFF_HOME脚本工作目录绝对路径;内含 webdiff.jswebdiff.shnode_modules
WEBDIFF_CONTEXT本次执行的 webdiff-context.json 绝对路径
WEBDIFF_SHELL_SDKwebdiff.sh 的绝对路径

任务「运行环境 → 环境变量」中的键值对会 同时 注入进程环境(Shell 可直接 $VAR 读取)并写入 webdiff-context.jsonenv 字段。


JavaScript / TypeScript

webdiff.env(name)

读取环境变量。优先 任务配置(webdiff-context.jsonenv),其次 process.env。空字符串视为 undefined

javascript
const apiUrl = webdiff.env('API_URL');
const retry = Number(webdiff.env('RETRY') || 3);

webdiff.envUrl(name, defaultValue?)

env 基础上规范为 http(s) URL:已有 scheme 则原样返回;以 // 开头补 https:;域名或 IP 形式补 https://

javascript
const url = webdiff.envUrl('API_URL', 'https://httpbin.org/get');

webdiff.global(name)

读取「任务列表 → 全局变量」中配置的变量(与任务级环境变量无关)。

javascript
const token = webdiff.global('API_TOKEN') || '';

webdiff.cookiePlus(alias)

别名 返回 Cookie Plus 绑定解析出的 Cookie 数组(Playwright Cookie 格式)。未绑定或解析失败时返回 []

javascript
const cookies = webdiff.cookiePlus('my_site');
const cookieHeader = cookies.map((c) => `${c.name}=${c.value}`).join('; ');

webdiff.localStorage(alias)

按别名返回 LocalStorage 键值对象。仅当绑定项勾选 同步 LocalStorage 时有数据;否则为 {}

javascript
const ls = webdiff.localStorage('my_site');
const token = ls['auth_token'] || ls.token;

webdiff.notify(title, content, options?)

脚本内 主动发送通知,与任务「频率 → 启用通知 / 通知渠道」无关;也不受触发规则约束。返回 Promise<boolean>

参数说明
{ channel: '渠道名称' }名称须与 通知渠道完全一致 且已启用
{ alias: '别名' }别名须已在「运行环境 → 通知别名」中绑定到具体渠道

本地通知使用系统保留名 本地通知webdiff.LOCAL_NOTIFY_CHANNEL_NAME)。

javascript
await webdiff.notify('库存告警', 'SKU-001 库存 < 10', { channel: '我的钉钉' });
await webdiff.notify('库存告警', 'SKU-001 库存 < 10', { alias: 'alert' });
await webdiff.notify('脚本提醒', '执行完成', {
  channel: webdiff.LOCAL_NOTIFY_CHANNEL_NAME,
});

通知标记不会进入快照

notify 会向 stdout 写入内部标记行,执行器会 自动剥离 后再写入执行记录,一般不影响「输出内容变化」类规则。

任务编排

与 UI「启用 / 停用 / 立即执行」一致。enableTask / disableTask / runTask本脚本执行结束后 处理;isTaskEnabled / listTasks同步查询

API说明
webdiff.enableTask(nameOrId)启用指定任务
webdiff.disableTask(nameOrId)停用指定任务
webdiff.runTask(nameOrId)立即执行指定任务(不等待完成;禁止触发自身)
webdiff.isTaskEnabled(nameOrId)查询任务是否已启用,返回 boolean
webdiff.listTasks(options?)分页查询任务列表,返回 { list, total, current, pageSize }
javascript
webdiff.enableTask('每日签到');
webdiff.runTask('HTTP 健康检查');

const page = webdiff.listTasks({ page: 1, pageSize: 20, keyword: '监控' });
console.log('共', page.total, '条');

试运行限制

「运行脚本」试运行 不会 真正执行 enableTask / disableTask / runTaskisTaskEnabled / listTasks 在试运行时会报错。

完整示例

javascript
const webdiff = require('webdiff');
const axios = require('axios'); // 需在任务「npm 依赖」中声明并安装

async function main() {
  const alias = webdiff.env('CP_ALIAS') || 'my_site';
  const url = webdiff.envUrl('API_URL', 'https://httpbin.org/cookies');
  const cookies = webdiff.cookiePlus(alias);

  const res = await axios.get(url, {
    headers: {
      Cookie: cookies.map((c) => `${c.name}=${c.value}`).join('; '),
    },
    timeout: 15000,
    validateStatus: () => true,
  });

  console.log('HTTP', res.status);
  console.log(JSON.stringify(res.data).slice(0, 500));

  if (res.status >= 400) {
    await webdiff.notify('接口异常', `GET ${url} → ${res.status}`, { channel: '我的钉钉' });
    process.exit(1);
  }
}

main().catch((err) => {
  console.error(err.message || err);
  process.exit(1);
});

Python 3

文件头建议 #!/usr/bin/env python3,使用 import webdiff 引入 SDK。stdout 写入执行快照。

API说明
webdiff.env(name)读取任务环境变量;未配置则回退 os.environ
webdiff.env_url(name, default=None)规范为 http(s) URL
webdiff.global_var(name)读取全局变量(Python 中 global 为保留字)
webdiff.cookie_plus(alias)读取 Cookie Plus 绑定,返回 list[dict]
webdiff.local_storage(alias)读取 LocalStorage 字典
webdiff.notify(title, content, channel=None, alias=None)发送通知,channelalias 二选一
webdiff.enable_task(name_or_id)启用任务
webdiff.disable_task(name_or_id)停用任务
webdiff.run_task(name_or_id)立即执行任务
webdiff.is_task_enabled(name_or_id)查询是否已启用
webdiff.list_tasks(page=1, page_size=10, **options)分页查询任务列表
python
import webdiff

api_url = webdiff.env_url('API_URL', 'https://httpbin.org/get')
cookies = webdiff.cookie_plus('my_site')
webdiff.notify('告警', 'done', channel='我的钉钉')

pip 依赖(如 requests)需在「pip 依赖」步骤填写并安装。


Shell

类 Unix 环境使用 bash 执行;Windows 使用 cmd。执行前须加载 SDK:

bash
source "$WEBDIFF_HOME/webdiff.sh"
函数说明
webdiff_env NAME读取环境变量(优先 context,其次 shell 变量)
webdiff_global NAME读取全局变量
webdiff_cookie_file ALIAS返回 Netscape cookies.txt 路径,供 curl -b 使用
webdiff_cookie_json ALIAS返回含 cookies 与 localStorage 的 JSON 文件路径
webdiff_notify "标题" "内容" [--channel "渠道"] [--alias "别名"]发送通知
webdiff_enable_task TARGET启用任务
webdiff_disable_task TARGET停用任务
webdiff_run_task TARGET立即执行任务
webdiff_is_task_enabled TARGET查询是否已启用(退出码 0=已启用)
webdiff_list_tasks [--page N] [--page-size N] [--keyword KW]分页查询,stdout 输出 JSON
bash
#!/bin/bash
set -euo pipefail
source "$WEBDIFF_HOME/webdiff.sh"

URL="$(webdiff_env CHECK_URL)"
URL="${URL:-https://httpbin.org/status/200}"

STATUS="$(curl -sS -o /dev/null -w '%{http_code}' --max-time 15 "$URL")"
echo "GET $URL => HTTP $STATUS"

if [[ "$STATUS" -ge 400 ]]; then
  webdiff_notify "HTTP 异常" "请求 $URL 返回 $STATUS" --channel "我的钉钉"
  exit 1
fi

依赖 python3 或 node

webdiff_notify 及任务编排函数内部需 python3node 与执行器通信;一般客户端环境已具备其一。


脚本内通知 vs 任务级通知

脚本内 webdiff.notify任务级通知(触发规则 + 频率步骤)
触发方式脚本代码主动调用规则匹配(如输出变化、执行异常)
是否依赖「启用通知」不依赖须在频率步骤开启并选渠道
是否依赖触发规则不依赖须配置至少一条规则
渠道指定channelalias频率步骤中勾选的通知渠道

两套机制 可同时使用:例如平时靠规则监控输出变化,脚本内在检测到严重错误时立即 notify

与运行环境的对应关系

运行环境配置                    SDK 读取方式
─────────────────────────────────────────────────────
环境变量 NAME=值        →  webdiff.env('NAME') / webdiff_env NAME / $NAME
全局变量 TOKEN          →  webdiff.global('TOKEN') / webdiff_global TOKEN
Cookie Plus 别名 xxx    →  webdiff.cookiePlus('xxx') / webdiff_cookie_file xxx
  └ 同步 LocalStorage   →  webdiff.localStorage('xxx') / webdiff_cookie_json + jq
通知别名 alert → 渠道   →  webdiff.notify(..., { alias: 'alert' })
通知渠道「我的钉钉」    →  webdiff.notify(..., { channel: '我的钉钉' })

错误处理

建议在 JS/TS 入口使用 main().catch(...)process.exit(1);Shell 使用 set -e 或显式判断退出码,以便「执行异常」规则正确识别失败。

相关文档