golang多平台消息通知服务集成插件库shoutrrr的使用

Golang多平台消息通知服务集成插件库Shoutrrr的使用

Shoutrrr Logo

Shoutrrr是一个为Gopher及其毛茸茸的朋友们设计的通知库,灵感来源于caronc/apprise。

安装

使用Snap安装

$ sudo snap install shoutrrr

使用Go CLI安装

$ go install github.com/containrrr/shoutrrr/shoutrrr@latest

从源码构建

$ go build -o shoutrrr ./shoutrrr

快速开始

作为包使用

使用直接发送命令

url := "slack://token-a/token-b/token-c"
err := shoutrrr.Send(url, "Hello world (or slack channel) !")

使用发送器

url := "slack://token-a/token-b/token-c"
sender, err := shoutrrr.CreateSender(url)
sender.Send("Hello world (or slack channel) !", map[string]string { /* ... */ })

使用带有多个URL的发送器

urls := []string {
  "slack://token-a/token-b/token-c"
  "discord://token@channel"
}
sender, err := shoutrrr.CreateSender(urls...)
sender.Send("Hello world (or slack channel) !", map[string]string { /* ... */ })

通过CLI使用

首先运行build.sh脚本,然后可以使用shoutrrr可执行文件发送通知:

$ shoutrrr send [OPTIONS] <URL> <Message [...]>

从GitHub Actions工作流使用

你也可以在GitHub Actions工作流中使用Shoutrrr。

示例:

name: Deploy
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Some other steps needed for deploying
        run: ...
      - name: Shoutrrr
        uses: containrrr/shoutrrr-action@v1
        with:
          url: ${{ secrets.SHOUTRRR_URL }}
          title: Deployed ${{ github.sha }}
          message: See changes at ${{ github.event.compare }}.

文档

更多详情,请访问完整文档。

贡献者

感谢这些优秀的人们的贡献。

相关项目

  • watchtower - 自动化Docker容器基础镜像更新的进程,使用shoutrrr进行通知
  • kured - Kubernetes重启守护进程从1.7.0版本开始采用shoutrrr作为统一的通知方法
  • Green Orb - 一个多功能的"观察和报告"工具,用于你的应用程序日志

更多关于golang多平台消息通知服务集成插件库shoutrrr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang多平台消息通知服务集成插件库shoutrrr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Shoutrrr - Golang多平台消息通知服务集成库

Shoutrrr是一个强大的Golang库,用于集成多种消息通知服务。它支持超过30种通知服务,包括Slack、Discord、Telegram、Email等,允许开发者通过统一的API发送通知到不同平台。

安装

go get github.com/containrrr/shoutrrr

基本使用

1. 初始化通知发送器

package main

import (
	"fmt"
	"github.com/containrrr/shoutrrr"
)

func main() {
	// 创建通知URL (格式: service://token@host/path?param=value)
	discordURL := "discord://token@channel-id"
	slackURL := "slack://token-a/token-b/token-c"
	telegramURL := "telegram://shoutrrr:bot-token@telegram?channels=channel-name"
	
	// 创建发送器
	sender, err := shoutrrr.CreateSender(discordURL, slackURL, telegramURL)
	if err != nil {
		panic(err)
	}
}

2. 发送简单消息

err := sender.Send("Hello from Shoutrrr!", nil)
if err != nil {
	fmt.Println("发送失败:", err)
}

3. 发送带选项的消息

params := map[string]string{
	"title":   "重要通知",
	"color":   "green",
	"pretext": "系统警报",
}

err := sender.Send("服务器CPU使用率超过90%!", &shoutrrr.SendOptions{
	Params: params,
})

支持的平台示例

Discord

discordURL := "discord://token@channel-id"
sender, _ := shoutrrr.CreateSender(discordURL)
sender.Send("Discord通知测试", nil)

Slack

slackURL := "slack://token-a/token-b/token-c"
sender, _ := shoutrrr.CreateSender(slackURL)
sender.Send("Slack通知测试", nil)

Telegram

telegramURL := "telegram://shoutrrr:bot-token@telegram?channels=channel-name"
sender, _ := shoutrrr.CreateSender(telegramURL)
sender.Send("Telegram通知测试", nil)

Email (SMTP)

emailURL := "smtp://username:password@smtp.example.com:587/?from=from@example.com&to=to@example.com"
sender, _ := shoutrrr.CreateSender(emailURL)
sender.Send("邮件通知测试", nil)

高级功能

批量发送

urls := []string{
	"discord://token@channel-id",
	"slack://token-a/token-b/token-c",
	"telegram://shoutrrr:bot-token@telegram?channels=channel-name",
}

sender, _ := shoutrrr.CreateSender(urls...)
sender.Send("批量发送测试", nil)

错误处理

results := sender.Send("测试消息", nil)
for _, result := range results {
	if result.Err != nil {
		fmt.Printf("发送到 %s 失败: %v\n", result.Service, result.Err)
	} else {
		fmt.Printf("发送到 %s 成功\n", result.Service)
	}
}

自定义参数

params := map[string]string{
	"title":   "自定义标题",
	"color":   "warning",
	"icon":    ":fire:",
	"thread":  "true",
}

sender.Send("带参数的消息", &shoutrrr.SendOptions{
	Params: params,
})

最佳实践

  1. URL安全存储:将通知URL存储在环境变量或配置文件中,不要硬编码在代码中
  2. 错误重试:对于重要通知,实现简单的重试机制
  3. 速率限制:注意各平台的API调用限制
  4. 异步发送:对于非关键通知,考虑使用goroutine异步发送

完整示例

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/containrrr/shoutrrr"
)

func main() {
	// 从环境变量获取配置
	discordURL := os.Getenv("DISCORD_NOTIFICATION_URL")
	slackURL := os.Getenv("SLACK_NOTIFICATION_URL")

	if discordURL == "" || slackURL == "" {
		log.Fatal("请设置通知URL环境变量")
	}

	// 初始化发送器
	sender, err := shoutrrr.CreateSender(discordURL, slackURL)
	if err != nil {
		log.Fatalf("初始化通知发送器失败: %v", err)
	}

	// 发送消息
	message := "服务器监控警报: CPU使用率超过95%"
	params := map[string]string{
		"title":   "服务器警报",
		"color":   "danger",
	}

	results := sender.Send(message, &shoutrrr.SendOptions{
		Params: params,
	})

	// 处理结果
	for _, result := range results {
		if result.Err != nil {
			log.Printf("发送到 %s 失败: %v", result.Service, result.Err)
		} else {
			log.Printf("发送到 %s 成功", result.Service)
		}
	}
}

Shoutrrr的强大之处在于其统一接口和广泛的服务支持,使得在Golang应用中集成多种通知服务变得非常简单。

回到顶部