[原创]Golang一行代码给钉钉群推送消息

[原创]Golang一行代码给钉钉群推送消息

钉钉本来就是工具,只是boss把你变成了工具. — 麦·卡隆

今天朋友扔给我个某签到脚本,让我做推送功能.

我迅速从吃灰收藏夹里掏出Sever酱,结果…似乎它经历了一些可怕的事情…

总之,每天推送最多5条.

(咱也不差这几个money,买个会员支持一下呗)

为了照顾互联网最大帮派白嫖党,我决定再找一个新的解决方案.

需求:

  1. 主流平台推送
  2. 直接调用
  3. 兼容各种平台
  4. 甲方满意

经过伟大的一番科学发现,终于让我找到合适的解决方案.

最终选择: 钉钉群聊机器人

参考钉钉官方文档:https://developers.dingtalk.com/document/robots/custom-robot-access

发现是纯API调用,直接POST万事大吉.

第一步 创建并获取自定义机器人Webhook

(以下文字Copy官方文档)

  1. 选择需要添加机器人的群聊,然后依次单击群设置 > 智能群助手。

[原创]Golang一行代码给钉钉群推送消息
  1. 在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像。
    [原创]Golang一行代码给钉钉群推送消息
  2. 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成。
    [原创]Golang一行代码给钉钉群推送消息
    (我还没写完密钥方式发送的代码,可以先用着别人的包)
  3. 完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX
然后,我决定用Golang写个史诗级懒人调用包

第二步 写DingBot包

第一步, Goland 直接一键导入全部 json 转结构体:

点击查看神必代码

package dingbot

// Text 文本json
type dText struct {
    At struct {
        AtMobiles []string json:"atMobiles"
        AtUserIds []string json:"atUserIds"
        IsAtAll   bool     json:"isAtAll"
    } json:"at"
    Text struct {
        Content string json:"content"
    } json:"text"
    Msgtype string json:"msgtype"
}

//Link Link型json
type dLink struct {
    Msgtype string json:"msgtype"
    Link    struct {
        Text       string json:"text"
        Title      string json:"title"
        PicUrl     string json:"picUrl"
        MessageUrl string json:"messageUrl"
    } json:"link"
}

//MD Markdown型json
type dMD struct {
    Msgtype  string json:"msgtype"
    Markdown struct {
        Title string json:"title"
        Text  string json:"text"
    } json:"markdown"
    At struct {
        AtMobiles []string json:"atMobiles"
        AtUserIds []string json:"atUserIds"
        IsAtAll   bool     json:"isAtAll"
    } json:"at"
}

// AActionCard 整体跳转ActionCard类型
type dAActionCard struct {
    ActionCard struct {
        Title          string json:"title"
        Text           string json:"text"
        BtnOrientation string json:"btnOrientation"
        SingleTitle    string json:"singleTitle"
        SingleURL      string json:"singleURL"
    } json:"actionCard"
    Msgtype string json:"msgtype"
}

// DActionCard 独立跳转ActionCard类型
type dDActionCard struct {
    Msgtype    string json:"msgtype"
    ActionCard struct {
        Title          string json:"title"
        Text           string json:"text"
        BtnOrientation string json:"btnOrientation"
        Btns           []struct {
            Title     string json:"title"
            ActionURL string json:"actionURL"
        } json:"btns"
    } json:"actionCard"
}

// FeedCard FeedCard类型
type dFeedCard struct {
    Msgtype  string json:"msgtype"
    FeedCard struct {
        Links []struct {
            Title      string json:"title"
            MessageURL string json:"messageURL"
            PicURL     string json:"picURL"
        } json:"links"
    } json:"feedCard"
}

// ErrorReport 返回的错误
type dErrorReport struct {
    Errcode int    json:"errcode"
    Errmsg  string json:"errmsg"
}

可以非常清楚的看到机器人一共有6种(准确说是5种)方式发送消息.

然后,用最蠢方式再Copy个Post代码:

点击查看更神必的代码

package dingbot

// from https://github.com/CatchZeng/dingtalk

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

const httpTimoutSecond = time.Duration(30) * time.Second

func send(message []byte, pushURL string) (*dErrorReport, error) {
    res := &dErrorReport{}

    reqBytes := message

    req, err := http.NewRequest(http.MethodPost, pushURL, bytes.NewReader(reqBytes))
    if err != nil {
        return res, err
    }
    req.Header.Add("Accept-Charset", "utf8")
    req.Header.Add("Content-Type", "application/json")

    client := new(http.Client)
    client.Timeout = httpTimoutSecond
    resp, err := client.Do(req)
    if err != nil {
        return res, err
    }
    defer resp.Body.Close()

    resultByte, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return res, err
    }

    err = json.Unmarshal(resultByte, &res)
    if err != nil {
        return res, fmt.Errorf("unmarshal http response body from json error = %w", err)
    }

    if res.Errcode != 0 {
        return res, fmt.Errorf("send message to dingtalk error = %s", res.Errmsg)
    }

    return res, nil
}

感谢前辈CatchZeng的Dingtalk包.

最后,闭眼写个函数实现:

const URL = "https://oapi.dingtalk.com/robot/send?access_token="

