Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我是怎样用Shell脚本完成钉钉机器人消息推送的

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

作者头像
爱技术的小黄鸭
发布于 2023-06-15 07:19:45
发布于 2023-06-15 07:19:45
1.9K21
代码可运行
举报
文章被收录于专栏:IT小圈IT小圈
运行总次数:1
代码可运行

背景需求

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

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


关于钉钉机器人

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

步骤开始

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

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

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

  • 脚本分两步走,一是完成加签(即 sign),二是推送消息
  • 官方加签说明以及shell代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 时间戳
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
代码运行次数:0
运行
AI代码解释
复制
## 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
代码运行次数:0
运行
AI代码解释
复制
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content":"我就是我, 是不一样的烟火"}}'

推送消息规则

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

完整脚本

仅供参考

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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 删除。

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

评论
登录后参与评论
2 条评论
热度
最新
大牛,脚本可用
大牛,脚本可用
11点赞举报
哈哈,应该可以直接用的,因为是我自己demo上的脚本分享
哈哈,应该可以直接用的,因为是我自己demo上的脚本分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
​​钉钉自定义机器人简单使用
年前公司的需求里面有用到钉钉机器人,使用之后发现真的非常简单,不得不感叹阿里的牛逼,这篇文章总结了一下个人使用钉钉机器人的经验,同时介绍个人据此构建一个工具类来方便后续直接“开箱即用”,希望对于读者有所启发。
阿东
2021/08/16
4.2K0
​​钉钉自定义机器人简单使用
python实现自动向钉钉群推送消息
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。
墨紫羽墨
2021/12/12
1.7K0
Zabbix 随笔:钉钉机器人告警(脚本方式)
本文将带来 Zabbix 6.0 LTS 如何利用 Python 脚本实现钉钉机器人通知告警信息。
IT小白Kasar
2022/03/03
3.2K1
Zabbix 随笔:钉钉机器人告警(脚本方式)
路由器日志通过钉钉机器人自动推送
由于申请的电信宽带IP不是固定的,每次变了IP又不知道,需要有个IP变更提醒的小功能。
萌海无涯
2020/05/09
1.2K0
自动化系列(四)Python实现钉钉机器人
定期数据需求除了以邮件的形式交付外,也可以发送到工作群里通知相关人员及时关注,本文将介绍如何推送数据到钉钉群里并@相关人员及时关注。
HsuHeinrich
2023/02/24
1.5K0
自动化系列(四)Python实现钉钉机器人
python钉钉机器人自定义回复
然后去实现handle_client 就好了。篇幅有限。完整的代码关注公众号 罗尔街 即可获取
Michel_Rolle
2023/07/30
3.2K4
开通与使用钉钉群机器人 [附API代码]
目录 开通方式 参考代码 使用示范 开通方式 免费,有群就能开,任何用户都可开 官方文档:自定义机器人接入 - 钉钉开放平台 注意事项:用电脑版钉钉来开通,手机上的不行。 参考代码 import time import hmac import hashlib import base64 import urllib.parse import io from pyzbar import pyzbar from PIL import Image import requests, json # 导入依赖
小锋学长生活大爆炸
2022/03/29
1.7K0
开通与使用钉钉群机器人 [附API代码]
Docker最全教程之使用.NET Core推送钉钉消息(十九)
上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明。
雪雁-心莱科技
2019/04/09
8170
Docker最全教程之使用.NET Core推送钉钉消息(十九)
shell脚本实现文件自动清理并推送钉钉机器人告警
当磁盘空间超过阈值时,这时需要人为去清理一些不需要的历史大日志文件,那能否做成自动化呢?
yuanfan2012
2024/03/21
2350
shell脚本实现文件自动清理并推送钉钉机器人告警
使用.NET开发钉钉机器人消息通知
前言:有时候你需要对一些业务或者服务提供消息提醒,用邮件有时候比较麻烦,或者不够直接,就可以考虑使用钉钉机器人的形式来自动发送通知消息。下面我演示一个使用.NET程序来和钉钉机器人交互的例子。
Wesky
2024/08/13
2230
使用.NET开发钉钉机器人消息通知
利用 shell 实现钉钉机器人告警推送
在运维中需要对主机业务进行周期巡检,为减少人工巡检频率,降低业务停机风险,利用 shell 脚本对 Linux 系统服务运行状态进行主动巡检,异常服务通过钉钉机器人进行告警消息推送。
Kevin song
2021/03/08
3.7K0
利用 shell 实现钉钉机器人告警推送
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
    最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用,虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github、Gitlab等源码管理服务,实现源码更新同步;通过聚合Trello、JIRA等项目协调服务,实现项目信息同步;同事,支持Webhook协议的自定义接入,支持更多可能性,例如:将运维报警提醒、自动化测试的结果报告提醒、工作、生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)等等的提醒,通过自定义机器人聚合到钉钉中。
用户9127725
2022/08/08
9410
使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
shell脚本 微信/钉钉验证登录服务器
1.需要修改CropID、Secret、 local int AppID 、local UserID 、local PartyID 五项内容
陈不成i
2021/05/30
1.2K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
API商城_API_API接口大全_API一站式采购基地百度智能云API商城-API一站式采购基地,API商城提供天气查询API、实名认证API、短信验证码、OCR识别等海量API服务。选购API服务,首选百度智能云API商城。
汀丶人工智能
2022/12/21
1.1K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
    就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑。这是一款无与伦比、超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的语言生成能力。
用户9127725
2022/12/09
1.9K0
把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
Python - 接入钉钉机器人
https://developers.dingtalk.com/document/robots/use-group-robots
小菠萝测试笔记
2021/11/18
9980
Python - 接入钉钉机器人
详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
Expression 用于提取变量值的表达式(支持JSONPath、XPath),提取的值赋值给上述自定义变量(例中为event_name)。
前端逗逗飞
2021/04/30
2K0
详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
PYTHON 连接钉钉传输工作数据监控
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
百里丶落云
2022/11/03
7570
PYTHON 连接钉钉传输工作数据监控
Shell实现钉钉机器人定时消息通知
我们知道,之前的运维告警多通过SMS、Mail 等方式通知到相应的人员,难以实现随时随地的查看。随着手机APP的发展,很多告警开始发送到IM软件上去。目前比较常用的是发送到微信和钉钉上,不过微信发送时,需要开通企业公众号,比较麻烦。今天我们将重点放在钉钉上。群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。借助钉钉机器人,通过官方提供的API,可以很方便的post数据到相应的接收人 。群机器人支持Webhook协议的自定义接入,支持更多可能性,例如:你可将运维报警通过自定义机器人聚合到钉钉群实现提醒功能。
非著名运维
2022/06/22
1.4K0
Shell实现钉钉机器人定时消息通知
钉钉常用的消息类型与数据格式总结
准备好加签后的webhook地址后,就可以通过http请求,向钉钉模拟发送消息了。
公众号: 云原生生态圈
2022/11/02
1.3K0
钉钉常用的消息类型与数据格式总结
推荐阅读
相关推荐
​​钉钉自定义机器人简单使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验