电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
树莓派使用钉钉监控系统状态
分 享
扫描二维码分享
树莓派使用钉钉监控系统状态
树莓派
钉钉
推送消息
eeb3a40e4f09a38a
关注
发布时间: 2020-04-22
丨
阅读: 967
本文实现使用钉钉来监控树莓派的系统状态,自动推送树莓派系统的IP地址和cpu温度给钉钉,从而方便的获取树莓派当前的IP地址和cpu温度。 钉钉是一个广泛使用的通信软件,大部分企业都在使用它进行通信,而且它可以配置机器人自动发送消息,非常的方便。本文所讲的使用钉钉监控树莓派系统状态,原理就是利用钉钉机器人的自动推动消息功能。 以下是具体的实现教程。 ## 需要的器材 - 树莓派 (2B、3B、4B或者Zero都可以) 1个 - 钉钉软件 (在电脑端安装) ## 获取钉钉自定义机器人webhook ### 1.准备钉钉账号和软件 没有钉钉账号的话注册一个,地址:https://www.dingtalk.com/oasite/register_new.htm 然后在电脑端下载钉钉软件,因为获取自定义机器人webhook只能在电脑端获取,手机上只能接收消息,但是不能对钉钉机器人进行高级设置。 ### 2.新建一个机器人,并获取webhook **步骤一**,打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择“机器人管理”。 [![](https://ding-doc.oss-cn-beijing.aliyuncs.com/images/0.0.262/1586321593318-6a51e3ca-7cbb-43bb-86ae-6749f55e1570.png)](https://ding-doc.oss-cn-beijing.aliyuncs.com/images/0.0.262/1586321593318-6a51e3ca-7cbb-43bb-86ae-6749f55e1570.png) **步骤二**,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像。 ![](https://cf01.ickimg.com/bbsimages/202004/a8b47f1e4e4ed980d114bbdde530d651.jpg) **步骤三**,完成必要的安全设置(至少选择一种,这里选择了“自定义关键词”),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”。 ![](https://cf01.ickimg.com/bbsimages/202004/8f925d921e7fe931002b754ce2f8972a.jpg) **步骤四**,完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下: https://oapi.dingtalk.com/robot/send?access_token=XXXXXX 其中**XXXXXX**为钉钉推送消息的token,后面要用到 **注意**:请保管好此Webhook 地址,不要公布在外部网站上,泄露后有安全风险。 ## 使用自定义机器人使用自定义机器人 根据钉钉机器人开发文档,编写树莓派系统状态监控代码,并将消息推送到钉钉群。 代码我已经上传到了github,通过以下命令下载: git clone https://github.com/xinxingli/pi_dingding.git 然后修改代码中的token为自己的钉钉token: cd pi_dingding/ nano dingding.py 找到*“ding = DingDing("627df77b61d5f6fbf080146287249d62ba07d5d8ba0fd4c8f49d8ef18d81799d")”* 将括号中的token改为自己的钉钉token,然后保存,并执行dingding.py文件: python dingding.py 钉钉就会收到树莓派推送的消息! ![钉钉收到树莓派推送的消息](https://cf01.ickimg.com/bbsimages/202004/4c15aeb3bc9df143d2e2f0912201168e.jpg "钉钉收到树莓派推送的消息") ## 设置树莓派定时推送消息 使用*crontab*可以让树莓派定时自动推送树莓派当前状态到钉钉。 新建计划任务: crontab -e 输入以下命令,让树莓派每隔5分钟推送一次消息: */5 * * * * python /home/pi/pi_dingding/dingding.py ## 自定义配置 这个只是实现了一个最简单的消息推送,可以根据自己的需求,自定义树莓派推送的消息,从而实现更多的功能,比如推送树莓派的内存占用、系统负载、树莓派网络状态等等。树莓派配合传感器,还可以将传感器的数据定时发送到钉钉上,这些都可以进行自定义的设置。 ## 代码 树莓派实现推送消息的代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import json import ssl import urllib2 import os import sys import time import socket import subprocess import commands #获取树莓派ip地址 def get_ip_address(): s =socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.connect(("1.1.1.1",80)) ipaddr=s.getsockname()[0] s.close() return ipaddr #获取树莓派cpu温度 def get_cpu_temp(): file = open("/sys/class/thermal/thermal_zone0/temp") cpu = float(file.read()) / 1000 file.close() return cpu #钉钉机器人接口函数 class DingDing(object): def __init__(self, token): self.url = 'https://oapi.dingtalk.com/robot/send?access_token=%s' % token self.headers = {'Content-Type': 'application/json'} def send_text(self, text, at_mobiles=[], at_all=False): """ 例子: send_text('天气不错', ['13333333333']) :param text: 消息类型,此时固定为:text :param at_mobiles: 被@人的手机号 ['13333333333', ] :param at_all: @所有人时:true,否则为:false :return: """ return self._send_text(text, at_mobiles, at_all) def send_link(self, title, text, message_url='', pic_url=''): return self._send_link(title, text, message_url, pic_url) def send_markdown(self, title, text, at_mobiles=[], at_all=False): """发送markdown格式 :param title: 首屏会话透出的展示内容 :param text: markdown格式的消息 :param at_mobiles: 被@人的手机号(在text内容里要有@手机号) :param at_all: @所有人时:true,否则为:false :return: """ return self._send_markdown(title, text, at_mobiles, at_all) def send_single_action_card(self, title, text, single_title, single_url, btn_orientation='0', hide_avatar='0'): """整体跳转ActionCard类型 :param title: 首屏会话透出的展示内容 :param text: markdown格式的消息 :param single_title: 单个按钮的方案。(设置此项和singleURL后btns无效。) :param single_url: 点击singleTitle按钮触发的URL :param btn_orientation: 0-按钮竖直排列,1-按钮横向排列 :param hide_avatar: 0-正常发消息者头像,1-隐藏发消息者头像 :return: """ return self._send_single_action_card(title, text, single_title, single_url, btn_orientation, hide_avatar) def send_action_card(self, title, text, btns, btn_orientation='0', hide_avatar='0'): """独立跳转ActionCard类型 :param title: 首屏会话透出的展示内容 :param text: markdown格式的消息 :param btns: 按钮的信息:title-按钮方案,actionURL-点击按钮触发的URL :param btn_orientation: 0-按钮竖直排列,1-按钮横向排列 :param hide_avatar: 0-正常发消息者头像,1-隐藏发消息者头像 :return: """ return self._send_action_card(title, text, btns, btn_orientation, hide_avatar) def send_feed_card(self, rows): """FeedCard类型 例子: send_feed_card([('学vue','https://cn.vuejs.org/','https://cn.vuejs.org/images/logo.png'), ('哪家强', 'https://cn.vuejs.org/', 'https://cn.vuejs.org/images/logo.png')]) :param rows: [(title, messageURL, picURL), (...)] :return: """ return self._send_feed_card(rows) def _send_feed_card(self, rows): rows = [{'title': row[0], 'messageURL': row[1], 'picURL': row[2]} for row in rows] data = { 'feedCard': { 'links': rows }, 'msgtype': 'feedCard' } return self._post(data) def _send_action_card(self, title, text, btns, btn_orientation, hide_avatar): btns = [{'title': btn[0], 'actionURL': btn[1]} for btn in btns] data = { "actionCard": { "title": title, "text": text, "hideAvatar": hide_avatar, "btnOrientation": btn_orientation, "btns": btns }, "msgtype": "actionCard" } return self._post(data) def _send_single_action_card(self, title, text, single_title, single_url, btn_orientation, hide_avatar): data = { "actionCard": { "title": title, "text": text, "hideAvatar": hide_avatar, "btnOrientation": btn_orientation, "singleTitle": single_title, "singleURL": single_url }, "msgtype": "actionCard" } return self._post(data) def _send_markdown(self, title, text, at_mobiles, at_all): data = { "msgtype": "markdown", "markdown": { "title": title, "text": text }, "at": { "atMobiles": at_mobiles, "isAtAll": at_all } } return self._post(data) def _send_text(self, text, at_mobiles, at_all): data = { "msgtype": "text", "text": { "content": text }, "at": { "atMobiles": at_mobiles, "isAtAll": at_all } } return self._post(data) def _send_link(self, title, text, message_url, pic_url): data = { "msgtype": "link", "link": { "text": text, "title": title, "picUrl": pic_url, "messageUrl": message_url } } return self._post(data) def _post(self, data): data = json.dumps(data) req = urllib2.Request(self.url, data=data.encode('utf-8'), headers=self.headers) _context = ssl._create_unverified_context() response = urllib2.urlopen(req, context=_context) the_page = response.read() return json.loads(the_page.decode('utf-8')) if __name__ == "__main__": ip = get_ip_address() cpu = get_cpu_temp() localtime = time.asctime( time.localtime(time.time()) ) # 下面的DingDing里面的参数为ding_token,在创建自定义机器人的时候就能获得 ding = DingDing("627df77b61d5f6fbf080146287249d62ba07d5d8ba0fd4c8f49d8ef18d81799d") ding.send_markdown("树莓派状态监控",'### 树莓派状态监控 \n> ###### **time:** %s \n> ###### **ip:** %s \n> ###### **cpu temp:** %2.2f ℃' % (localtime,ip,cpu)) print "消息推送成功!" **参考文档**: 1. [钉钉开发文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq "钉钉开发文档") 2. [树莓派CPU、GPU、磁盘、内存、负载监控脚本](https://www.lxx1.com/1886 "树莓派CPU、GPU、磁盘、内存、负载监控脚本")
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
eeb3a40e4f09a38a
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交