有时候我们需要电脑的IP地址进行远程访问或者作其他用途,倘若自己的IP是动态分配且无法固定的话,某一时候IP地址突然变更了而自己不知道那倒是挺折腾人的。特别是在别的地方想要远程自己的电脑的时候,发现IP地址不对,真让人头疼,因此写个脚本程序,定时检查一下电脑IP地址,一旦发生变化就提醒自己。
获取IP地址
获取IP地址的方式有很多,并且看是需要获取公网IP还是内网IP,方式都不一样。
这篇文章以windows系统cmd终端下,输入命令ipconfig
得到的IP地址为例。
在Windows终端输入命令:ipconfig
我们就是要获得这个地址。
接下来我们用python实现:
os
库,re
库os.popen()
os.popen()
可以代替我们在终端输入命令,并把结果通过管道传送过来
os.popen()在Linux上也是一样用,不过Linux获取ip地址的命令是ifconfig
python获取电脑IP地址的代码如下
import os
fp = os.popen('ipconfig')
txt = fp.read()
print(txt)
脚本代码运行输出结果如下:
获取的结果和自己手动查看是一样的。
我们的目的是获取IPv4地址,接下来用正则表达式去匹配它
我这儿显示的是局域网的地址,前面192.168.1.部分都是固定的,所以可以根据这个特点进行匹配
import re
ip = re.search(r'192\.168\.1\.\d{1,3}',txt).group()
print(ip)
如果你的ip地址是172开头或者别的地址,请自己修改正则表达式。
获取到IP地址之后,我们要跟以前的IP地址比较,看看是否发生了变化,
.py
文件的第一行。我们要实现脚本自动化运行,如果需要多携带一个文本文件,况且文本里面的数据就只为了保存一个IP地址,显得就臃肿了一些。所以,采用方式二更美观。
方式二的思路:
open()
函数读取本身代码文件,把新的ip地址写入第一行,再把第二行之后的代码重新写入脚本。ipaddr = "192.168.1.14"
import os
import re
try:
txt = os.popen('ipconfig').read()
ip = re.search(r'192\.168\.1\.\d{1,3}',txt).group() # 请检查正则表达式是否能匹配自己的IP地址
if ip != ipaddr:
with open('my_ip.py', 'r+', encoding='utf-8') as fp:
# my_ip.py是本程序脚本文件的文件名
code = fp.readlines()[1:]
fp.seek(0, 0)
fp.truncate(0)
fp.write('ipaddr = "%s"\n' % ip)
for c in code:
fp.write(c)
input('请注意,IP地址发生变化:%s' % ip)
except AttributeError:
input('可能是正则表达式错误,请检查')
except FileNotFoundError:
input('文件名有误,请检查')
except:
input('程序出现错误,请检查')
为什么要用input()
来打印信息?
因为直接用python解释器来运行脚本代码的时候,程序报错或运行完成之后会直接退出,那样我们将看不到结果,所以用input()
等待用户输入,程序就不会结束了。
现在,脚本文件已经制作完成。只要定时运行脚本即可,如果IP地址发生变化,就会进行提醒。
虽然我们可以在代码中用死循环一直定时检查ip地址,但为了节省内存,不采取这个方式。
Windows系统有一个功能:任务计划程序,可以制定定时任务,可以实现定时提醒、定时关机、定时执行程序等
制定一个任务计划就可以定时运行代码了。
如何制定任务计划程序可以参考以下文章:
这里实现的提醒方式只是在电脑上进行弹窗,当然,可以封装得更高级,比如发送邮件提醒你?发微信消息提醒?那就自己去实现啦。
os.popen()
可以获得系统执行命令的返回值