钉钉虽然有github机器人
,但是这个机器人对于组织适配和个性化消息通知实在不灵活,所以就自己动手撸一个出来。
主要基于两个文档
- 首先github的webhook支持的类型有很多,具体文档在这里github-event-types,
- 钉钉的机器人开发: 自定义机器人接入
思路:github的类型通知可以通过截取Headers
中的X-GitHub-Event
参数判断操作类型,通过action
参数判断是创建还是删除。机器人采用markdown
的显示方式,自定义发起通知。显示效果是这样的,可以显示star还是取消操作。
先在钉钉创建一个自定义机器人,复制通知的链接token,之后处理代码里面替换自己的通知链接。
处理请求的代码:
//github提醒
func githubRemind(_ req: Request) throws -> EventLoopFuture<HTTPStatus> {
let req_github = try req.content.decode(Req_GithubPayLoad.self)
var atMobiles = [String: Any]()
var messageContent = [String : Any]()
//标题内容
let title = "动作: " + (req.headers.first(name: "X-GitHub-Event") ?? "") + " " + (req_github.action ?? "created")
//内容
var markdownContent = [String : String]()
markdownContent["title"] = title
var contentText = "## \(title)"
contentText = contentText + "![](https://z3.ax1x.com/2021/06/03/23CJXj.jpg)\n\n- 项目: \(req_github.repository?.full_name ?? "")\n- 仓库地址:[点击跳转到git仓库](\(req_github.html_url ?? "https://github.com/organizations/ZXKitCode"))\n"
markdownContent["text"] = contentText
atMobiles["isAtAll"] = true
messageContent["msgtype"] = "markdown"
messageContent["markdown"] = markdownContent
messageContent["at"] = atMobiles
//发送数据
let requestData: Data = try JSONSerialization.data(withJSONObject: messageContent, options: JSONSerialization.WritingOptions.prettyPrinted)
let post = ClientRequest(method: .POST, url: "https://oapi.dingtalk.com/robot/send?access_token=替换为自己的机器人token", headers: HTTPHeaders([("Content-Type","application/json")]), body: ByteBuffer(data: requestData))
return req.client.send(post).map { res in
return .ok
}
}
Req_GithubPayLoad
对象存储需要显示的内容、例如标题、仓库链接、动作等
final class GithubRepository: Content {
var full_name: String?
}
final class Req_GithubPayLoad: Content {
var action: String?
var repository: GithubRepository?
var html_url: String?
}
搭建完成之后,在项目或者组织账号的后台设置>webhook
中配置该响应接口,可以选择第三个自定义通知类型,例如star、fork、issue等,避免其他消息骚扰,这样当仓库有对应的操作时,钉钉就可以收到消息提醒啦。
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/1175.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!