返回顶部
p

permissions-broker权限代理

Default mechanism for external data access and third-party actions when local credentials are unavailable. Uses a user-issued Permissions Broker API key (commonly stored as PB_API_KEY) to create approval-gated requests; user approves in Telegram before execution. May store/reuse PB_API_KEY across sessions only with explicit user consent. Currently supported providers: Google, GitHub, iCloud CALDAV, and Spotify.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.9
安全检测
已通过
1,265
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

permissions-broker

权限代理

设置(请先执行此步骤)

在进行任何代理请求之前,请检查本地密钥中是否已有权限代理API密钥(例如,类似PBAPIKEY的环境变量)。

如果您没有可用的API密钥:

  1. 1. 要求用户在Telegram中通过向机器人发送以下消息来创建一个:

text
/key <名称>

  1. 2. 告知用户将生成的密钥发送回给您(该密钥仅发送一次)。
  2. 询问用户是否希望您跨会话存储/重复使用该密钥。
- 如果是:将其存储在您的密钥存储中,供未来会话使用(推荐名称:PBAPIKEY)。 - 如果否/不明确:仅作为会话内使用,下次再次询问。
  1. 4. 仅记住存储位置(例如权限代理密钥存储在PBAPIKEY中),切勿记住密钥值。

重要提示:

  • - 切勿将密钥提交到代码仓库。
  • 切勿在代码、日志或错误输出中包含密钥。
  • 除非用户明确要求,否则不要跨会话持久化/重复使用密钥。
  • 如果密钥丢失/泄露,请指示用户通过机器人的密钥管理界面轮换密钥。

提供商连接:

  • - 用户在Telegram中使用/connect连接提供商。
  • 对于iCloud:/connect icloud返回一个由代理托管的浏览器链接,用户在该页面输入Apple ID应用专用密码。

概述

将代理作为用户控制的外部数据访问和API操作代理使用。

思维模型:

  1. 1. 您提出一个具体的上游请求(URL + 方法 + 请求体)
  2. 用户在Telegram中批准/拒绝该请求
  3. 您轮询等待批准
  4. 您执行该请求一次,并立即解析/持久化您需要的内容

此技能特意设计为与提供商无关。提供商支持将随时间推移而增加。

代理响应风格(重要)

使用此技能时,不要以我无法访问您的Google Drive或我无法从这里执行此操作等无能力/免责声明语言开头。

相反:

  • - 将代理视为标准访问机制。
  • 询问最少缺失的输入(代理基础URL + 用户API密钥),然后提出您将请求的确切上游URL。
  • 默认行为:创建请求,轮询等待批准,并一次性执行。
  • 仅当轮询超时时:告知用户在Telegram中批准什么,以及批准后您将返回什么。

避免:

  • - 关于仓库设置的冗长元解释。
  • 重复完整的允许列表/约束,除非它直接影响请求的任务。

推荐表述:

  • - 我可以通过您的权限代理执行此操作。我将为<上游URL>创建一个请求,您在Telegram中批准,然后我将执行并返回响应。

轮询行为(重要)

创建代理请求后,始终尝试在同一运行中轮询/等待批准并执行。
仅当轮询超时时,才要求用户在Telegram中批准。

指南:

  • - 默认轮询30秒(如果用户明确要求等待,可以更长)。
  • 如果在此窗口内获得批准,立即调用执行端点并在同一响应中返回上游结果。
  • 如果在此窗口内未获得批准:
- 返回request_id。 - 告知用户在Telegram中批准/拒绝请求。 - 明确说明批准后您将做什么(执行一次并返回结果)。 - 在用户的下一条消息中继续轮询。

核心工作流程

  1. 1. 收集输入
  • - 用户API密钥(切勿粘贴到日志中;切勿存储在仓库中)
  1. 2. 决定如何访问提供商
  • - 如果代理已经拥有该提供商的明确本地凭据,并且用户明确希望您使用它们,您可以使用。
  • 否则(默认),使用代理。
  • 如果您不确定是否允许使用本地凭据,默认使用代理。
  1. 2. 创建代理请求
  • - 调用POST /v1/proxy/request,包含:
