golang Uptime Robot API v2 命令行客户端与封装插件库uptimerobot的使用

Golang Uptime Robot API v2 命令行客户端与封装插件库uptimerobot的使用

简介

uptimerobot 是一个用于 Uptime Robot 网站监控服务的 Go 库和命令行客户端。它允许您搜索现有监视器、删除监视器、创建新监视器,并检查您的账户详情和警报联系人。

安装命令行客户端

要安装客户端二进制文件,请运行:

go get -u github.com/bitfield/uptimerobot

在Docker中运行命令行客户端

要在Docker容器中使用客户端,请运行:

docker container run bitfield/uptimerobot

使用命令行客户端

要查看客户端的使用帮助,请运行:

uptimerobot -h

设置您的API密钥

要使用客户端与您的Uptime Robot账户,您需要账户的主API密钥。有三种方法可以将API密钥传递给客户端:在配置文件中、在环境变量中或在命令行中。

在配置文件中

uptimerobot 客户端将读取您主目录或当前目录中名为 .uptimerobot.yaml(或 .uptimerobot.json,或Viper支持的任何其他扩展名)的配置文件。

例如,您可以将API密钥放在文件 $HOME/.uptimerobot.yaml 中,uptimerobot 将自动找到并读取它(将 XXX 替换为您自己的API密钥):

apiKey: XXX

在环境变量中

uptimerobot 将在名为 UPTIMEROBOT_API_KEY 的环境变量中查找API密钥:

export UPTIMEROBOT_API_KEY=XXX
uptimerobot ...

在命令行中

您还可以使用 --apiKey 标志将API密钥传递给 uptimerobot 客户端,如下所示:

uptimerobot --apiKey XXX ...

测试您的配置

要测试您的API密钥是否正确以及 uptimerobot 是否正确读取它,请运行:

uptimerobot account

您应该看到您的账户详情列出:

Email: j.random@example.com
Monitor limit: 300
Monitor interval: 1
Up monitors: 208
Down monitors: 2
Paused monitors: 0

列出联系人

uptimerobot contacts 命令将按ID号列出您配置的警报联系人:

uptimerobot contacts
ID: 0102759
Name: Jay Random
Type: 2
Status: 2
Value: j.random@example.com

ID: 2053888
Name: Slack
Type: 11
Status: 2
Value: https://hooks.slack.com/services/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

列出或搜索监视器

使用 uptimerobot search 列出所有"友好名称"或检查URL匹配特定字符串的监视器:

uptimerobot search www.example.com
ID: 780689017
Name: Example.com website
URL: https://www.example.com/
Status: Up
Type: HTTP

删除监视器

注意要删除的监视器的ID号,并运行 uptimerobot delete

uptimerobot delete 780689017
Monitor ID 780689017 deleted

暂停或启动监视器

注意要暂停的监视器的ID号,并运行 uptimerobot pause

uptimerobot pause 780689017
Monitor ID 780689017 paused

要恢复暂停的监视器,请使用监视器ID运行 uptimerobot start

uptimerobot start 780689017
Monitor ID 780689017 started

创建新监视器

运行 uptimerobot new URL NAME 创建一个新监视器:

uptimerobot new https://www.example.com/ "Example.com website"
New monitor created with ID 780689018

要创建配置了警报联系人的新监视器,请使用 -c 标志,后跟逗号分隔的联系人ID列表,不带空格:

uptimerobot new -c 0102759,2053888 https://www.example.com/ "Example.com website"
New monitor created with ID 780689019

确保监视器存在

有时您只想在相同URL的监视器尚不存在时创建新监视器。这在自动化中特别有用。为此,请运行 uptimerobot ensure URL NAME

uptimerobot ensure https://www.example.com/ "Example.com website"
Monitor ID 780689018 ensured

检查版本号

要查看您使用的命令行客户端版本,请运行 uptimerobot version

查看调试输出

当事情没有按预期进行时,您可以在命令行中添加 --debug 标志,以查看来自服务器的HTTP请求和响应的转储。

使用Go库

如果命令行客户端不完全符合您的需求,或者您想在自己的程序中使用Uptime Robot API访问,请使用以下方式导入库:

import "github.com/bitfield/uptimerobot/pkg"

通过调用 uptimerobot.New() 并传入API密钥来创建新的 Client 对象:

client = uptimerobot.New(apiKey)

一旦有了客户端,您就可以使用它来调用各种Uptime Robot API功能:

