钉钉 ChatOps demo

TedCat · · 1245 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一直想搞ChatOps,就是你at一下机器人,机器人会回复你对应内容那种,aws提供的方案对接的是slack,slack国内可能用的不多

公司用钉钉,自己每过一段时间就去搜一下,got luck today,钉钉好像刚开放了可以做应答的机器人

看了下钉钉的文档,开搞

  1. 准备一个https有效的域名接收钉钉推过来消息(试过https验证不过,钉钉那边调不了哈)
  2. 拜托了一下企业钉钉的管理员加个机器人
  3. 撸demo,最近在学golang,就用go写了

Here's the code

package main

import (
    "net/http"
    "bytes"
    "log"
    "encoding/json"
)

type dingRobotMsg struct {
    Conversationid string `json:"conversationId"`
    Atusers        []struct {
        Dingtalkid string `json:"dingtalkId"`
    } `json:"atUsers"`
    Chatbotuserid             string `json:"chatbotUserId"`
    Msgid                     string `json:"msgId"`
    Sendernick                string `json:"senderNick"`
    Isadmin                   bool   `json:"isAdmin"`
    Sessionwebhookexpiredtime int64  `json:"sessionWebhookExpiredTime"`
    Createat                  int64  `json:"createAt"`
    Conversationtype          string `json:"conversationType"`
    Senderid                  string `json:"senderId"`
    Conversationtitle         string `json:"conversationTitle"`
    Isinatlist                bool   `json:"isInAtList"`
    Sessionwebhook            string `json:"sessionWebhook"`
    Text                      struct {
        Content string `json:"content"`
    } `json:"text"`
    Msgtype string `json:"msgtype"`
}

type ResponseJson struct {
    Msgtype string `json:"msgtype"`
    Text    struct {
        Content string `json:"content"`
    } `json:"text"`
} 

func callBackDingTalk(robotMsg dingRobotMsg) {
    //推过来的消息有个Sessionwebhook字段的url,拿来回调
    callBackUrl := robotMsg.Sessionwebhook

    var callBackJson ResponseJson
    callBackJson.Msgtype="text"
    //回复什么,自己发挥哈
    callBackJson.Text.Content=robotMsg.Text.Content + " too"
    callBackBody := new(bytes.Buffer)
    json.NewEncoder(callBackBody).Encode(callBackJson)
    
    req, _ := http.NewRequest("POST",callBackUrl,callBackBody)
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{}
    resp ,_ := client.Do(req)
    defer resp.Body.Close()
}

func myHandler(writer http.ResponseWriter, request *http.Request) {
    //钉钉post过来一个json
    decoder := json.NewDecoder(request.Body)
    var msg dingRobotMsg
    decoder.Decode(&msg)
    callBackDingTalk(msg)
    //fmt.Println("msg: ",robotMsg.Text.Content)
    //fmt.Fprint(writer, response)

}

func main(){
    http.HandleFunc("/", myHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:TedCat

查看原文:钉钉 ChatOps demo

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1245 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传