钉钉虽然有github机器人,但是这个机器人对于组织适配和个性化消息通知实在不灵活,所以就自己动手撸一个出来。

主要基于两个文档

截屏2021-06-03 16.13.10.png

思路:github的类型通知可以通过截取Headers中的X-GitHub-Event参数判断操作类型,通过action参数判断是创建还是删除。机器人采用markdown的显示方式,自定义发起通知。显示效果是这样的,可以显示star还是取消操作。

截屏2021-06-03 16.06.03.png

先在钉钉创建一个自定义机器人,复制通知的链接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等,避免其他消息骚扰,这样当仓库有对应的操作时,钉钉就可以收到消息提醒啦。

_Users_damon_Downloads_tinified (11)_截屏2021-06-03 16.09.jpg


☟☟可点击下方广告支持一下☟☟

最后修改:2023 年 10 月 19 日
请我喝杯可乐,请随意打赏: ☞已打赏列表