嵌入式笔记

树莓派学习笔记(4)-自动获取IP发送到钉钉消息

Jaydon · 10月15日 · 2018年 ·

经过前三节的内容,我们的树莓派基本配置就算完成了,没有看过的小伙伴点击下面的链接

树莓派学习笔记(1)-安装系统

树莓派学习笔记(2)-远程连接树莓派

树莓派学习笔记(3)-更换软件源

在使用树莓派的过程中大家肯定发现了一个问题,就是在没有显示器,没有网线的情况下无法获取树莓派的IP地址,这样就没办法远程登录SSH。

今天我来教大家怎么自动获取IP地址并通过钉钉发送到你的手机或者电脑上。(当然在配置的过程中你是要知道IP地址并且能登陆上树莓派的)

代码我都上传到了GitHub,钉钉机器人的使用方法请自行百度

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import ssl
from urllib.request import urlopen, Request
import os
import sys
import time
import socket
import subprocess

#获取树莓派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

#钉钉机器人接口函数
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 = Request(self.url, data=data.encode('utf-8'), headers=self.headers)
        _context = ssl._create_unverified_context()
        response = urlopen(req, context=_context)
        the_page = response.read()
        return json.loads(the_page.decode('utf-8'))


if __name__ == "__main__":
    time.sleep(10)
    ip= get_ip_address()
    print(ip)
   # 下面的DingDing里面的参数为ding_token,在创建自定义机器人的时候就能获得
    ding = DingDing("1e5f5bf1bfbfb3cd92594f15a8bc55347aa7493ed81a7646fbd03b4a67693b18")
    ding.send_text(ip,"输入你自己的电话号码")

首先在树莓派的pi文件夹下输入

git clone https://github.com/544672716/raspberry.git

下载好打开send_ip.py将里面的账号和钉钉机器人修改为你自己的账号:

都设置好之后我在来测试一下:

等待10s你的钉钉就会收到消息!

接下来我们将send_ip.py设置为开机自启动

因为要读取树莓派的ip,所以我是通过桌面启动的方式来自启动

在/home/pi/.config/目录下新建一个名为 autostart 的文件夹:

pi@raspberry:~ $ mkdir .config/autostart

在 autostart 目录下新建testboot.desktop (经测试名字任意,但后缀必须是.desktop):

pi@raspberry:~ $ nano .config/autostart/dingding.desktop

文件内容如下:

[Desktop Entry]
Name=dingding
Comment=Python Program
Exec=python3 /home/pi/raspberry/send_ip.py
Icon=/home/pi/python_games/4row_black.png
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true

重启测试是否生效:

sudo reboot

上一篇:树莓派学习笔记(3)-更换软件源

下一篇:树莓派学习笔记(5)-C语言wiringPi库驱动12864液晶屏

0 条回应