golang调用钉钉发送群机器人消息

ops/2024/10/19 23:31:26/

golang调用钉钉发送群机器人消息

因为当时用的wire依赖注入,所以需要用多个钉钉机器人的时候,就把每个client实例加入到了map里

package dingtype Client interface {// SendMessage 发送钉钉SendMessage(s string, at ...string) error
}type ClientOpt struct {Name   stringToken  stringSecret string
}
type ClientOptList []*ClientOpt
type ClientList map[string]Clientfunc NewClientList(opt ClientOptList) ClientList {l := make(map[string]Client)for _, item := range opt {if item.Token != "" && item.Secret != "" {l[item.Name] = NewClient(item.Token, item.Secret)}}return l
}func (p ClientList) GetClient(name string) Client {if v, ok := p[name]; ok {return v}return nil
}func (p ClientList) SendMessage(client string, s string, at ...string) error {if v, ok := p[client]; ok {return v.SendMessage(s, at...)}return nil
}
package dingimport ("bytes""crypto/hmac""crypto/sha256""encoding/base64""encoding/json""errors""fmt""io""net/http""time"
)type ClientImpl struct {AccessToken stringSecret      stringEnableAt    boolAtAll       bool
}func NewClient(token, secret string, opt ...DingOptionFn) Client {r := &ClientImpl{AccessToken: token,Secret:      secret,}for _, v := range opt {v(r)}return r
}type DingOptionFn func(*ClientImpl)func WithEnableAt() DingOptionFn {return func(client *ClientImpl) {client.EnableAt = true}
}func WithAtAll() DingOptionFn {return func(client *ClientImpl) {client.AtAll = true}
}// From https://github.com/wanghuiyt/ding// SendMessage Function to send message
//
//goland:noinspection GoUnhandledErrorResult
func (p *ClientImpl) SendMessage(s string, at ...string) error {msg := map[string]interface{}{"msgtype": "text","text": map[string]string{"content": s,},}if p.EnableAt {if p.AtAll {if len(at) > 0 {return errors.New("the parameter \"AtAll\" is \"true\", but the \"at\" parameter of SendMessage is not empty")}msg["at"] = map[string]interface{}{"isAtAll": p.AtAll,}} else {msg["at"] = map[string]interface{}{"atMobiles": at,"isAtAll":   p.AtAll,}}} else {if len(at) > 0 {return errors.New("the parameter \"EnableAt\" is \"false\", but the \"at\" parameter of SendMessage is not empty")}}b, err := json.Marshal(msg)if err != nil {return err}resp, err := http.Post(p.getURL(), "application/json", bytes.NewBuffer(b))if err != nil {return err}defer resp.Body.Close()_, err = io.ReadAll(resp.Body)if err != nil {return err}return nil
}func (p *ClientImpl) hmacSha256(stringToSign string, secret string) string {h := hmac.New(sha256.New, []byte(secret))h.Write([]byte(stringToSign))return base64.StdEncoding.EncodeToString(h.Sum(nil))
}func (p *ClientImpl) getURL() string {wh := "https://oapi.dingtalk.com/robot/send?access_token=" + p.AccessTokentimestamp := time.Now().UnixNano() / 1e6stringToSign := fmt.Sprintf("%d\n%s", timestamp, p.Secret)sign := p.hmacSha256(stringToSign, p.Secret)url := fmt.Sprintf("%s&timestamp=%d&sign=%s", wh, timestamp, sign)return url
}

http://www.ppmy.cn/ops/22205.html

相关文章

安装库后JupyterLab一直报ModuleNotFoundError问题解决

背景: 先安装的Python3.10,安装在默认路径: C:\Users\#用户名省略#\AppData\Local\Programs\Python\Python310\ 后安装的Anaconda,更改过路径在D盘: D:\ProgramData\anaconda3 此时C盘Python安装路径下Scripts文件…

百度竞价开户详解:步骤、优势与注意事项

随着互联网的普及,网络营销已成为企业不可或缺的一部分。其中,百度竞价作为一种高效的网络推广方式,受到了越来越多企业的青睐。本文将详细介绍百度竞价开户的流程、优势以及注意事项,帮助企业更好地利用这一工具提升品牌知名度和…

关于HTML

什么是网页: 1.网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。 2.网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 网页的组成: 1.网页是构成网站的基…

⑥ - 后端工程师通识指南

📖 该文隶属 程序员:职场关键角色通识宝典 ✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏…

基于深度学习神经网络的AI弱光图像增强HEP系统源码

第一步:HEP介绍 基于深度学习的微光图像增强方法通常需要大量的成对训练数据,这在现实世界中是不切实际的。最近,已经探索了无监督的方法来消除对成对训练数据的依赖。然而,由于缺乏先验,它们在不同的现实世界场景中表…

《苍穹外卖》Day12部分知识点记录——数据统计-Excel报表

一、工作台 需求分析和设计 接口设计 今日数据接口订单管理接口菜品总览接口套餐总览接口订单搜索(已完成)各个状态的订单数量统计(已完成) 代码实现 今日数据接口 1. WorkspaceController 注意不要导错包了 package com.sk…

比较美观即将跳转html源码

源码介绍 比较美观即将跳转html源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 源码截图 比较美观的一个跳转界面,修改方法如上&…

第一篇【AI与传奇开心果系列】Python的AI相关库技术点案例示例:详解AI作画原理

AI与传奇开心果博文系列 系列博文目录Python的AI相关库技术点案例示例系列 博文目录前言一、AI作画算法原理介绍二、深度学习的神经网络AI作画算法原理应用示例代码三、特征学习AI作画算法原理应用示例代码四、风格迁移AI作画算法原理应用示例代码五、损失函数AI作画算法原理应…