TicketWave Logo
Webhooks

事件参考

每种 webhook 事件类型以及 TicketWave 发送的准确负载。

事件参考

每个端点最多可订阅六种事件类型。每个请求都使用相同的信封——eventtimestampguild_iddata——只有 data 对象不同。

事件触发时机
ticket.created工单被创建时
ticket.closed工单被关闭时
ticket.updated打开的工单发生其他任何变更时
message.sent成员或客服在工单中发言时
blacklist.added成员被加入黑名单时
blacklist.removed黑名单条目被移除时

无法解析的字段会以 null 发送,而不是被省略——因此你可以依赖这些键始终存在。当 Discord 没有返回用户时,usernamenull

共享字段

每个工单事件都包含这些字段:

字段类型描述
ticket_idstring来自你模板的可读工单 ID,例如 ticket-1042
ticket_num_idnumber递增的工单编号,例如 1042
channel_idstring该工单对应的 Discord 频道
categorystring | null分类名称;如果工单没有分类则为 null
userobject | null工单所有者,格式为 { id, username }

ticket.created

在工单频道创建后立即发送。

{
  "event": "ticket.created",
  "timestamp": "2026-08-26T08:23:11.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "ticket_id": "ticket-1042",
    "ticket_num_id": 1042,
    "channel_id": "998877665544332211",
    "category": "🤖 Support",
    "user": { "id": "987654321098765432", "username": "Luna" },
    "created_at": "2026-08-26T08:23:11.000Z"
  }
}

这会在工单被打开时触发,也就是成员还没有写任何内容之前。如果你需要第一条消息,也请监听 message.sent


ticket.closed

{
  "event": "ticket.closed",
  "timestamp": "2026-08-26T07:45:02.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "ticket_id": "ticket-1041",
    "ticket_num_id": 1041,
    "channel_id": "998877665544332211",
    "category": "💸 Payment",
    "user": { "id": "987654321098765432", "username": "Luna" },
    "closed_by": { "id": "112233445566778899", "username": "Staff_01" },
    "reason": "Issue resolved",
    "closed_at": "2026-08-26T07:45:02.000Z"
  }
}
字段类型描述
closed_byobject谁关闭了它。自动关闭会显示机器人
reasonstring | null关闭原因;如果没有提供则为 null

ticket.updated

用于打开工单的所有变更。action 告诉你发生了什么changes 则包含该具体操作的详细信息。

{
  "event": "ticket.updated",
  "timestamp": "2026-08-26T14:02:19.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "ticket_id": "ticket-1038",
    "ticket_num_id": 1038,
    "channel_id": "998877665544332211",
    "category": "🤖 Support",
    "user": { "id": "987654321098765432", "username": "Luna" },
    "action": "ticket_priority:add",
    "changes": { "priority": "high" },
    "reason": null,
    "updated_by": { "id": "112233445566778899", "username": "Staff_01" }
  }
}

可能的 action

action含义changes 包含
ticket_claim:add客服成员认领了工单(空)
ticket_unclaim:add认领已被取消(空)
ticket_priority:add优先级已更改priority
ticket_rename:add频道已重命名new_name
ticket_remind:add已发送提醒(空)
ticket_feedback:add成员对工单进行了评分star_countfeedback
ticket_schedule_close:add已安排关闭durationschedule_time
ticket_request_close:add客服要求成员关闭工单durationrequest_duration_time
ticket_request_close_accept:add成员已接受(空)
ticket_request_close_deny:add成员已拒绝(空)
ticket_close_cancel:add正在进行的关闭已取消(空)
ticket_additional_access:add用户或角色已被添加到工单entity_typeentity_idreason
ticket_additional_access:remove用户或角色已被移除entity_typeentity_idreason

请将此列表视为开放式。随着 TicketWave 的发展,会不断新增动作,它们都会以 ticket.updated 的形式到达。请只处理你关心的动作,其余忽略,不要在遇到未知值时直接报错。

回答工单步骤不会产生事件。否则,一个包含很多步骤的工单会在成员填写表单时不断向你的端点发送请求。


message.sent

在打开的工单内,每条人工消息都会发送。来自机器人的消息——包括 TicketWave 自己——会被跳过。

{
  "event": "message.sent",
  "timestamp": "2026-08-26T22:10:55.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "ticket_id": "ticket-1040",
    "ticket_num_id": 1040,
    "channel_id": "998877665544332211",
    "message_id": "1234567890123456789",
    "content": "Hello, how can I help you?",
    "author": { "id": "112233445566778899", "username": "Staff_01" },
    "is_staff": true,
    "sent_at": "2026-08-26T22:10:55.000Z"
  }
}
字段类型描述
contentstring原始消息文本。仅包含附件的消息则为空
authorobject发送者的 { id, username }
is_staffboolean如果发送者拥有已配置的支持角色,则为 true

这是请求量最高的事件,远远高于其他事件——繁忙的服务器每条消息都会产生一次请求。只有在你确实需要消息级数据时才订阅它,并确保你的接收端能快速响应。


blacklist.added

与工单无关,因此这个负载没有 ticket_id

{
  "event": "blacklist.added",
  "timestamp": "2026-08-26T18:33:47.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "user": { "id": "111223344556677889", "username": "BadActor" },
    "reason": "Spam",
    "added_by": { "id": "112233445566778899", "username": "Staff_01" }
  }
}

blacklist.removed

{
  "event": "blacklist.removed",
  "timestamp": "2026-08-26T18:40:12.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "user": { "id": "111223344556677889", "username": "BadActor" },
    "removed_by": { "id": "112233445566778899", "username": "Staff_01" }
  }
}

测试事件

发送测试事件按钮会发送一条真实的、已签名的请求,其 data 仅为:

{
  "event": "ticket.created",
  "timestamp": "2026-08-26T12:00:00.000Z",
  "guild_id": "123456789012345678",
  "data": { "test": true }
}

event 是该端点订阅的第一个类型。如果你想在生产逻辑中跳过测试投递,请检查 data.test

下一步

How is this guide?