Sliver 项目中的 Pushover 推送集成:基于 gregdel/pushover 的 Go 消息推送实战指南
网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载本指南以仓库中 vendor/github.com/gregdel/pushover/README.md 为核心系统讲解如何在 Go 程序中用几行代码把通知推送到 Pushover用户或群组覆盖基础消息、富文本消息、图片附件、紧急通知回执、用户验证、限流信息、Glance 智能手表更新以及群组管理 API并结合 SliverAdversary Emulation Framework服务端 server/configs/notifications.go 与 server/notifications/builder.go 中的实际落地配置说明该库在真实项目中的集成方式。读完本文你将掌握该库全部公开 API 的用法、底层校验规则与默认限制并能在自己的 Go 项目中直接照搬可运行示例。一、库定位与核心概念pushover是围绕 Superblock 的 Pushover API 编写的 Go 封装库。它封装了 HTTP 请求、表单编码、JSON 解码、错误映射与限流头解析让开发者只需关心三个核心对象Pushover应用对应你在 Pushover 官网注册应用后拿到的 Application TokenRecipient接收者对应用户或群组统一使用各自的 User Key / Group Key 作为接收令牌Message消息描述要发送的内容与展示属性。Pushover与Recipient在创建时仅保存令牌字符串见 pushover.go 中的type Pushover struct { token string }与 recipient.go 中的type Recipient struct { token string }真正的校验发生在发送时。环境前提所有示例均使用github.com/gregdel/pushover包该包当前以 vendored 形式存在于 Sliver 仓库的vendor/github.com/gregdel/pushover/目录下因此引用时直接使用github.com/gregdel/pushover导入路径即可无需额外下载依赖。二、快速开始发送一条最简单的消息发送消息的完整流程可以用一个可运行的main.go概括。接收者既可以是单个用户也可以是群组二者的差异仅在于传入的令牌类型package main import ( log github.com/gregdel/pushover ) func main() { // 用应用令牌创建 Pushover 应用 app : pushover.New(uQiRzpo4DXghDmr9QzzfQu27cmVRsG) // 用用户/群组令牌创建接收者 recipient : pushover.NewRecipient(gznej3rKEVAvPUxu9vvNnqpmZpokzF) // 创建消息 message : pushover.NewMessage(Hello !) // 发送消息 response, err : app.SendMessage(message, recipient) if err ! nil { log.Panic(err) } // 打印响应含状态、请求 ID、回执、群组 ID、配额信息 log.Println(response) }底层发生了什么SendMessage的调用链从源码看pushover.go 中SendMessage依次执行三步校验然后才真正发出请求p.validate()校验应用令牌非空且匹配正则^[A-Za-z0-9]{30}$recipient.validate()对接收者令牌做同样的 30 位字母数字正则校验message.validate()校验消息内容、长度、优先级等字段最终调用message.send(p.token, recipient.token)向https://api.pushover.net/1/messages.json发起 POST 请求。也就是说即使令牌格式错误也会在发送前被本地拦截而不是等到 HTTP 层才报错。这一设计让绝大多数参数错误能在毫秒级被捕获避免无效网络请求。响应对象的结构Response定义在 response.go包含以下字段字段JSON 键含义Statusstatus1 表示成功IDrequest本次请求的唯一 IDErrorserrors服务端返回的错误信息Receiptreceipt紧急通知回执 IDGroupgroup创建群组时返回的群组 IDLimit响应头解析当月消息配额Response.String()会把配额信息格式化为Usage %d/%d messages\nNext reset : %s便于直接打印调试。三、构造更丰富的消息3.1 带标题的消息README 提供了便捷构造器NewMessageWithTitle一行代码即可同时设置正文与标题message : pushover.NewMessageWithTitle(My awesome message, My title)3.2 使用完整字段的富文本消息当需要精细控制展示效果时可以直接构造Message结构体。README 给出的示例几乎覆盖了全部可选字段message : pushover.Message{ Message: My awesome message, Title: My title, Priority: pushover.PriorityEmergency, URL: http://google.com, URLTitle: Google, Timestamp: time.Now().Unix(), Retry: 60 * time.Second, Expire: time.Hour, DeviceName: SuperDevice, CallbackURL: http://yourapp.com/callback, Sound: pushover.SoundCosmic, }对照 message.go 中Message结构体定义实际还支持以下两个布尔开关README 未展开但源码明确实现message : pushover.Message{ Message: monospace content, Monospace: true, // 等宽字体显示适合代码片段 HTML: true, // 以 HTML 渲染正文 }3.3 消息字段速查表源码级以下字段与限制均来自 message.go 与 pushover.go 的常量定义字段说明限制 / 默认行为Message正文必填最大 1024 字符MessageMaxLength空正文报ErrMessageEmptyTitle标题可选最大 250 字符MessageTitleMaxLengthURL附带链接可选最大 512 字符MessageURLMaxLengthURLTitle链接显示文字可选最大 100 字符MessageURLTitleMaxLength设置了URLTitle但未设置URL会报ErrEmptyURLPriority优先级取值 -2 到 2见下表Timestamp消息时间戳Unix 秒不设置则使用服务器时间Retry紧急通知重试间隔仅PriorityEmergency时生效必须非 0Expire紧急通知过期时间仅PriorityEmergency时生效必须非 0CallbackURL用户确认后回调地址仅紧急通知生效见 [四、紧急通知与回执]DeviceName目标设备支持逗号分隔多设备每台设备须匹配^[A-Za-z0-9_-]{1,25}$Sound提示音见下方声音常量表HTML以 HTML 渲染正文序列化为html1Monospace等宽字体渲染序列化为monospace1TTL消息有效期秒非 0 时序列化为ttl3.4 优先级常量与声音常量优先级定义在 pushover.goconst ( PriorityLowest -2 PriorityLow -1 PriorityNormal 0 PriorityHigh 1 PriorityEmergency 2 )其中PriorityEmergency2会额外要求Retry与Expire均为非 0否则校验失败返回ErrMissingEmergencyParameter优先级超出[-2, 2]范围返回ErrInvalidPriority。声音常量同样定义在 pushover.go包括SoundPushover、SoundBike、SoundBugle、SoundCashRegister、SoundClassical、SoundCosmic、SoundFalling、SoundGamelan、SoundIncoming、SoundIntermission、SoundMagic、SoundMechanical、SoundPianobar、SoundSiren、SoundSpaceAlarm、SoundTugBoat、SoundAlien、SoundClimb、SoundPersistent、SoundEcho、SoundUpDown、SoundVibrate、SoundNone。README 示例中的pushover.SoundCosmic即其中之一直接以常量引用可避免拼写错误。3.5 发送带图片附件的消息通过AddAttachment可以随消息附带图片传入任意实现了io.Reader的对象即可file, err : os.Open(/some/image.png) if err ! nil { panic(err) } defer file.Close() message : pushover.NewMessage(Hello !) if err : message.AddAttachment(file); err ! nil { panic(err) }从 message.go 的send方法可以看到一旦设置了 attachment请求会从 URL-encoded 表单切换为multipart/form-datamultipartRequest并以attachment作为文件字段名。附件上限为 2621440 字节约 2.5 MBMessageMaxAttachmentByte超限返回ErrMessageAttachmentTooLarge。调用方负责关闭传入的 reader。四、紧急通知与回执Callbacks and Receipts使用紧急优先级PriorityEmergency时必须同时指定Retry重试周期与Expire过期时间。发送成功后Response.Receipt会携带回执 ID用于查询确认状态或提前取消通知。4.1 查询回执详情... response, err : app.SendMessage(message, recipient) if err ! nil { log.Panic(err) } receiptDetails, err : app.GetReceiptDetails(response.Receipt) if err ! nil { log.Panic(err) } fmt.Println(Acknowledged status :, receiptDetails.Acknowledged)ReceiptDetailsreceipt_details.go提供以下状态字段字段含义Acknowledged是否已被接收者确认AcknowledgedBy确认人的设备信息Expired是否已过期CalledBack是否已触发回调AcknowledgedAt/LastDeliveredAt/ExpiresAt/CalledBackAt对应的时间点该结构体实现了自定义UnmarshalJSON把 API 返回的 0/1 整数布尔值与时间戳统一转换为 Go 原生的bool与*time.Time直接读取即可。底层对应GET https://api.pushover.net/1/receipts/{receipt}.json?token...见 pushover.go 的GetReceiptDetails。4.2 提前取消紧急通知在过期之前可以用回执 ID 主动取消正在重试的紧急通知response, err : app.CancelEmergencyNotification(response.Receipt) if err ! nil { log.Panic(err) }该方法对应POST https://api.pushover.net/1/receipts/{receipt}/cancel.json典型场景是当告警已经确认处理完毕不再需要持续向所有设备重试轰炸时立刻停止推送。五、用户验证User VerificationGetRecipientDetails用于验证接收者令牌是否有效同时返回其是否为群组以及绑定的设备列表... recipientDetails, err : app.GetRecipientDetails(recipient) if err ! nil { log.Panic(err) } fmt.Println(recipientDetails)RecipientDetails定义于 recipient.go结构如下字段JSON 键含义Statusstatus请求状态Groupgroup1 表示该令牌属于群组Devicesdevices该接收者绑定的设备列表RequestIDrequest请求 IDErrorserrors校验失败时的错误信息从源码看该请求以 URL-encoded POST 发送到https://api.pushover.net/1/users/validate.json参数为token与user若令牌在 Pushover 服务端无效错误会落在RecipientDetails.Errors中。注意即使本地格式校验通过最终有效性仍需服务端裁决因此它适合在注册/配置阶段做一次性预检。六、配额与限流信息API Limits每次成功发送消息后Pushover 会在响应头中返回当月配额。该库在 request.go 的do()中returnHeaderstrue时解析三个响应头并填充到Response.LimitX-Limit-App-Limit当月可发送消息总数X-Limit-App-Remaining剩余可发送数量X-Limit-App-Reset配额重置的 Unix 时间戳。Limit结构体定义于 limit.go包含Total、Remaining、NextReset time.Time三个字段。对于监控告警类应用这是判断是否需要降频或告警的风控依据——例如剩余配额低于阈值时切换消息优先级或改走其他通知通道。七、Glance 更新智能手表小部件数据除普通消息外该库还支持 Pushover 的 Glance APISendGlanceUpdate用于向智能手表等设备的小部件推送轻量数据。Glance结构体定义于 glances.goapp.SendGlanceUpdate(pushover.Glance{ Title: pushover.String(Widgets Sold), Text: pushover.String(42), Percent: pushover.Int(80), // 0-100某些屏幕渲染为进度环 Count: pushover.Int(-3), // 允许负数小屏显示简单计数 Subtext: pushover.String(today),// 第二行数据 }, recipient)要点字段采用指针类型*string/*int通过 glances.go 提供的String/Int辅助函数构造以便区分“未设置”与“设置为空”Title、Text、Subtext均限长 100 字符Percent必须在 0-100 之间否则分别返回ErrGlancesTitleTooLong/ErrGlancesTextTooLong/ErrGlancesSubtextTooLong/ErrGlancesInvalidPercent至少需要设置一个数据字段全部为空返回ErrGlancesMissingDataGlancesAllDevices空字符串可作为设备名向所有设备广播。八、群组管理 APIPushover对象还提供了一套完整的群组Delivery Group管理方法见 pushover.go 与 groups.go方法对应接口说明CreateGroup(name)POST /groups.json创建群组返回的Response.Group即群组 IDListGroups()GET /groups.json?token...列出群组返回GroupsListResponse含[]GroupGetGroup(groupKey)GET /groups/{key}.json?token...获取群组详情名称、用户列表、禁用状态AddUserToGroup(groupKey, userKey, device, memo)POST /groups/{key}/add_user.json添加用户可选关联设备与备注RemoveUserFromGroup(groupKey, userKey, device)POST /groups/{key}/remove_user.json移除用户可只移除某设备DisableUserInGroup(...)POST /groups/{key}/disable_user.json停用某用户/设备EnableUserInGroup(...)POST /groups/{key}/enable_user.json重新启用用户RenameGroup(groupKey, name)POST /groups/{key}/rename.json重命名群组Group与GroupDetailsResponse定义在 groups.go。这套 API 适合在程序启动时动态创建“按告警级别划分”的群组再向群组 ID 发送消息避免维护大量单个用户令牌。九、校验规则与错误处理源码级9.1 本地校验正则校验对象正则违例错误应用令牌^[A-Za-z0-9]{30}$ErrEmptyToken/ErrInvalidToken接收者令牌^[A-Za-z0-9]{30}$ErrEmptyRecipientToken/ErrInvalidRecipientToken设备名^[A-Za-z0-9_-]{1,25}$支持逗号分隔ErrInvalidDeviceName9.2 错误处理策略服务端返回的errors数组被建模为Errors []stringerrors.go其Error()方法会把多条错误逐行拼接在 request.go 的do()中HTTP 5xx 直接返回ErrHTTPPushover响应status ! 1时返回r.Errors发送消息时解析限流头失败会返回ErrInvalidHeaders全部预定义错误集中在 pushover.go覆盖空消息、超长标题/URL、缺失附件、缺失紧急参数、空回执、Glance 参数不合法等常见场景。实践建议对SendMessage的返回值统一做err ! nil判断并用errors.Is/ 类型断言区分“本地参数错误”应修复调用方代码与“服务端错误”应重试或告警。十、在 Sliver 中的实际落地服务端通知配置gregdel/pushover虽然作为独立库被 vendored但 Sliver 服务端并未直接调用它而是通过nikoksr/notify的通知服务层间接使用。这一点从 server/notifications/builder.go 的导入notifypushover github.com/nikoksr/notify/service/pushover可以确认。10.1 配置结构Sliver 的 server/configs/notifications.go 中定义了PushoverConfigtype PushoverConfig struct { NotificationServiceConfig json:,inline yaml:,inline // 内含 enabled 与 events AppToken string json:app_token yaml:app_token Recipients []string json:recipients yaml:recipients }即应用令牌app_token 接收者列表recipients与gregdel/pushover的“App Token Recipient Token”模型一一对应。10.2 服务端构建逻辑在 server/notifications/builder.go 的buildPushover中AppToken缺失或Recipients为空都会返回错误随后以service.AddReceivers(recipients...)注册多个接收者并仅在服务端配置notifications.enabled: true时才启动见Start()中对serverConfig.Notifications.Enabled的检查。10.3 官方文档中的 YAML 示例Sliver 官方文档 docs/sliver-docs/pages/docs/md/Notifications.md 给出了开箱即用的配置环境变量可用$VAR形式引用构建时会做环境变量展开services: pushover: enabled: true app_token: $PUSHOVER_APP_TOKEN recipients: - $PUSHOVER_USER_KEY可见要在 Sliver 中启用 Pushover 告警只需申请一个 Pushover 应用令牌和一个用户/群组 Key填入上述配置并重启服务端即可底层关于消息格式、回执、配额的能力则由本文前几节介绍的gregdel/pushover及其上游通知服务层提供。十一、总结与最佳实践最小接入成本pushover.NewNewRecipientNewMessageSendMessage四步即可完成第一条推送完整示例见本文第二节。优先使用紧急通知而非高频重试普通轮询会快速耗尽配额默认 7500 条/月见Limit解析逻辑紧急通知配合Receipt查询 CancelEmergencyNotification可以在告警解决后立即止损。善用本地校验令牌格式、消息长度、紧急参数、设备名都会在本地拦截编写调用代码时无需等 HTTP 往返就能发现错误。Glance 与群组管理适合作为运维监控面板的补充——Glance 提供手表级轻量视图群组 API 则适合动态管理告警接收组。Sliver 集成路径若想直接在 Sliver 服务端启用按 Notifications.md 中的services.pushover配置即可若要深度定制消息内容可参考本文第三、四节的字段与回执机制在自有 Go 服务中直接使用github.com/gregdel/pushover。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐Sliver 通知集成实战基于 nikoksr/notify 的 Pushover 推送服务接入指南Sliver 通知集成实战基于 nikoksr/notify 的 Pushover 推送服务接入指南 本篇技术指南以 nikoksr/notify 的 Pus网络安全Seerr 集成 Pushover 推送通知完整指南从应用注册、Token 配置到消息发送源码解析Seerr 集成 Pushover 推送通知完整指南从应用注册、Token 配置到消息发送源码解析 Seerr 内置 Pushover 通知代理Agent后端前端认证鉴权Hive 项目 Pushover 推送工具实战指南Agent 移动端通知的 MCP 集成与实现解析Hive 项目 Pushover 推送工具实战指南Agent 移动端通知的 MCP 集成与实现解析 本篇技术指南以 Pushover Tool 官方文档 ht人工智能AI Agent多智能体MCP 服务工具调用浏览器控制上一篇SQLite数据类型系统终极指南从存储格式到类型转换的完整解析下一篇终极指南如何快速集成 Angular-spinner 实现专业加载动画效果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考