4 changed files with 99 additions and 0 deletions
			
			
		@ -0,0 +1,79 @@ | 
				
			|||
const NotificationProvider = require("./notification-provider"); | 
				
			|||
const { DOWN, UP } = require("../../src/util"); | 
				
			|||
const { default: axios } = require("axios"); | 
				
			|||
const Crypto = require("crypto"); | 
				
			|||
 | 
				
			|||
class DingDing extends NotificationProvider { | 
				
			|||
    name = "DingDing"; | 
				
			|||
 | 
				
			|||
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | 
				
			|||
        let okMsg = "Sent Successfully."; | 
				
			|||
 | 
				
			|||
        try { | 
				
			|||
            if (heartbeatJSON != null) { | 
				
			|||
                var params = { | 
				
			|||
                    msgtype:"markdown", | 
				
			|||
                    markdown:{ | 
				
			|||
                        title: monitorJSON["name"], | 
				
			|||
                        text: `## [${this.statusToString(heartbeatJSON["status"])}] \n > ${heartbeatJSON["msg"]}  \n > Time(UTC):${heartbeatJSON["time"]}`, | 
				
			|||
                    } | 
				
			|||
                }; | 
				
			|||
                if (this.sendToDingDing(notification, params)) { | 
				
			|||
                    return okMsg; | 
				
			|||
                } | 
				
			|||
            } else { | 
				
			|||
                var params = { | 
				
			|||
                    msgtype:"text", | 
				
			|||
                    text:{ | 
				
			|||
                        content:msg | 
				
			|||
                    } | 
				
			|||
                }; | 
				
			|||
                if (this.sendToDingDing(notification, params)) { | 
				
			|||
                    return okMsg; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
        } catch (error) { | 
				
			|||
            this.throwGeneralAxiosError(error); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    async sendToDingDing(notification, params) { | 
				
			|||
        var timestamp=Date.now() | 
				
			|||
 | 
				
			|||
        var config = { | 
				
			|||
            method: "POST", | 
				
			|||
            headers: { | 
				
			|||
                "Content-Type": "application/json", | 
				
			|||
            }, | 
				
			|||
            url: `${notification.webHookUrl}×tamp=${timestamp}&sign=${encodeURIComponent(this.sign(timestamp, notification.secretKey))}`, | 
				
			|||
            data: JSON.stringify(params), | 
				
			|||
        }; | 
				
			|||
 | 
				
			|||
        var result = await axios(config); | 
				
			|||
        if (result.data.errmsg == "ok") { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
        return false; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** DingDing sign */ | 
				
			|||
    sign(timestamp,secretKey) { | 
				
			|||
        return Crypto | 
				
			|||
            .createHmac("sha256",Buffer.from(secretKey, 'utf8')) | 
				
			|||
            .update(Buffer.from(`${timestamp}\n${secretKey}`, 'utf8')) | 
				
			|||
            .digest("base64"); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    statusToString(status) { | 
				
			|||
        switch (status) { | 
				
			|||
            case DOWN: | 
				
			|||
                return "DOWN"; | 
				
			|||
            case UP: | 
				
			|||
                return "UP"; | 
				
			|||
            default: | 
				
			|||
                return status; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
module.exports = DingDing; | 
				
			|||
@ -0,0 +1,16 @@ | 
				
			|||
<template> | 
				
			|||
    <div class="mb-3"> | 
				
			|||
        <label for="WebHookUrl" class="form-label">{{ $t("WebHookUrl") }}<span style="color: red;"><sup>*</sup></span></label> | 
				
			|||
        <input id="WebHookUrl" v-model="$parent.notification.webHookUrl" type="text" class="form-control" required> | 
				
			|||
 | 
				
			|||
        <label for="secretKey" class="form-label">{{ $t("SecretKey") }}<span style="color: red;"><sup>*</sup></span></label> | 
				
			|||
        <input id="secretKey" v-model="$parent.notification.secretKey" type="text" class="form-control" required> | 
				
			|||
 | 
				
			|||
         <div class="form-text"> | 
				
			|||
            <p>For safety, must use secret key</p> | 
				
			|||
            <i18n-t tag="p" keypath="Read more:"> | 
				
			|||
                <a href="https://developers.dingtalk.com/document/robots/custom-robot-access" target="_blank">https://developers.dingtalk.com/document/robots/custom-robot-access</a> | 
				
			|||
            </i18n-t> | 
				
			|||
        </div> | 
				
			|||
    </div> | 
				
			|||
</template> | 
				
			|||
					Loading…
					
					
				
		Reference in new issue