树莓派python获取变化的公网IP

一.前言

最近因个人需求,向宽带运营商申请了分配公网IP,由于IPV4地址紧张的关系,给的公网IP是动态的,隔一段时间会变化,不过对于我们个人用户来说,能给分配公网IP已经很不错了。当然了,我们可以通过配置DDNS,通过访问固定域名的方式解决IP变化的问题。

除了DDNS外,手上有树莓派之类开发板的,也可以通过树莓派主动查询自家的公网IP地址,然后邮件通知自己,IP地址发生了变化,这里我用的是python3实现的,具体操作步骤见下文。

二.步骤

1.引入库

先贴一下程序中需要用到的所有模块,可以先用pip list看一下是不是都有安装,没有的要安装一下,否则运行会报错。

import os
import requests
import schedule
import time
import smtplib
from email.mime.text import MIMEText

2.查询公网IP地址

这里我用的是免费的第三方的API网站(https://api.ipify.org/),打开网页后就可以直接获取到公网IP地址,操作的话,要用到requests这个模块。

def get_public_ip():
    try:
        # 获取IP地址
        url='https://api.ipify.org/'
        resp = requests.get(url)
        public_ip = resp.text
        print(public_ip)
    except Exception as e:
       print(e)

    return public_ip

3.保存和读取IP地址

从第三方获取到的IP直接存为txt文档就行,每次检查IP变化前,先读取一下上次保存的IP,比对一下,读取和写入IP的代码如下。

def text_write(name,msg):
    file_path = '/home/pi/GetPublicIp/'  # 新创建的txt文件的存放路径 这里替换为自己的路径即可
    full_path = file_path + name + '.txt'
    file = open(full_path, 'w')
    file.write(msg)
    file.close()

def text_read(name):
    file_path = '/home/pi/GetPublicIp/'  
    full_path = file_path + name + '.txt'
    file = open(full_path, 'r')
    ip = file.read()
    file.close()

    return ip

4.邮件发送

我这里用的是QQ邮箱,也可以换成别的。这个部分直接贴代码了,代码里注释比较详尽,仔细阅读就行。记得把代码中几个邮箱信息相关部分,替换成自己的就可以使用了。

def send_mail(ip):

    #设置服务器所需信息
    #mail服务器地址
    mail_host = 'smtp.qq.com'
    #mail用户名
    mail_user = '自己的用户名'#qq邮箱为qq号码
    #密码(部分邮箱为授权码)
    mail_pass = '密码或者授权码'#授权码在邮箱设置里可以找到
    #邮件发送方邮箱地址
    sender = '[email protected]'#替换为自己的邮箱发送地址
    #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
    receivers = ['[email protected]']
    content_str = 'public host ip is : ' + ip
    #设置email信息
    #邮件内容设置
    message = MIMEText(content_str,'plain','utf-8')
    #邮件主题
    message['Subject'] = 'Get Public Ip Address'
    #发送方信息
    message['From'] = sender
    #接受方信息
    message['To'] = receivers[0]

    #登录并发送邮件
    try:
        smtpObj = smtplib.SMTP()
        #连接到服务器
        smtpObj.connect(mail_host,25)
        #登录到服务器
        smtpObj.login(mail_user,mail_pass)
        #发送
        smtpObj.sendmail(sender,receivers,message.as_string())
        #退出
        smtpObj.quit()

        print('success')
        ret = True
    except smtplib.SMTPException as e:
        print('error',e) #打印错误
        ret = False

    return ret

5.定时查询IP发送邮件

IP地址因为隔一段时间才会变化,所以没必要一直让树莓派查询,这里用python的schedule模块实现定时查询发送邮件(这里没有安装的同学,也需要用pip安装一下,否则运行会报错),我设置的是每天23:59查询IP有没有变化,有变化就给我的常用邮箱发送通知邮件,可以根据自己的需求进行修改。函数job()就是定时执行IP变化的部分。

def job():
    old_ip = text_read('myip')
    new_ip = get_public_ip()

    if (check_ip_change(new_ip, old_ip)):
        text_write('myip', new_ip)
        print("Saved new ip!")
        send_mail(new_ip)
        print("Send new ip by mail!")
    else:
        # text_write('myip', old_ip)
        print("Saved old ip!")

def main():
   schedule.every().day.at("23:59").do(job)
   while True:
      schedule.run_pending()
      time.sleep(1)

总结

到这里,就可以实现查询IP变化,发送邮件通知自己了,但是这个运行后,一旦树莓派断电或者重启,还需要自己在启动一下这个脚本,有没有办法可以开机自动执行这个脚本呢?当然是有的,下一篇会介绍一下如何用supervisor配置脚本开机自动启动。

你可能感兴趣的:(树莓派,python)