monitors, err := client.AllMonitors()
if err != nil {
        log.Fatal(err)
}
for _, m := range monitors {
        fmt.Println(m)
        fmt.Println()
}

完整示例

以下是一个完整的Go程序示例,演示如何使用uptimerobot库:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/bitfield/uptimerobot/pkg"
)

func main() {
	// 从环境变量获取API密钥
	apiKey := os.Getenv("UPTIMEROBOT_API_KEY")
	if apiKey == "" {
		log.Fatal("请设置UPTIMEROBOT_API_KEY环境变量")
	}

	// 创建新的客户端
	client := uptimerobot.New(apiKey)

	// 获取所有监视器
	monitors, err := client.AllMonitors()
	if err != nil {
		log.Fatal(err)
	}

	// 打印所有监视器信息
	fmt.Println("当前监视器列表:")
	for _, m := range monitors {
		fmt.Printf("ID: %d\n", m.ID)
		fmt.Printf("名称: %s\n", m.FriendlyName)
		fmt.Printf("URL: %s\n", m.URL)
		fmt.Printf("状态: %s\n", m.Status)
		fmt.Println("------------------")
	}

	// 创建一个新监视器
	newMonitor := uptimerobot.Monitor{
		FriendlyName: "示例网站监控",
		URL:         "https://example.com",
		Type:        1, // HTTP监控
	}
	createdMonitor, err := client.CreateMonitor(newMonitor)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("已创建新监视器,ID: %d\n", createdMonitor.ID)

	// 删除监视器(示例,实际使用时请谨慎)
	// if err := client.DeleteMonitor(createdMonitor.ID); err != nil {
	// 	log.Fatal(err)
	// }
	// fmt.Printf("已删除监视器ID: %d\n", createdMonitor.ID)
}

错误和功能请求

如果您在 uptimerobot 客户端或库中发现错误,请打开问题。同样,如果您希望添加或改进功能,请通过问题告知我。

尚未实现Uptime Robot API的所有功能。欢迎提交拉取请求!


更多关于golang Uptime Robot API v2 命令行客户端与封装插件库uptimerobot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Uptime Robot API v2 命令行客户端与封装插件库uptimerobot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang Uptime Robot API v2 客户端与封装库使用指南

Uptime Robot 是一个流行的网站监控服务,其 API v2 允许开发者以编程方式管理监控项。下面我将介绍如何使用 Golang 与 Uptime Robot API v2 交互,包括直接调用 API 和使用封装库 github.com/bitfield/uptimerobot

1. 直接调用 Uptime Robot API v2

首先,我们来看如何直接使用 HTTP 客户端与 API 交互:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

const (
	apiKey      = "your_api_key"
	apiEndpoint = "https://api.uptimerobot.com/v2/"
)

type Monitor struct {
	ID             int    `json:"id"`
	FriendlyName   string `json:"friendly_name"`
	URL            string `json:"url"`
	Type           int    `json:"type"`
	Status         int    `json:"status"`
	Interval       int    `json:"interval"`
	CreateDateTime int    `json:"create_datetime"`
}

type GetMonitorsResponse struct {
	Stat       string    `json:"stat"`
	Pagination struct{}  `json:"pagination"`
	Monitors   []Monitor `json:"monitors"`
}

func getMonitors() ([]Monitor, error) {
	url := apiEndpoint + "getMonitors"

	payload := map[string]string{
		"api_key":      apiKey,
		"format":       "json",
		"logs":         "1",
		"response_times": "1",
	}

	jsonPayload, _ := json.Marshal(payload)
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonPayload))
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)

	var response GetMonitorsResponse
	if err := json.Unmarshal(body, &response); err != nil {
		return nil, err
	}

	if response.Stat != "ok" {
		return nil, fmt.Errorf("API request failed")
	}

	return response.Monitors, nil
}

func main() {
	monitors, err := getMonitors()
	if err != nil {
		fmt.Printf("Error getting monitors: %v\n", err)
		return
	}

	fmt.Println("Your Uptime Robot Monitors:")
	for _, m := range monitors {
		fmt.Printf("ID: %d, Name: %s, URL: %s, Status: %d\n", 
			m.ID, m.FriendlyName, m.URL, m.Status)
	}
}

2. 使用 uptimerobot 封装库

github.com/bitfield/uptimerobot 是一个第三方库,提供了更简洁的 API 封装。

安装

go get github.com/bitfield/uptimerobot

使用示例