// Text 推送文本
func Text(token string, content string, AtMobiles []string, AtUserIds []string, IsAtAll bool) error {
    t := new(dText)
    t.Text = struct {
        Content string json:"content"
    }(struct{ Content string }{Content: content})
    t.At = struct {
        AtMobiles []string json:"atMobiles"
        AtUserIds []string json:"atUserIds"
        IsAtAll   bool     json:"isAtAll"
    }(struct {
        AtMobiles []string
        AtUserIds []string
        IsAtAll   bool
    }{AtMobiles: AtMobiles, AtUserIds: AtUserIds, IsAtAll: IsAtAll})
    t.Msgtype = "text"
    if jsonByte, err := json.Marshal(t); err != nil {
        return err
    } else if _, err := send(jsonByte, URL+token); err != nil {
        return err
    }
    return nil

大功告成!来试试一行代码调用

//func Text(token string, content string, AtMobiles []string, AtUserIds []string, IsAtAll bool) error
dingbot.Text("123","hello",[]string{},[]string{},false)

效果还是很不错的

[原创]Golang一行代码给钉钉群推送消息
[原创]Golang一行代码给钉钉群推送消息

因为我的钉钉里有一些不可描述的东西,这次就不截图啦!

源码地址:https://github.com/EldersJavas/EsDingTalkBot_Go

Go文档:https://pkg.go.dev/github.com/EldersJavas/EsDingTalkBot_Go

作者:麦卡隆
转载带上链接哦!

Original: https://www.cnblogs.com/maicarons/p/15314401.html
Author: Maicarons
Title: [原创]Golang一行代码给钉钉群推送消息

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516588/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表

    目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor…

    Go语言 2023年5月25日
    051
  • Minio SDK访问Bucket的策略配置

    配置用户来访问 Bucket Minio 是高性能的对象存储服务,基于golang开发的,可以本地部署。用它来管理自己系统中的上传下载的文件很方便。​ 通过 SDK 访问 Mini…

    Go语言 2023年5月25日
    076
  • Go语言之高级篇beego框架之配置beego环境

    1、配置beego环境 进入部署目录中 软件部署目录: 把要部署的软件代码,放在src目录下面。 启动项目 posted @2019-02-18 15:31 努力哥 阅读(938 …

    Go语言 2023年5月29日
    065
  • Go语言实现并行分段求和计算

    这个实例通过循环实现并行的分段求和计算,再把各个子段和加到总和中。 通过这个实例可以了解如何实现循环并行处理,以及有关的编程技巧。 但是这个程序是有问题的,因为可能发生变量访问冲突…

    Go语言 2023年5月29日
    040
  • Go语言之高级篇beego框架之model设计构造查询

    一、model设计构造查询 QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句。 QueryBuilder…

    Go语言 2023年5月29日
    036
  • go微服务框架Kratos笔记(四)使用nacos作为远端配置中心

    初识nacos nacos是阿里开源的一款用于动态服务发现、配置管理和服务管理的平台。 官方介绍,Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特…

    Go语言 2023年5月25日
    068
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    071
  • 惨,给Go提的代码被批麻了

    hello大家好,我是小楼。 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章《我好像发现了一个Go的Bug?》。 之后我就向Go提交了…

    Go语言 2023年5月25日
    070
  • 字符集与编码

    一个比特(bit)可以是0,或者是1,8个比特(bit),组成一个字节(byte)。全为0时代表数字0,全为1时代表数字255。 一个字节可以表示256个数字,两个字节可以表示65…

    Go语言 2023年5月25日
    041
  • 微服务-限流:一.golang实现令牌桶算法

    起初是因为要去拉取一些第三方的数据,而第三方的API接口都有限流措施。比如6000/分钟,500/分钟。想着拉取数据就用多个协程的方式。但是容易超频,所以想着写一个限流的东东。网上…

    Go语言 2023年5月25日
    042
  • 【译】eBPF 和 Go 经验初探

    原文地址:https://networkop.co.uk/post/2021-03-ebpf-intro/首发地址: 【译】eBPF 和 Go 经验初探本站相关文档:使用 Go 语…

    Go语言 2023年5月25日
    064
  • Go easyjson使用技巧

    原文链接:http://www.zhoubotong.site/post/37.html 如果使用go语言自带的json库,使用的是反射,而go语言中反射性能较低。easyjson…

    Go语言 2023年5月25日
    054
  • Golang笔记

    本文主要为go的学习过程笔记。 一、基本介绍 1、开发环境安装-windows安装 打开Golang官网,选择对应版本,进行安装。 2、环境变量配置 1)步骤 (1)首先在环境变量…

    Go语言 2023年5月25日
    047
  • go学习笔记(一)

    零值的 slice等于 nil。 nil值的 slice没有底层数组 nil值的 slice的长度和容量都是 0。但是也有非 nil值的 slice的长度和容量为 0的,如 []i…

    Go语言 2023年5月25日
    029
  • Go基础知识梳理(三)

    Go基础知识梳理(三) 结构 type Person struct { name string sex int } func main() { //推&amp…

    Go语言 2023年5月25日
    059
  • 【golang】多个defer的执行顺序以及其相关练习

    前言 做了几道关于defer的测试题,吓了一大跳,感觉自己之前的理解有些问题,所以写下这篇博客,加深下印象。 正文: 多个defer的执行顺序: 先进后出,类似于栈的特性。 下面我…

    Go语言 2023年5月25日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球