三行代码发钉钉机器人消息


dingtalk

钉钉机器人消息封装——Golang

github:https://github.com/blinkbean/dingtalk

目前自定义机器人支持

  • 文本(text)
  • 链接(link)
  • markdown
  • ActionCard
    • 整体跳转
    • 独立跳转
  • FeedCard

机器人官方文档

  • 添加钉钉群:35451012,执行dingtalk_test.go测试方法可直接查看以下消息内容。

使用

创建钉钉群机器人

  1. 选择添加自定义机器人。
  2. 安全设置
    共有关键词、加签、IP白名单三种设置,需要根据情况进行选择。
    Xnip2020-07-05_15-55-24.jpg
  3. 选择自定义关键词,这里设置的关键词在初始化机器人的时候会用到。

获取

1
go get github.com/blinkbean/dingtalk

初始化

1
2
3
4
5
6
// key 创建钉钉机器人需要设置的关键词,默认为`.`
func InitDingTalk(tokens []string, key string) *dingTalk

// 加签方式创建钉钉机器人
// 加签机器人 access_token和secret一一对应,在创建机器人是获取
func InitDingTalkWithSecret(tokens string, secret string) *DingTalk
1
2
3
4
5
6
7
8
import "github.com/blinkbean/dingtalk"

func main() {
// 单个机器人有单位时间内消息条数的限制,如果有需要可以初始化多个token,发消息时随机发给其中一个机器人。
var dingToken = []string{"7bd675b66646ba890046c2198257576470099e1bda0770bad7dd6684fb1e0415"}
cli := dingtalk.InitDingTalk(dingToken, ".")
cli.SendTextMessage("content")
}

text类型

  • 方法及可选参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 方法定义
    SendTextMessage(content string, opt ...atOption) error

    // 可选参数
    // @所有人
    WithAtAll()

    // @指定群成员
    WithAtMobiles(mobiles []string)
  • 使用
    1
    2
    3
    4
    5
    6
    // at所有人
    cli.SendTextMessage("content", WithAtAll())

    // at指定群成员
    mobiles := []string{"131********"}
    cli.SendTextMessage("content", WithAtMobiles(mobiles))
    Xnip2020-07-05_10-46-59.jpg

link类型

  • 方法
    1
    2
    // 方法定义
    SendLinkMessage(title, text, picUrl, msgUrl string) error
  • 使用
    1
    cli.SendLinkMessage(title, text, picUrl, msgUrl)
    Xnip2020-07-05_10-25-33.jpg

markdown类型

  • 方法及可选参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 方法定义
    // text:markdown格式字符串
    SendMarkDownMessage(title, text string, opts ...atOption) error

    // 可选参数 目前钉钉markdown格式消息不支持@(可能是钉钉的bug),所以以下可选参数暂时不生效。
    // @所有人
    WithAtAll()

    // @指定群成员
    WithAtMobiles(mobiles []string)
  • 使用

    1
    cli.SendMarkDownMessage(title, text)
  • Markdown进阶

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 按行写入数组,增强markdown的可读性
    msg := []string{
    "### Link test",
    "---",
    "- <font color=#00ff00 size=6>红色文字</font>",
    "- content2",
    }
    cli.SendMarkDownMessageBySlice("Markdown title", msg, WithAtAll())

    // 字体及颜色
    dm := DingMap()
    dm.Set("颜色测试", H2)
    dm.Set("失败:$$ 同行不同色 $$", RED) // 双$分隔
    dm.Set("---", N)
    dm.Set("金色", GOLD)
    dm.Set("成功", GREEN)
    dm.Set("警告", BLUE)
    dm.Set("普通文字", N)
    cli.SendMarkDownMessageBySlice("color test", dm.Slice())

    Xnip2020-07-05_10-27-33.jpg
    Xnip2020-07-26_17-14-40.jpg

  • 点击DTMD链接发送消息

    点击’dtmdLink1’,自动发送’dtmdValue1’并@机器人,简化输入

    1
    2
    3
    4
    5
    6
    // 创建有序map
    dtmdOrderMap := DingMap().
    Set("dtmdOrderMap1", "dtmdValue1").
    Set("dtmdOrderMap2", "dtmdValue2").
    Set("dtmdOrderMap3", "dtmdValue3")
    err := dingTalkCli.SendDTMDMessage("DTMD title", dtmdOrderMap)

    Xnip2020-11-02_17-17-26.jpg