package main

import (
	"fmt"
	"log"

	"github.com/bitfield/uptimerobot"
)

func main() {
	// 创建客户端
	client := uptimerobot.New("your_api_key")

	// 获取所有监控项
	monitors, err := client.GetMonitors()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Your Uptime Robot Monitors:")
	for _, m := range monitors {
		fmt.Printf("ID: %d, Name: %s, URL: %s, Status: %s\n",
			m.ID, m.FriendlyName, m.URL, m.Status)
	}

	// 创建新监控项
	newMonitor := uptimerobot.Monitor{
		FriendlyName: "Example Site",
		URL:         "https://example.com",
		Type:        uptimerobot.TypeHTTP,
	}
	createdMonitor, err := client.CreateMonitor(newMonitor)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Created monitor with ID %d\n", createdMonitor.ID)

	// 删除监控项
	err = client.DeleteMonitor(createdMonitor.ID)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Deleted monitor with ID %d\n", createdMonitor.ID)
}

3. 命令行客户端实现

下面是一个简单的命令行客户端实现:

package main

import (
	"flag"
	"fmt"
	"log"
	"os"

	"github.com/bitfield/uptimerobot"
)

var (
	apiKey   string
	action   string
	name     string
	url      string
	monitorID int
)

func init() {
	flag.StringVar(&apiKey, "key", "", "Uptime Robot API key")
	flag.StringVar(&action, "action", "list", "Action to perform (list|create|delete)")
	flag.StringVar(&name, "name", "", "Monitor friendly name (for create)")
	flag.StringVar(&url, "url", "", "URL to monitor (for create)")
	flag.IntVar(&monitorID, "id", 0, "Monitor ID (for delete)")
}

func main() {
	flag.Parse()

	if apiKey == "" {
		apiKey = os.Getenv("UPTIMEROBOT_API_KEY")
		if apiKey == "" {
			log.Fatal("API key must be provided via -key flag or UPTIMEROBOT_API_KEY environment variable")
		}
	}

	client := uptimerobot.New(apiKey)

	switch action {
	case "list":
		listMonitors(client)
	case "create":
		createMonitor(client)
	case "delete":
		deleteMonitor(client)
	default:
		log.Fatalf("Unknown action: %s", action)
	}
}

func listMonitors(client *uptimerobot.Client) {
	monitors, err := client.GetMonitors()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Your Uptime Robot Monitors:")
	for _, m := range monitors {
		fmt.Printf("ID: %d, Name: %s, URL: %s, Status: %s\n",
			m.ID, m.FriendlyName, m.URL, m.Status)
	}
}

func createMonitor(client *uptimerobot.Client) {
	if name == "" || url == "" {
		log.Fatal("Both -name and -url are required for create action")
	}

	newMonitor := uptimerobot.Monitor{
		FriendlyName: name,
		URL:         url,
		Type:        uptimerobot.TypeHTTP,
	}

	monitor, err := client.CreateMonitor(newMonitor)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Successfully created monitor with ID %d\n", monitor.ID)
}

func deleteMonitor(client *uptimerobot.Client) {
	if monitorID == 0 {
		log.Fatal("Monitor ID must be provided with -id flag for delete action")
	}

	err := client.DeleteMonitor(monitorID)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Successfully deleted monitor with ID %d\n", monitorID)
}

4. 高级功能

监控间隔设置

// 创建每5分钟检查一次的监控
newMonitor := uptimerobot.Monitor{
	FriendlyName: "Critical Service",
	URL:         "https://critical.example.com",
	Type:        uptimerobot.TypeHTTP,
	Interval:    5, // 以分钟为单位
}

获取监控日志

logs, err := client.GetMonitorLogs(monitorID)
if err != nil {
	log.Fatal(err)
}

for _, logEntry := range logs {
	fmt.Printf("%s: %s (%dms)\n", 
		logEntry.DateTime, logEntry.Type, logEntry.Duration)
}

总结

本文介绍了三种与 Uptime Robot API v2 交互的方式:

  1. 直接使用 HTTP 客户端调用原始 API
  2. 使用 github.com/bitfield/uptimerobot 封装库
  3. 构建命令行客户端

封装库提供了更简洁的 API 和类型安全,适合大多数用例。对于特殊需求,可以直接调用 API。命令行客户端可以作为日常管理工具使用。

记得妥善保管你的 API 密钥,不要将其硬编码在代码中或提交到版本控制系统。

回到顶部