shell脚本crontab定时--企业微信机器人工作日发布通知提醒
1、背景
原先已写过一版每周一到周五发布通知的,但眼看要到十一,想必大家在假期期间都不想收到公司信息,所以这次增加了工作日的限制,只在工作日或调休的上班日发出消息通知。
【弊端:个人能力有限,文本文档格式,且只能发出简短日期等信息。】
2、准备
目前没有渠道可以获得工作日及调休时间,只能个人手工记录,如果大家有渠道的可以留言告知我呀,感谢!【链接等等,如果是公告通知等等我也调用不了接口啊】
2.1、将工作日以及调休日期等记录到表格里,粘贴到文本文档中。
【此处先用表格后用文档,在于方便粘贴及调整数据格式等,也可以直接写入到文档中,实际也是只使用文档。】
列1:日期,为打卡日。
列2:对日期进行说明,正常的工作日还是调休。
列3:星期几。
列4:是否需要报工,默认1949-10-01,当需要报工的时候填写当天日期。此处逻辑为截至每周日的最后一个工作日或节前发出报工提醒。
- 表格-2024工作日.xlsx
日期 | 说明 | 星期 | 报工 |
2024-09-02 | 工作日 | 1 | 1949-10-01 |
2024-09-03 | 工作日 | 2 | 1949-10-01 |
2024-09-04 | 工作日 | 3 | 1949-10-01 |
2024-09-05 | 工作日 | 4 | 1949-10-01 |
2024-09-06 | 工作日 | 5 | 2024-09-06 |
2024-09-09 | 工作日 | 1 | 1949-10-01 |
2024-09-10 | 工作日 | 2 | 1949-10-01 |
2024-09-11 | 工作日 | 3 | 1949-10-01 |
2024-09-12 | 工作日 | 4 | 1949-10-01 |
2024-09-13 | 工作日 | 5 | 1949-10-01 |
2024-09-14 | 中秋节调休 | 6 | 2024-09-14 |
2024-09-18 | 工作日 | 3 | 1949-10-01 |
2024-09-19 | 工作日 | 4 | 1949-10-01 |
2024-09-20 | 工作日 | 5 | 2024-09-20 |
2024-09-23 | 工作日 | 1 | 1949-10-01 |
2024-09-24 | 工作日 | 2 | 1949-10-01 |
2024-09-25 | 工作日 | 3 | 1949-10-01 |
2024-09-26 | 工作日 | 4 | 2024-09-26 |
2024-09-27 | 工作日 | 5 | 1949-10-01 |
2024-09-29 | 国庆调休 | 7 | 2024-09-29 |
2024-09-30 | 工作日 | 1 | 2024-09-30 |
2024-10-08 | 工作日 | 2 | 1949-10-01 |
2024-10-09 | 工作日 | 3 | 1949-10-01 |
2024-10-10 | 工作日 | 4 | 1949-10-01 |
2024-10-11 | 工作日 | 5 | 1949-10-01 |
2024-10-12 | 国庆调休 | 6 | 2024-10-12 |
2024-10-14 | 工作日 | 1 | 1949-10-01 |
2024-10-15 | 工作日 | 2 | 1949-10-01 |
2024-10-16 | 工作日 | 3 | 1949-10-01 |
2024-10-17 | 工作日 | 4 | 1949-10-01 |
2024-10-18 | 工作日 | 5 | 2024-10-18 |
2024-10-21 | 工作日 | 1 | 1949-10-01 |
2024-10-22 | 工作日 | 2 | 1949-10-01 |
2024-10-23 | 工作日 | 3 | 1949-10-01 |
2024-10-24 | 工作日 | 4 | 1949-10-01 |
2024-10-25 | 工作日 | 5 | 2024-10-25 |
2024-10-28 | 工作日 | 1 | 1949-10-01 |
2024-10-29 | 工作日 | 2 | 1949-10-01 |
2024-10-30 | 工作日 | 3 | 1949-10-01 |
2024-10-31 | 工作日 | 4 | 1949-10-01 |
2024-11-01 | 工作日 | 5 | 2024-11-01 |
2024-11-04 | 工作日 | 1 | 1949-10-01 |
2024-11-05 | 工作日 | 2 | 1949-10-01 |
2024-11-06 | 工作日 | 3 | 1949-10-01 |
2024-11-07 | 工作日 | 4 | 1949-10-01 |
2024-11-08 | 工作日 | 5 | 2024-11-08 |
2024-11-11 | 工作日 | 1 | 1949-10-01 |
2024-11-12 | 工作日 | 2 | 1949-10-01 |
2024-11-13 | 工作日 | 3 | 1949-10-01 |
2024-11-14 | 工作日 | 4 | 1949-10-01 |
2024-11-15 | 工作日 | 5 | 2024-11-15 |
2024-11-18 | 工作日 | 1 | 1949-10-01 |
2024-11-19 | 工作日 | 2 | 1949-10-01 |
2024-11-20 | 工作日 | 3 | 1949-10-01 |
2024-11-21 | 工作日 | 4 | 1949-10-01 |
2024-11-22 | 工作日 | 5 | 2024-11-22 |
2024-11-25 | 工作日 | 1 | 1949-10-01 |
2024-11-26 | 工作日 | 2 | 1949-10-01 |
2024-11-27 | 工作日 | 3 | 1949-10-01 |
2024-11-28 | 工作日 | 4 | 1949-10-01 |
2024-11-29 | 工作日 | 5 | 2024-11-29 |
2024-12-02 | 工作日 | 1 | 1949-10-01 |
2024-12-03 | 工作日 | 2 | 1949-10-01 |
2024-12-04 | 工作日 | 3 | 1949-10-01 |
2024-12-05 | 工作日 | 4 | 1949-10-01 |
2024-12-06 | 工作日 | 5 | 2024-12-06 |
2024-12-09 | 工作日 | 1 | 1949-10-01 |
2024-12-10 | 工作日 | 2 | 1949-10-01 |
2024-12-11 | 工作日 | 3 | 1949-10-01 |
2024-12-12 | 工作日 | 4 | 1949-10-01 |
2024-12-13 | 工作日 | 5 | 2024-12-13 |
2024-12-16 | 工作日 | 1 | 1949-10-01 |
2024-12-17 | 工作日 | 2 | 1949-10-01 |
2024-12-18 | 工作日 | 3 | 1949-10-01 |
2024-12-19 | 工作日 | 4 | 1949-10-01 |
2024-12-20 | 工作日 | 5 | 2024-12-20 |
2024-12-23 | 工作日 | 1 | 1949-10-01 |
2024-12-24 | 工作日 | 2 | 1949-10-01 |
2024-12-25 | 工作日 | 3 | 1949-10-01 |
2024-12-26 | 工作日 | 4 | 1949-10-01 |
2024-12-27 | 工作日 | 5 | 2024-12-27 |
2024-12-30 | 工作日 | 1 | 1949-10-01 |
2024-12-31 | 工作日 | 2 | 1949-10-01 |
- 文档-2024工作日.txt
日期 说明 星期 报工
2024-09-02 工作日 1 1949-10-01
2024-09-03 工作日 2 1949-10-01
2024-09-04 工作日 3 1949-10-01
2024-09-05 工作日 4 1949-10-01
2024-09-06 工作日 5 2024-09-06
2024-09-09 工作日 1 1949-10-01
2024-09-10 工作日 2 1949-10-01
2024-09-11 工作日 3 1949-10-01
2024-09-12 工作日 4 1949-10-01
2024-09-13 工作日 5 1949-10-01
2024-09-14 中秋节调休 6 2024-09-14
2024-09-18 工作日 3 1949-10-01
2024-09-19 工作日 4 1949-10-01
2024-09-20 工作日 5 2024-09-20
2024-09-23 工作日 1 1949-10-01
2024-09-24 工作日 2 1949-10-01
2024-09-25 工作日 3 1949-10-01
2024-09-26 工作日 4 2024-09-26
2024-09-27 工作日 5 1949-10-01
2024-09-29 国庆调休 7 2024-09-29
2024-09-30 工作日 1 2024-09-30
2024-10-08 工作日 2 1949-10-01
2024-10-09 工作日 3 1949-10-01
2024-10-10 工作日 4 1949-10-01
2024-10-11 工作日 5 1949-10-01
2024-10-12 国庆调休 6 2024-10-12
2024-10-14 工作日 1 1949-10-01
2024-10-15 工作日 2 1949-10-01
2024-10-16 工作日 3 1949-10-01
2024-10-17 工作日 4 1949-10-01
2024-10-18 工作日 5 2024-10-18
2024-10-21 工作日 1 1949-10-01
2024-10-22 工作日 2 1949-10-01
2024-10-23 工作日 3 1949-10-01
2024-10-24 工作日 4 1949-10-01
2024-10-25 工作日 5 2024-10-25
2024-10-28 工作日 1 1949-10-01
2024-10-29 工作日 2 1949-10-01
2024-10-30 工作日 3 1949-10-01
2024-10-31 工作日 4 1949-10-01
2024-11-01 工作日 5 2024-11-01
2024-11-04 工作日 1 1949-10-01
2024-11-05 工作日 2 1949-10-01
2024-11-06 工作日 3 1949-10-01
2024-11-07 工作日 4 1949-10-01
2024-11-08 工作日 5 2024-11-08
2024-11-11 工作日 1 1949-10-01
2024-11-12 工作日 2 1949-10-01
2024-11-13 工作日 3 1949-10-01
2024-11-14 工作日 4 1949-10-01
2024-11-15 工作日 5 2024-11-15
2024-11-18 工作日 1 1949-10-01
2024-11-19 工作日 2 1949-10-01
2024-11-20 工作日 3 1949-10-01
2024-11-21 工作日 4 1949-10-01
2024-11-22 工作日 5 2024-11-22
2024-11-25 工作日 1 1949-10-01
2024-11-26 工作日 2 1949-10-01
2024-11-27 工作日 3 1949-10-01
2024-11-28 工作日 4 1949-10-01
2024-11-29 工作日 5 2024-11-29
2024-12-02 工作日 1 1949-10-01
2024-12-03 工作日 2 1949-10-01
2024-12-04 工作日 3 1949-10-01
2024-12-05 工作日 4 1949-10-01
2024-12-06 工作日 5 2024-12-06
2024-12-09 工作日 1 1949-10-01
2024-12-10 工作日 2 1949-10-01
2024-12-11 工作日 3 1949-10-01
2024-12-12 工作日 4 1949-10-01
2024-12-13 工作日 5 2024-12-13
2024-12-16 工作日 1 1949-10-01
2024-12-17 工作日 2 1949-10-01
2024-12-18 工作日 3 1949-10-01
2024-12-19 工作日 4 1949-10-01
2024-12-20 工作日 5 2024-12-20
2024-12-23 工作日 1 1949-10-01
2024-12-24 工作日 2 1949-10-01
2024-12-25 工作日 3 1949-10-01
2024-12-26 工作日 4 1949-10-01
2024-12-27 工作日 5 2024-12-27
2024-12-30 工作日 1 1949-10-01
2024-12-31 工作日 2 1949-10-01
2.2、将txt文档上传到服务器指定路径
上传到指定路径/appadmin
3、步骤
3.1、添加机器人
1.打开企业信息群聊,点击右上角三个点, 添加群机器人 ,新创建一个机器人,起个名字;
2. 群里会显示你已经添加了机器人,群页面右侧显示你刚刚添加的机器人,双击查看资料,有显示Webhook网址,这个记下来且记得千万不要随便给别人,不然陌生人就能给你们群发信息了!!!信息泄露很危险!;
3. 可以在介绍那里写明这个机器人详细的作用,比如:打卡提醒等等;
4. 点击编辑按钮,在Webhook地址下面有个机器人配置说明,大家可以看看根据需求修改。
3.2、shell脚本编写
找到一台运行中不会停掉的服务器,在此服务器上写shell脚本及设置定时任务。
1.在/appadmin下新建脚本clock.sh。
cd /appadmin
touch clock.sh
touch report.sh
2.编辑脚本(此处用到刚刚需要记下来的Webhook地址)
- 打卡提醒
vi clock.sh
#!/bin/bash
# 当前日期
current_date=$(date +%Y-%m-%d)
# 当前月份
current_month=$(date +%m)
# 文本文件路径
text_file="/appadmin/2024工作日.txt"
# 消息内容
#MESSAGE="Hello! Current time is $(date +'%Y-%m-%d %H:%M:%S')."
#输出表头
#head -n 1 $text_file
#初始化变量output为空
output=""
# 逐行读取文件内容并处理
line_number=0
while IFS= read -r line; do
line_number=$((line_number + 1))
if [ $line_number -eq 1 ]; then
# 跳过第一行(表头)
continue
fi
# 使用空格作为分隔符拆分行数据
columns=($line)
# 第一列为日期
date_str=${columns[0]}
date_strr=${columns[1]}
# 将日期字符串转换为时间戳
date_timestamp=$(date -d "$date_str" +%s)
current_timestamp=$(date -d "$current_date" +%s)
# 计算日期差(以秒为单位)
delta_seconds=$((date_timestamp - current_timestamp))
delta_days=$((delta_seconds / 86400)) # 86400秒 = 1天
# 判断条件
if ([ $delta_seconds -eq 0 ]) && [ $delta_days -eq 0 ]; then
# 如果当天日期在文档中,说明是工作日或调休日期
#output+=$""$line""
#output=""$date_str"\"$date_strr"
output=$date_strr
fi
done < "$text_file"
content=$output
echo "每天执行语句判断是否需要打卡"
echo ${#output}
echo -e "$output"
date=$(date +%Y-%m-%d)
time=$(date "+%H:%M:%S")
content="**消息提醒**
>info:各位好,请打卡,
>time:$date $content
"
webHookUrl="刚刚记下来的Webhook地址"
ontent='{"msgtype": "text","text": {"content": "'$content'","mentioned_list":"@all"},}'
##检查变量output的长度是否大于2。如果条件为真(即output的长度大于2),则执行then后面的命令。
if [ ${#output} -gt 2 ];then
curl --data-ascii "$content" $webHookUrl
echo "over!"
fi
- 报工提醒
vi report.sh
#!/bin/bash
# 当前日期
current_date=$(date +%Y-%m-%d)
# 当前月份
current_month=$(date +%m)
# 文本文件路径
text_file="/appadmin/2024工作日.txt"
# 消息内容
#MESSAGE="Hello! Current time is $(date +'%Y-%m-%d %H:%M:%S')."
#输出表头
#head -n 1 $text_file
#初始化变量output为空
output=""
# 逐行读取文件内容并处理
line_number=0
while IFS= read -r line; do
line_number=$((line_number + 1))
if [ $line_number -eq 1 ]; then
# 跳过第一行(表头)
continue
fi
# 使用空格作为分隔符拆分行数据
columns=($line)
# 第一列为日期
date_str=${columns[0]}
date_str1=${columns[1]}
# 将日期字符串转换为时间戳
date_timestamp=$(date -d "$date_str" +%s)
current_timestamp=$(date -d "$current_date" +%s)
# 计算日期差(以秒为单位)
delta_seconds=$((date_timestamp - current_timestamp))
delta_days=$((delta_seconds / 86400)) # 86400秒 = 1天
date_str3=${columns[3]}
# 将日期字符串转换为时间戳
date_timestamp3=$(date -d "$date_str3" +%s)
# 计算日期差(以秒为单位)
delta_days3=$((date_timestamp3 - 1725292800 ))
# 判断条件
if ([ $delta_days3 -eq 0 ]); then
# 如果当天日期在文档中,说明是工作日或调休日期
#output+=$""$line""
#output=$date_str"\"$date_str1"\"$date_str3
output=$date_str"\"$date_str1"\"
fi
done < "$text_file"
content=$output
echo "每天执行语句判断是否需要提醒打卡"
#echo ${#output}
#echo -e "$output"
echo $date_timestamp3
echo $delta_days3
echo $content
date=$(date +%Y-%m-%d)
time=$(date "+%H:%M:%S")
content="**今天记得报工呀**
"
webHookUrl="刚刚记下来的Webhook地址"
content='{"msgtype": "text","text": {"content": "'$content'","mentioned_list":"@all"},}'
##检查变量output的长度是否大于3。如果条件为真(即output的长度大于3),则执行then后面的命令。
if [ ${#output} -gt 3 ];then
curl --data-ascii "$content" $webHookUrl
echo "over!"
fi
3.3、定时任务设置
正常的打卡时间是早9晚6,所以要早于9点,晚于6点。clock.sh的执行时间在每天上班早8点30分,及晚上6点,report.sh的执行时间在每一周最后一个工作日,或节假日前的一天晚上6点。
crontab -e
增加内容:
30 8 * * * /appadmin/clock.sh
0 18 * * * /appadmin/clock.sh
0 18 * * * /appadmin/report.sh
crontab -l
可看到目前已申请的定时任务有哪些
4、效果展示
消息提醒
info:各位好,请打卡,
time:2024-09-04 工作日
@所有人