前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我是怎样用Shell脚本完成钉钉机器人消息推送的

我是怎样用Shell脚本完成钉钉机器人消息推送的

作者头像
爱技术的小黄鸭
发布2023-06-15 15:19:45
1.2K2
发布2023-06-15 15:19:45
举报
文章被收录于专栏:IT小圈

背景需求

我想应该有一些人和我有一样的需求,比如需要自动推送消息到钉钉

2023-06-04T11:43:25.png
2023-06-04T11:43:25.png

我喜欢shell,是因为在Linux环境下,几乎可以完成所有的事儿,而且依赖问题几乎可以忽略不计(一些特殊环境除外)。 所从这个角度出发,我大部分的代码都会优选Shell,当shell无法完成时我才会借助第三方语言来辅助,比如:PHPPython


关于钉钉机器人

  • 这里所讲的记得钉钉机器人是指钉钉群聊的自定义机器人
  • 本次介绍的不支持应答机制,当然如果自己创建钉钉应用是可以实现的;
  • 更多关于自定义机器人请参考钉钉官方文档

步骤开始

在钉钉群里添加自定义机器人

  • 找到需要添加机器人的群;
  • 点击群会话框的右上角的齿轮→机器人→自定义机器人;
  • 根据自己需求,填写机器人信息;
  • 安全设置官方提供两种方式,人选其一,博主推荐加签方式;
  • webhook URL就是你推送消息的地址,如果您和博主一样选择加签(即 sign)方式,那么那一串key您也需要拷贝下来,更详细的加签方式请参考官方文档
2023-06-04T11:58:26.png
2023-06-04T11:58:26.png

脚本调试给钉钉机器人的Webhook推送消息 基本工作做的差不多了,就可以调试了脚本了,官方提供多种语言的加签方式,但是没有提供shell方式,所以如果您不是用shell的话可以参考官方文档,反之则可以直接使用博主的脚本。

  • 脚本分两步走,一是完成加签(即 sign),二是推送消息
  • 官方加签说明以及shell代码
2023-06-04T12:06:42.png
2023-06-04T12:06:42.png
代码语言:javascript
复制
## 时间戳
timestamp=$(date "+%s%3N")
## 机器人安全密钥
secret='SEC69418c80975b31e767844bcad1e1a2fc3b996ee58dc79ea3ad1331b23fae9f48'
## 生成 sign
sign=$(echo -ne "${timestamp}\n${secret}" | openssl dgst -sha256 -hmac "${secret}" -binary | base64)

由于官方要求,最后得出的sign串需要进行 url encode,且shell本身没有这个函数,所以博主参考网上,整理一个function (不支持中文

代码语言:javascript
复制
## encode url
function url_encode() {
t="${1}"
if [[ -n "${1}" && -n "${2}" ]];then
if ! echo 'xX' | grep -q "${t}";then
  t='x'
fi
echo -n "${2}" | od -t d1 | awk -v a="${t}" '{for (i = 2; i <= NF; i++) {printf(($i>=48 && $i<=57) || ($i>=65 &&$i<=90) || ($i>=97 && $i<=122) ||$i==45 || $i==46 || $i==95 || $i==126 ?"%c" : "%%%02"a, $i)}}'
else
echo -e '$1 and $2 can not empty\n$1 ==> 'x' or 'X', x ==> lower, X ==> toupper.\n$2 ==> Strings need to url encode'
fi
}

## 调用
x ---> 小写
X ---> 大写
url_encode 'x|X' "${sign}"

推送消息

代码语言:javascript
复制
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content":"我就是我, 是不一样的烟火"}}'
2023-06-04T12:42:38.png
2023-06-04T12:42:38.png

推送消息规则

  • 支持textMarkdownlink 等,更多请参考官方文档
  • text 换行可以用 \n
  • 每分钟推送数量 <= 20 ,频繁推送会被限流 10 分钟

完整脚本

仅供参考

代码语言:javascript
复制
#!/bin/bash
## 用于给钉钉机器人推送消息
## 钉钉机器人消息安全支持 关键词、sign 两种方式,人选其一
## 从灵活角度来设计,anYun 推荐使用 sign 方式
## 官方文档没有给 shell 案例,但 anYun 比较青睐于 shell,故而花点时间写了这个 demo
## By anYun Kunming 2023.06.06

## 钉钉机器人配置
dingrobot_secret='SECfe57f716c30ba2f248f0c9af33d961e9b68b5f7f0b1989950150a26e00414e35'
dingrobot_url='https://oapi.dingtalk.com/robot/send?access_token=76e62e363e68e9fe31517aae7f74c4222fb19c65f3745b39bab7c6e27ee4c3b8'
## secret_type keywords || sign
ding_secret_type='sign'
## 需要艾特的人的手机号码,以空格隔开
atMobiles=(13346732245 13346732475)

## encode url
function url_encode() {
t="${1}"
if [[ -n "${1}" && -n "${2}" ]];then
  if ! echo 'xX' | grep -q "${t}";then
    t='x'
  fi
  echo -n "${2}" | od -t d1 | awk -v a="${t}" '{for (i = 2; i <= NF; i++) {printf(($i>=48 && $i<=57) || ($i>=65 &&$i<=90) || ($i>=97 && $i<=122) ||$i==45 || $i==46 || $i==95 || $i==126 ?"%c" : "%%%02"a, $i)}}'
else
  echo -e '$1 and $2 can not empty\n$1 ==> 'x' or 'X', x ==> lower, X ==> toupper.\n$2 ==> Strings need to url encode'
fi
}

## Dingrobot
function dingrobot(){
send_strs="${1}"
new_url="${dingrobot_url}"
at_who=''
for i in ${atMobiles[*]}
do
  if [ -n "${at_who}" ];then
    at_who="${at_who},\"${i}\""
  else
    at_who="\"${i}\""
  fi
done
if [ "${ding_secret_type}" == 'keywords' ];then
  curl -s -X POST -H 'Content-Type: application/json' "${new_url}" \
-d "{\"at\":{\"atMobiles\":[${at_who}]},\"msgtype\":\"text\",\"text\":{\"content\":\"${send_strs}\"}}"
elif [ "${ding_secret_type}" == 'sign' ];then
  timestamp=$(date "+%s%3N")
  dingrobot_sign=$(echo -ne "${timestamp}\n${dingrobot_secret}" | openssl dgst -sha256 -hmac "${dingrobot_secret}" -binary | base64)
  dingrobot_sign=$(url_encode 'X' "${dingrobot_sign}")
  post_url="${dingrobot_url}&timestamp=${timestamp}&sign=${dingrobot_sign}"
  curl -s -X POST -H 'Content-Type: application/json' "${post_url}" \
  -d "{\"at\":{\"atMobiles\":[${at_who}]},\"msgtype\":\"text\",\"text\":{\"content\":\"${send_strs}\"}}"
else
  echo "secret_type 未知,请检查配置"
fi
}
dingrobot "${1}"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景需求
  • 关于钉钉机器人
  • 步骤开始
  • 推送消息规则
  • 完整脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档