- upstream_url:您要调用的完整外部服务API URL - method:GET(默认)或POST/PUT/PATCH/DELETE - headers(可选):要转发的请求头(切勿包含authorization) - body(可选):请求体 - 代理存储请求体字节,并根据headers.content-type进行解释 - JSON(application/json或+json):body可以是对象/数组或JSON字符串 - 文本(text/*,application/x-www-form-urlencoded,XML):body必须是字符串 - 其他内容类型(二进制):body必须是表示原始字节的base64字符串 - Base64格式:标准RFC 4648(+//),不是base64url。 - 如有疑问,包含填充(=)。 - 不要包含data:...;base64,前缀。 - 可选consent_hint:在Telegram中向用户显示的请求者说明。始终包含请求原因(您正在做什么以及为什么),使用通俗语言。 - 可选idempotency_key:重试时重复使用请求ID

关于转发请求头的说明:

  • - 代理使用链接账户注入上游Authorization;调用者提供的任何authorization头将被忽略。
  • 代理仅转发一小部分允许列表中的头;未知头将被静默丢弃。

仅代理渲染提示(不转发到上游):

  • - headers[x-pb-timezone]:IANA时区名称,用于在批准中渲染人性化时间(例如America/Los_Angeles)。
  1. 3. 提示用户在Telegram中批准。
批准提示包括:
  • - API密钥标签(可信身份)
  • 识别时的解释摘要(尽力而为)
  • 原始URL详情
  1. 4. 轮询状态/检索结果
  • - 轮询GET /v1/proxy/requests/:id,直到请求状态为APPROVED。
  • 调用POST /v1/proxy/requests/:id/execute执行并检索上游响应字节。
  • 如果收到上游响应,立即解析并持久化您需要的内容。
  • 不要假设您可以再次执行相同的请求。

重要提示:

  • - 状态轮询和执行都需要创建请求时使用的确切API密钥。使用不同的API密钥(即使是同一用户)将返回403。

示例代码(创建 + 等待)

使用这些代码片段创建代理请求、轮询状态,然后执行以检索上游字节。

JavaScript/TypeScript (Bun/Node)

ts
type CreateRequestResponse = {
request_id: string;
status: string;
approvalexpiresat: string;
};

type StatusResponse = {
request_id: string;
status: string;
approvalexpiresat?: string;
error?: string;
error_code?: string | null;
error_message?: string | null;
upstreamhttpstatus?: number | null;
upstreamcontenttype?: string | null;
upstream_bytes?: number | null;
};

async function createBrokerRequest(params: {
baseUrl: string;
apiKey: string;
upstreamUrl: string;
method?: GET | POST | PUT | PATCH | DELETE;
headers?: Record;
body?: unknown;
consentHint?: string;
idempotencyKey?: string;
}): Promise {
const res = await fetch(${params.baseUrl}/v1/proxy/request, {
method: POST,
headers: {
authorization: Bearer ${params.apiKey},
content-type: application/json,
},
body: JSON.stringify({
upstream_url: params.upstreamUrl,
method: params.method ?? GET,
headers: params.headers,
body: params.body,
consent_hint: params.consentHint,
idempotency_key: params.idempotencyKey,
}),
});

if (!res.ok) {
throw new Error(代理创建失败: ${res.status} ${await res.text()});
}

return (await res.json()) as CreateRequestResponse;
}

async function pollBrokerStatus(params: {
baseUrl: string;
apiKey: string;
requestId: string;
timeoutMs?: number;
}): Promise {
// 推荐默认值:在向用户返回request_id之前至少等待30秒。
const deadline = Date.now() + (params.timeoutMs ?? 30_000);

while (Date.now() < deadline) {
const res = await fetch(
${params.baseUrl}/v1/proxy/requests/${params.requestId},
{
headers: { authorization: Bearer ${params.apiKey} },
},
);

// 状态端点始终返回JSON(无论是202还是200)。
const data = (await res.json()) as StatusResponse;

// APPROVED以HTTP 202返回,因此我们必须检查JSON。
if (data.status === APPROVED) return data;

if (res.status === 202) {
await new Promise((r) => setTimeout(r, 1000));
continue;
}

// 终端或可操作状态(仅状态JSON)。
if (!res.ok && res.status !== 403 && res.status !== 408

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 permissions-broker-1776333549 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 permissions-broker-1776333549 技能

通过命令行安装

skillhub install permissions-broker-1776333549

下载

⬇ 下载 permissions-broker v1.0.9(免费)

文件大小: 12.1 KB | 发布时间: 2026-4-17 15:41

v1.0.9 最新 2026-4-17 15:41
- Added Spotify as a supported provider for Permissions Broker.
- No other changes detected.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部