- 獲取到Webhook地址后,用戶可以向這個地址發起HTTP POST 請求,即可實現給該釘釘群發送消息。注意,發起POST請求時,必須將字符集編碼設置成UTF-8。
當前自定義機器人支持文本 (text)、鏈接 (link)、markdown、ActionCard、FeedCard消息類型,大家可以根據自己的使用場景選擇合適的消息類型,達到最好的展示樣式。
- 自定義機器人發送消息時,可以通過手機號碼指定“被@人列表”。在“被@人列表”里面的人員收到該消息時,會有@消息提醒(免打擾會話仍然通知提醒,首屏出現“有人@你”)。
當前機器人尚不支持應答機制 (該機制指的是群里成員在聊天@機器人的時候,釘釘回調指定的服務地址,即Outgoing機器人)。
每個機器人每分鍾最多發送20條。消息發送太頻繁會嚴重影響群成員的使用體驗,大量發消息的場景 (譬如系統監控報警) 可以將這些信息進行整合,通過markdown消息以摘要的形式發送到群里。
安全設置
安全設置目前有3種方式:
(1)方式一,自定義關鍵詞
最多可以設置10個關鍵詞,消息中至少包含其中1個關鍵詞才可以發送成功。
例如:添加了一個自定義關鍵詞:監控報警
則這個機器人所發送的消息,必須包含 監控報警 這個詞,才能發送成功。
(2)方式二,加簽
第一步,把timestamp+”\n"+密鑰當做簽名字符串,使用HmacSHA256算法計算簽名,然后進行Base64 encode,最后再把簽名參數再進行urlEncode,得到最終的簽名(需要使用UTF-8字符集)。
這里主要演示加簽方法.
加簽shell腳本發送版本
shell腳本發送釘釘通知, 這是調用了阿里雲api和python腳本, 實現自動發送阿里雲可用余額給運維群.
#!/usr/bin/env bash
## author: louis@wangke.co
function notify(){
curl "https://oapi.dingtalk.com/robot/send?access_token=$dingdingtoken×tamp=$timestamp&sign=$sign" -H 'Content-Type: application/json' -d "{'msgtype': 'markdown',
'markdown': {
'title': '阿里雲費用余額',
'text': '## 阿里雲賬戶 \n### 可用現金余額: $AvaliableCash\n### 可用余額: $AvaliableMount\n### 查詢時間: $DateStamp'
}
}"
}
dingdingtoken=xxxxxxxx
getkey=$(python a.py)
timestamp=${getkey:0:13}
sign=$(echo "${getkey:13:100}" | tr -d '\n')
DateStamp=$(date -d @${getkey:0:10} "+%F %H:%m:%S")
AvaliableCash=$(aliyun bssopenapi QueryAccountBalance | jq .Data.AvailableCashAmount)
AvaliableMount=$(aliyun bssopenapi QueryAccountBalance | jq .Data.AvailableAmount)
notify
使用python獲取時間戳及加密sign
#python 2.6
import time
import hmac
import hashlib
import base64
import urllib
timestamp = long(round(time.time() * 1000))
secret = 'secret'
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '{0}\n{1}'.format(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
"""
#python 2.7
import time
import hmac
import hashlib
import base64
import urllib
timestamp = long(round(time.time() * 1000))
secret = 'secret'
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
"""
腳本執行
$ sh notify_aliyun_bss.sh
{"errcode":0,"errmsg":"ok"}
最后, 提一下不需要使用加簽的方法, 很早之前寫過jenkins發送腳本.
#!/bin/sh
title=$1
messageUrl=$2
picUrl=$4
text=$3
PHONE="158215*****"
TOKEN=$5
DING="curl -H \"Content-Type: application/json\" -X POST --data '{\"msgtype\": \"link\", \"link\": {\"messageUrl\": \"${messageUrl}\", \"title\": \"${title}\", \"picUrl\": \"${picUrl}\", \"text\": \"${text}\",}, \"at\": {\"atMobiles\": [${PHONE}], \"isAtAll\": false}}' ${TOKEN}"
eval $DING
腳本執行
$ sh /var/jenkins_home/dingding.sh jenkins-test-qx-44 \ http://fenghong.tech:8088/job/test-qx/44/ 發布成功 \
http://icons.iconarchive.com/icons/paomedia/small-n-flat/1024/sign-check-icon.png \
https://oapi.dingtalk.com/robot/send?access_token=****
錯誤碼
// 消息內容中不包含任何關鍵詞
{
"errcode":310000,
"errmsg":"keywords not in content"
}
// timestamp 無效
{
"errcode":310000,
"errmsg":"invalid timestamp"
}
// 簽名不匹配
{
"errcode":310000,
"errmsg":"sign not match"
}
// IP地址不在白名單
{
"errcode":310000,
"errmsg":"ip X.X.X.X not in whitelist"
}