目录
几个月前开始学习Python,感觉Python的库很多,语法更贴近自然语言,代码编写起来比其他语言更方便。最近有个想法,想利用动态二维码实现文件数据的传输。要实现传输数据,第一步需要先把待传输的数据显示成二维码。经过前期上网检索,发现有人已经写过类似的内容,但不够详细,那就自己认真研究一下,拿来练练手吧。
思考了一下,第一时间想到的场景是:把自己电脑基础信息展示成二维码,比如将操作系统版本、计算机名、用户名、MAC地址、IP地址展示成二维码。经过网上搜寻资料,发现要实现获取操作系统版本、计算机名、用户名、MAC地址、IP地址然后打印成二维码需要使用到4个python库,接下来一个一个库试试怎么用。
点击以下链接可以下载源码运行↓↓↓
获取操作系统版本、计算机名、用户名、MAC地址和IP地址信息,并打印成二维码-图像处理文档类资源-CSDN下载
一、Python获取操作系统版本、计算机名、用户名信息
这里用到了Python的platform、socket和os库,由于是Python小白,反正能用就行,暂时就不深究上述库的详细功能。只要编写以下代码即可获取操作系统版本、计算机名、用户名信息。
_system = platform.system()
# print("操作系统:%s" % (_system))
_version = platform.version()
# print("系统版本:%s" % (_version))
_host_name = socket.gethostname()
# print("计算机名:%s" % (_host_name))
_login_name = os.getlogin()
# print("用户名:%s" % (_login_name))
二、Python获取MAC地址、IP地址信息
这里用到了python的psutil库,psutil库可实现跨平台获取系统运行主要信息(CPU、内存、磁盘、网络、进程等),也可用于系统监控,性能分析。本章主要使用psutil库获取网络接口信息。
获取网络接口信息用到了psutil.net_if_stats()函数和psutil.net_if_addrs()函数。
psutil.net_if_stats()
函数返回的结果形式如下,里面比较有用的是snicstats中的isup字段,它代表网口开关的状态,True表示开启,False表示关闭。后续代码可通过判断isup这个状态,找到当前电脑已开启的网口,然后获取该开启端口对应的本机MAC,IP等信息。
{
'以太网': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'以太网 2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=10, mtu=1400),
'Loopback Pseudo-Interface 1': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1073, mtu=1500),
'WLAN': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=72, mtu=1500),
'本地连接* 1': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500),
'本地连接* 10': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500)
}
接下来使用psutil.net_if_addrs()函数。
psutil.net_if_addrs()
函数返回的结果形式如下,里面比较有用的是snicstats中的family=<AddressFamily.AF_LINK:-1>,family=<AddressFamily.AF_INET:2>和family=<AddressFamily.AF_INET6:23>。不要看这两个好像一样,仔细看是有区别的,从结果看AF_LINK包含物理地址,AF_INET包含IPV4地址,AF_INET6包含IPV6地址。后续代码我们只需要前两个,并排除127.0.0.1环回地址,就可以找到本机的MAC地址和IP地址。
{'以太网': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='10-XX-XX-6E-XX-0C', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.198.150', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::48c7:XXX:XXXX:XXXX', netmask=None, broadcast=None, ptp=None)],
'本地连接* 1': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='74-XX-XX-BC-XX-47', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.49.57', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::65f1:XXXX:XXXX:XXXX', netmask=None, broadcast=None, ptp=None)],
'本地连接* 10': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='76-XX-XX-BC-XX-46', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='169.254.76.19', netmask='255.255.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::1906:XXXX:XXXX:XXXX', netmask=None, broadcast=None, ptp=None)],
'以太网 2': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='00-XX-6B-XX-XX-4B', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='2.0.1.150', netmask='255.255.255.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::e48c:XXXX:XXXX:XXXX', netmask=None, broadcast=None, ptp=None)],
'WLAN': [snicaddr(family=<AddressFamily.AF_LINK: -1>, address='74-XX-FD-XX-XX-46', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.0.103', netmask='255.255.255.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='240e:47d:XXXX:4b6:XXXX:XXXX:XXXX:5d72', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='240e:47d:XXXX:4b6:XXXX:XXXX:XXXX:3', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='240e:47d:XXXX:4b6:XXXX:XXXX:XXXX:4193', netmask=None, broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='fe80::4821:XXXX:XXXX:XXXX', netmask=None, broadcast=None, ptp=None)],
'Loopback Pseudo-Interface 1': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), snicaddr(family=<AddressFamily.AF_INET6: 23>, address='::1', netmask=None, broadcast=None, ptp=None)]}
完整的代码如下:
# 获取mac,ip地址
_mac = ""
_ipv4 = ""
# _ipv6 = ""
net_if_stats = psutil.net_if_stats().items()
for nets in net_if_stats:
# 判断哪个网口启动
if nets[1].isup is True:
for snicaddr in psutil.net_if_addrs().get(nets[0]):
if snicaddr.family.name in {'AF_LINK', 'AF_PACKET'}:
_mac = snicaddr.address
elif (snicaddr.family.name == 'AF_INET') & (snicaddr.address != "127.0.0.1"):
_ipv4 = snicaddr.address
# elif snicaddr.family.name == 'AF_INET6':
# _ipv6 = snicaddr.address
三、根据获取的信息使用qrcode库生成二维码
这里用到了Python的qrcode库,qrcode是一个生成二维码的库,使用也比较方便。这里主要是用来将操作系统版本、计算机名、用户名、MAC地址、IP地址打印成二维码。代码如下:
qr = qrcode.QRCode()
qr.add_data(_system + '\n', 0)
qr.add_data(_version + '\n', 0)
qr.add_data(_host_name + '\n', 0)
qr.add_data(_mac + '\n', 0)
qr.add_data(_ipv4 + '\n', 0)
img = qr.make_image()
img.save("test.png")
这里需要关注的是add_data ()函数,add_data(data: Any,optimize: int ),第一个参数是需要加入二维码信息,第二个是分块优化控制参数,用于将信息进行分块,提高二维码信息的压缩率,0表示不进行优化,这里就不使用优化了。
四、完整源代码
import psutil
import qrcode
import socket, os
import platform
def print_qr():
# 获取mac,ip地址
_mac = ""
_ipv4 = ""
# _ipv6 = ""
_system = platform.system()
print("操作系统:%s" % (_system))
_version = platform.version()
print("系统版本:%s" % (_version))
_host_name = socket.gethostname()
print("计算机名:%s" % (_host_name))
_login_name = os.getlogin()
print("用户名:%s" % (_login_name))
net_if_stats = psutil.net_if_stats().items()
for nets in net_if_stats:
# 判断哪个网口启动
if nets[1].isup is True:
for snicaddr in psutil.net_if_addrs().get(nets[0]):
if snicaddr.family.name in {'AF_LINK', 'AF_PACKET'}:
_mac = snicaddr.address
elif (snicaddr.family.name == 'AF_INET') & (snicaddr.address != "127.0.0.1"):
_ipv4 = snicaddr.address
# elif snicaddr.family.name == 'AF_INET6':
# _ipv6 = snicaddr.address
print('物理地址(mac):%s' % (_mac))
print('IP地址(ipv4):%s' % (_ipv4))
qr = qrcode.QRCode()
qr.add_data(_system+'\n',0)
qr.add_data(_version+'\n',0)
qr.add_data(_host_name+'\n',0)
qr.add_data(_mac + '\n', 0)
qr.add_data(_ipv4 + '\n', 0)
img = qr.make_image()
img.save("test.png")
if __name__ == '__main__':
print_qr()