golang调用钉钉webhook发送消息
Published on 2023-01-29 14:35 in 分类: Golang with wushaoyu
分类: Golang

golang调用钉钉webhook发送消息

    golang使用dingtalk的webhook地址,发送消息通知

      此处用于记录golang调用dingtalk webhook地址发送消息通知,方便后续参考使用;

    一、使用http包

      自己拼接消息体,使用http包的post请求来发送消息,代码示例如下:(注意,发送消息需要满足钉钉机器人安全设置中的关键字或ip白名单要求)

    复制代码
    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "strings"
    )
    
    func test(msg string) {
        //请求地址模板
        webHook := `https://oapi.dingtalk.com/robot/send?access_token=1d1df1228e4b3af5552b16964b4a3c61eaedbd4754817394090712db4191fd86`
        // content := `{"msgtype": "text",
        //         "text": {"content": "` + "告警" + msg + `"}
        //     }`
    
        content := `{"msgtype": "text",
        "text": {"content": "` + "告警test" + msg + `"},
             "at": {
                "atMobiles": [
                  "15071244227"
                ],
                "isAtAll": false
             }
           }`
        //创建一个请求
        req, err := http.NewRequest("POST", webHook, strings.NewReader(content))
        if err != nil {
            fmt.Println(err)
        }
    
        client := &http.Client{}
        //设置请求头
        req.Header.Set("Content-Type", "application/json; charset=utf-8")
        //发送请求
        resp, err := client.Do(req)
        //关闭请求
        defer resp.Body.Close()
    
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            panic(err)
        }
        fmt.Println(string(body))
    
    }
    
    func main() {
        test("testssssssssss")
    }
    复制代码

    二、使用"github.com/CodyGuo/dingtalk"包

      使用三方dingtalk包实现 webhook的调用及消息发送,代码示例:

    复制代码
    package main
    
    import (
        "io/ioutil"
    
        "github.com/CodyGuo/dingtalk"
        "github.com/CodyGuo/dingtalk/pkg/robot"
        "github.com/CodyGuo/glog"
    )
    
    func main() {
        glog.SetFlags(glog.LglogFlags)
        webHook := "https://oapi.dingtalk.com/robot/send?access_token=xxxx"
        // **,机器人安全设置页面,加签一栏勾选之后下面显示的SEC开头的字符串
        secret := "xxxx"
        dt := dingtalk.New(webHook, dingtalk.WithSecret(secret))
    
        // text类型
        textContent := "我就是我, 是不一样的烟火@176XXXXXXXX"
        atMobiles := robot.SendWithAtMobiles([]string{"@176XXXXXXXX"})
        // atMobiles := robot.SendWithAtMobiles([]string{"@176XXXXXXXX", "178xxxxxx28"})
        if err := dt.RobotSendText(textContent, atMobiles); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    
        // link类型
        linkTitle := "时代的火车向前开"
        linkText := `这个即将发布的新版本,创始人xx称它为“红树林”。` +
            `而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,` +
            `这一次,为什么是“红树林”?`
        linkMessageURL := "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"
        linkPicURL := "https://cdn.pixabay.com/photo/2020/05/05/08/05/butterfly-5131967_960_720.jpg"
        if err := dt.RobotSendLink(linkTitle, linkText, linkMessageURL, linkPicURL); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    
        // markdown类型
        markdownTitle := "markdown"
        markdownText := "#### 杭州天气 @176XXXXXXXX\n" +
            "> 9度,西北风1级,空气良89,相对温度73%\n" +
            "> ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n" +
            "> ###### 10点20分发布 [天气](https://www.dingtalk.com)\n"
        if err := dt.RobotSendMarkdown(markdownTitle, markdownText); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    
        // 整体跳转ActionCard类型
        actionCardTitle := "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身"
        actionCardText := "![screenshot](@lADOpwk3K80C0M0FoA)\n" +
            "### 乔布斯 20 年前想打造的苹果咖啡厅\n" +
            "Apple Store 的设计正从原来满满的科技感走向生活化," +
            "而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划"
        actionCardSingleTitle := "阅读全文"
        actionCardSingleURL := "https://www.dingtalk.com/"
        actionCardBtnOrientation := "0"
        if err := dt.RobotSendEntiretyActionCard(actionCardTitle,
            actionCardText,
            actionCardSingleTitle,
            actionCardSingleURL,
            actionCardBtnOrientation); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    
        // 独立跳转ActionCard类型
        btns := map[string]string{
            "内容不错": actionCardSingleURL,
            "不感兴趣": actionCardSingleURL,
        }
        if err := dt.RobotSendIndependentActionCard(actionCardTitle,
            actionCardText,
            actionCardBtnOrientation,
            btns); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    
        // FeedCard类型
        link1 := robot.FeedCardLink{
            Title:      linkTitle,
            MessageURL: linkMessageURL,
            PicURL:     linkPicURL,
        }
        link2 := robot.FeedCardLink{
            Title:      linkTitle + "2",
            MessageURL: linkMessageURL,
            PicURL:     linkPicURL,
        }
        links := []robot.FeedCardLink{link1, link2}
        if err := dt.RobotSendFeedCard(links); err != nil {
            glog.Fatal(err)
        }
        printResult(dt)
    }
    
    func printResult(dt *dingtalk.DingTalk) {
        response, err := dt.GetResponse()
        if err != nil {
            glog.Fatal(err)
        }
        reqBody, err := response.Request.GetBody()
        if err != nil {
            glog.Fatal(err)
        }
        reqData, err := ioutil.ReadAll(reqBody)
        if err != nil {
            glog.Fatal(err)
        }
        glog.Infof("发送消息成功, message: %s", reqData)
    }
    复制代码

    结果如下:

     

     

     

    posted @   wushaoyu  阅读(977)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 震惊!C++程序真的从main开始吗?99%的程序员都答错了
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 单元测试从入门到精通
    · winform 绘制太阳,地球,月球 运作规律
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示