最近因个人需求,向宽带运营商申请了分配公网IP,由于IPV4地址紧张的关系,给的公网IP是动态的,隔一段时间会变化,不过对于我们个人用户来说,能给分配公网IP已经很不错了。当然了,我们可以通过配置DDNS,通过访问固定域名的方式解决IP变化的问题。
除了DDNS外,手上有树莓派之类开发板的,也可以通过树莓派主动查询自家的公网IP地址,然后邮件通知自己,IP地址发生了变化,这里我用的是python3实现的,具体操作步骤见下文。
先贴一下程序中需要用到的所有模块,可以先用pip list看一下是不是都有安装,没有的要安装一下,否则运行会报错。
import os
import requests
import schedule
import time
import smtplib
from email.mime.text import MIMEText
这里我用的是免费的第三方的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
从第三方获取到的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
我这里用的是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
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配置脚本开机自动启动。