ActionCard类型(独立跳转)

  • 方法及可选参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 方法定义
    SendActionCardMessage(title, text string, opts ...actionCardOption) error

    // 可选参数
    // 标题
    WithCardSingleTitle(title string)

    // 跳转地址
    WithCardSingleURL(url string)
  • 使用
    1
    cli.SendActionSingleMessage(title, text, WithCardSingleTitle(sTitle), WithCardSingleURL(url))
    Xnip2020-07-05_10-28-57.jpg

ActionCard类型(独立跳转)

  • 方法及可选参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 方法定义
    SendActionCardMessage(title, text string, opts ...actionCardOption) error

    // 可选参数
    // 按钮排列方向,默认水平
    WithCardBtnVertical()

    // 跳转按钮
    WithCardBtns(btns []ActionCardMultiBtnModel)

    // ActionCardMultiBtnModel
    type ActionCardMultiBtnModel struct {
    Title string `json:"title,omitempty"`
    ActionURL string `json:"actionURL,omitempty"`
    }
  • 使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    btns := []ActionCardMultiBtnModel{{
    Title: "test1",
    ActionURL: testUrl,
    },{
    Title: "test2",
    ActionURL: testUrl,
    },
    }
    cli.SendActionSingleMessage(title, text, WithCardBtns(btns))
    Xnip2020-07-05_10-29-21.jpg
    Xnip2020-07-26_17-14-56.jpg

FeedCard类型

  • 方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 方法定义
    SendFeedCardMessage(feedCard []FeedCardLinkModel) error

    // FeedCardLinkModel
    type FeedCardLinkModel struct {
    Title string `json:"title,omitempty"`
    MessageURL string `json:"messageURL,omitempty"`
    PicURL string `json:"picURL,omitempty"`
    }
  • 使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    links := []FeedCardLinkModel{
    {
    Title: "FeedCard1.",
    MessageURL: testUrl,
    PicURL: testImg,
    },
    {
    Title: "FeedCard2",
    MessageURL: testUrl,
    PicURL: testImg,
    },
    {
    Title: "FeedCard3",
    MessageURL: testUrl,
    PicURL: testImg,
    },
    }
    cli.SendFeedCardMessage(links)
    Xnip2020-07-05_10-30-02.jpg

OutGoing

  • 消息格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
    "atUsers":[
    {
    "dingtalkId":"$:LWCP_v1:$1h0bmSzcLCHncx0lCt3Bb/UVz7xv/8vh*"
    }],
    "chatbotUserId":"$:LWCP_v1:$1h0bmSzcLCHncx0lCt3Bb/UVz7x/8vh*",
    "conversationId":"cidkkCwvtlh1L0RmFuhmashi*==",
    "conversationTitle":"项目群",
    "conversationType":"2",
    "createAt":1595232438950,
    "isAdmin":false,
    "isInAtList":true,
    "msgId":"msgm/bJkKjTupFM7ZoRF/eKR*==",
    "msgtype":"text",
    "sceneGroupCode":"project",
    "senderId":"$:LWCP_v1:$x4wFOct/DGctv96o4IxxB*==",
    "senderNick":"blinkbean",
    "sessionWebhook":"https://oapi.dingtalk.com/robot/sendBySession?session=6d69b333f243db32d42c11sda9de620*",
    "sessionWebhookExpiredTime":1595237839030,
    "text":{
    "content":" outgoing"
    }
    }
  • Usage

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func OutGoing(ctx *gin.Context){
    cli := dingtalk.InitDingTalk([]string{"***"}, ".")
    msg, _ := cli.OutGoing(ctx.Request.Body)
    // 处理content
    res := doSomeThing(msg.Text.Content)

    textMsg := dingtalk.NewTextMsg(res)
    ctx.Set("respData", textMsg)
    ctx.JSON(ctx.Writer.Status(), data)
    return
    }

  目录