【Python-利用动态二维码传输文件(一)】使用Python获取本机操作系统版本、计算机名、用户名、MAC地址和IP地址信息,并打印成二维码

程序示意图

目录

一、Python获取操作系统版本、计算机名、用户名信息

二、Python获取MAC地址、IP地址信息

三、根据获取的信息使用qrcode库生成二维码

四、完整源代码


        几个月前开始学习Python,感觉Python的库很多,语法更贴近自然语言,代码编写起来比其他语言更方便。最近有个想法,想利用动态二维码实现文件数据的传输。要实现传输数据,第一步需要先把待传输的数据显示成二维码。经过前期上网检索,发现有人已经写过类似的内容,但不够详细,那就自己认真研究一下,拿来练练手吧。

        思考了一下,第一时间想到的场景是:把自己电脑基础信息展示成二维码,比如将操作系统版本、计算机名、用户名、MAC地址、IP地址展示成二维码。经过网上搜寻资料,发现要实现获取操作系统版本、计算机名、用户名、MAC地址、IP地址然后打印成二维码需要使用到4个python库,接下来一个一个库试试怎么用。

        点击以下链接可以下载源码运行↓↓↓

获取操作系统版本、计算机名、用户名、MAC地址和IP地址信息,并打印成二维码-图像处理文档类资源-CSDN下载

一、Python获取操作系统版本、计算机名、用户名信息

        这里用到了Pythonplatform、socketos库,由于是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地址信息

        这里用到了pythonpsutil库,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库生成二维码

        这里用到了Pythonqrcode库,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()

猜你喜欢

转载自blog.csdn.net/qq616491978/article/details/125329626