使用gin
、gorm
实现钉钉群的crud
,钉钉outgoing机制触发建群接口。当第一次点击创建群时会自动创建群,当其他人再次点击创建群时,会自动拉其进入已经创建的群并更新告警认领,当我们解决完问题后,可以触发机器人对群内人员进行移除操作,当然该群目前还是会被保留。
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-50.57 Ready control-plane,master 96d v1.20.5
k8s-node-50.58 Ready <none> 96d v1.20.5
k8s-node-50.59 Ready <none> 96d v1.20.5
# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 8d
alertmanager-main-1 2/2 Running 0 8d
alertmanager-main-2 2/2 Running 0 8d
blackbox-exporter-55c457d5fb-5m7ql 3/3 Running 0 8d
grafana-9df57cdc4-gpzsq 1/1 Running 0 8d
kube-state-metrics-56dbb74497-gpkn9 3/3 Running 0 8d
node-exporter-4wl6d 2/2 Running 0 8d
node-exporter-b4595 2/2 Running 0 8d
node-exporter-g4l99 2/2 Running 0 8d
prometheus-adapter-59df95d9f5-tnt4w 1/1 Running 0 8d
prometheus-adapter-59df95d9f5-xhz5v 1/1 Running 0 8d
prometheus-k8s-0 2/2 Running 1 8d
prometheus-k8s-1 2/2 Running 1 10m
prometheus-operator-c46b8b7c9-mg9cv 2/2 Running 0 8d
群插件需要自己自行创建,当然也可以不使用插件
type DingGroup struct {
ID uint `gorm:"primarykey" json:"id" form:"id"`
CreatedAt time.Time `gorm:"column:creation_time" json:"created_at" form:"created_at"`
UpdatedAt time.Time `gorm:"column:update_time" json:"updated_at" form:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"column:delete_time;index" json:"deleted_at" form:"deleted_at"`
Title string `gorm:"comment: '群组名称';size:500;not null" json:"title" form:"title"`
ChatID string `gorm:"comment: '群组ID';size:500;not null" json:"chat_id" form:"chat_id"`
OpenConversationID string `gorm:"comment: '群组唯一标识';size:500;not null;unique" json:"open_conversation_id" form:"open_conversation_id"`
UserIds string `gorm:"comment: '群成员';type:text;not null" json:"user_ids" form:"user_ids"`
UUID string `gorm:"comment: '告警UUID';size:500;not null;unique" json:"uuid" form:"uuid"`
}
func (dg *dingGroup) AddDingGroup(userid, text string) (err error) {
alertUUID := strings.TrimSpace(text)
// 查询该告警数据
alertData, _ := db.PrometheusAlert.SelectPrometheusAlert(alertUUID)
var groupMsg = model.DingGroupRequestBody{
Title: alertData.AlertName,
TemplateID: viper.GetString("dingGroup.templateID"),
OwnerUserID: viper.GetString("dingGroup.ownerUserID"),
UserIds: alertData.ClaimUsers,
UUID: alertData.UUID,
ShowHistoryType: viper.GetInt("dingGroup.ShowHistoryType"),
ChatBannedType: viper.GetInt("dingGroup.ChatBannedType"),
ManagementType: viper.GetInt("dingGroup.ManagementType"),
OnlyAdminCanDing: viper.GetInt("dingGroup.OnlyAdminCanDing"),
AllMembersCanCreateMcsConf: viper.GetInt("dingGroup.AllMembersCanCreateMcsConf"),
AddFriendForbidden: viper.GetInt("dingGroup.AddFriendForbidden"),
GroupLiveSwitch: viper.GetInt("dingGroup.GroupLiveSwitch"),
MembersToAdminChat: viper.GetInt("dingGroup.MembersToAdminChat"),
}
var (
groupInfo model.DingGroup
groupResInfo model.DingGroupResponseBody
groupUserInfo model.AddUserDingGroup
)
groupInfo.Title = groupMsg.Title
groupInfo.UUID = groupMsg.UUID
groupInfo.UserIds = groupMsg.UserIds
err, group := db.DingGroup.AddDingGroup(groupInfo)
common.TPLogger.Info("该群已经创建过了哦", err, group)
if err != nil && err.Error() != "isExit" {
common.TPLogger.Error("创建钉钉群失败了哦兄弟", err)
return errors.New("创建钉钉群失败了哦兄弟")
} else if err == errors.New("isExit") {
common.TPLogger.Info("该群已经存在了")
// 该群已经存在,直接邀请入群,并更新群成员信息
// 邀请入群
groupUserInfo.OpenConversationID = group.OpenConversationID
groupUserInfo.UserIds = userid
// 将数据库中用户列表转为切片
_, _ = DingSend.AddUserDingGroup(&groupUserInfo)
return nil
}
// 调用钉钉接口创建群
common.TPLogger.Info("调用钉钉接口创建群")
err, data := DingSend.CreateDingGroup(&groupMsg)
if err != nil {
common.TPLogger.Error("创建群失败了:", err)
return err
}
common.TPLogger.Info("创建钉钉群成功了哥哥")
_ = json.Unmarshal([]byte(data), &groupResInfo)
// 更新群,添加管理员 chat_id open_conversation_id
groupInfo.ChatID = groupResInfo.Result.ChatID
groupInfo.OpenConversationID = groupResInfo.Result.OpenConversationID
err = db.DingGroup.UpdateDingGroup(groupInfo)
if err != nil {
common.TPLogger.Error("更新钉钉群失败了")
return err
}
common.TPLogger.Info("更新钉钉群成功了哥哥")
return nil
}
{
"title":"测试群", # 群名称。
"template_id":"c354***-***-***-b4ea-6f1ab***65", # 群模板ID
"owner_user_id":"022*****", # 群主的userid。
"user_ids":"072*****,013*****", # 群成员userid列表。
"subadmin_ids":"072*****,013*****", # 群管理员userid列表。
"uuid":"axcf*-*****-*****-23da*", # 建群去重的业务ID,由接口调用方指定。
"icon":"@lADOADma*****QKA", # 群头像,
"mention_all_authority":0, # @all 权限: 0(默认):所有人都可以@all 1:仅群主可@all
"show_history_type":0, # 新成员是否可查看聊天历史消息:0(默认):不可以查看历史记录 1:可以查看历史记录
"validation_type":0, # 入群是否需要验证 0(默认):不验证入群 1:入群验证
"searchable":0, # 群是否可搜索 0(默认):不可搜索 1:可搜索
"chat_banned_type":0, # 是否开启群禁言 0(默认):不禁言 1:全员禁言
"management_type":0, # 管理类型 0(默认):所有人可管理 1:仅群主可管理
"only_admin_can_ding":0, # 群内发DING权限 0(默认):所有人可发DING 1:仅群主和管理员可发DING
"all_members_can_create_mcs_conf":1, # 群会议权限 0:仅群主和管理员可发起视频和语音会议 1(默认):所有人可发起视频和语音会议
"all_members_can_create_calendar":0, # 群日历设置项,群内非好友/同事的成员是否可相互发起钉钉日程: 0(默认):非好友/同事的成员不可发起钉钉日程 1:非好友/同事的成员可以发起钉钉日程
"group_email_disabled":0, # 是否禁止发送群邮件: 0(默认):群内成员可以对本群发送群邮件 1:群内成员不可对本群发送群邮件
"only_admin_can_set_msg_top":0, # 置顶群消息权限 0(默认):所有人可置顶群消息 1:仅群主和管理员可置顶群消息
"add_friend_forbidden":0, # 群成员私聊权限 0(默认):所有人可私聊 1:普通群成员之间不能够加好友、单聊,且部分功能使用受限(管理员与非管理员之间不受影响)
"group_live_switch":1, # 群直播权限 0:仅群主与管理员可发起直播 1(默认):群内任意成员可发起群直播
"members_to_admin_chat":0 # 是否禁止非管理员向管理员发起单聊: 0(默认):非管理员可以向管理员发起单聊 1:禁止非管理员向管理员发起单聊
}
当前群中有自动添加的一个机器人prometheus,这是我们场景群模板中加入的,我们可以使用该群进行解散该群(只是移除除群主外的所有用于),所以我们可以重新申请一个单独的钉钉用户,仅作为创建群使用
自动创建群聊功能到此已经添加完成了,大佬云集期待与你的相遇。下期内容:告警排班