跳转至

Webhook 与 API 密钥

无需编写插件,也有两种方式把 Evey 与其他工具连接起来:Webhook 把服务器的事件发送到您指定的网址, API 密钥让脚本以您的身份调用服务器。两者都由管理员在管理面板里创建; 本页写给负责设置它们的人,也写给编写接收端或脚本的人。

把事件发送到一个网址

管理 → Webhooks → 创建 Webhook:填写名称、URL、要发送的事件,以及一个可选的密钥,用于签名。 测试会发送一个 ping,并显示对方的回应。

管理 → Webhooks 中的一个 Webhook
一个在每次播放开始和结束时发送通知的 Webhook(界面为英文)。

事件。 Webhook 可以订阅所有事件,也可以只订阅您挑选的一部分。表单里列出了服务器发布的全部事件,其中包括:

领域 事件
媒体库 library.scan.started、library.scan.completed、media.item.added、media.item.updated、media.item.removed、metadata.refreshed
播放 playback.started、playback.stopped、media.marked.watched、transcode.started、transcode.failed
账户 user.created、user.login.succeeded、user.login.failed、user.profile.created、user.apikey.created
请求 media.request.created、media.request.answered
服务器 backup.created、backup.failed、plugin.installed、plugin.error、server.config.changed、transcoding.derived_cache_full(字幕存储的剩余空间低于预留余量)

调用 EmitEvent 的插件会发布 plugin.event.<type>,订阅了所有事件的 Webhook 也会收到它。

投递。 每个事件都是一个 JSON 格式的 POST 请求,带有两个请求头:

  • X-Evey-Delivery:一个标识符,同一次投递的多次重试都使用同一个值,这样您的接收端就能忽略重复的请求;
  • X-Evey-Signature:sha256= 后面跟着请求体的 HMAC-SHA256,用 Webhook 的密钥计算。 用同一个密钥验证它,就能确认请求来自您的服务器。没有设置密钥时,这个签名什么也证明不了。

每次尝试最多等待 30 秒的回应。投递失败后,会在 1 秒、5 秒和 30 秒后重试。每次尝试都会被记录; 这份历史要通过 API 读取(插件 API 里的 ListWebhookDeliveries),在面板里看不到。

只允许公网地址

Webhook 的 URL 必须是 http 或 https,并且指向一个公网地址。 localhost、私有地址和链路本地地址(192.168.x.x、10.x.x.x、172.16.x.x……), 以及解析到这类地址的域名,都会被拒绝:保存 Webhook 时检查一次,服务器发起连接时再检查一次。 这样可以防止服务器被用来访问您的内部网络;如果接收端在您的本地网络里,它需要一个公网地址或一个中继。

从脚本调用服务器

API 密钥让脚本不用密码就能调用服务器 API。密钥由管理员在管理 → API 密钥 → 新建 API 密钥里创建,归这位管理员所有。

  • 密钥只显示一次,就在创建的时候。请在此时保存;之后无法再显示,只能用撤销作废。
  • 它以所有者的身份行事,在自己的权限范围内拥有管理员权限。
  • 权限范围限制密钥能做的事:
权限范围 允许
media:read 读取媒体元数据
media:write 修改媒体,启动扫描
playback:read 读取播放状态和历史
playback:write 控制播放和进度
users:read 读取用户
users:write 修改用户
admin:read 读取管理活动和统计数据
admin:write 修改管理设置

不带任何权限范围创建的密钥(全部(旧版))可以完整访问所有非管理类方法,和它的所有者一样; 但管理类方法总是要求对应的权限范围,所以旧版密钥无法调用这些方法。请只勾选脚本需要的权限范围。

密钥放在 Authorization 请求头里,带不带 Bearer 都可以:

curl -H "Authorization: Bearer evey_..." https://media.example.com/api/v1/...

密钥一旦被撤销,或者它的所有者被停用,就会立即失效。端点本身列在服务器 API 里,那里也介绍了其他身份验证方式。