扫一下这个神奇的二维码,Wifi不用输密码

密码太简单不安全,复杂了不好记,给朋友分享wifi密码输入麻烦,做人还要被wifi欺负。

扫一下这个神奇的二维码,Wifi不用输密码_第1张图片

本教程将分享一个方法,可以将wifi信息生成一个二维码,只要扫描这个二维码就可以加入wifi,这样就省去了记忆和输入的麻烦。

这个方法基于Python的第三方库wifi_qrcode,wifi_qrcode的安装方法如下:

$ pip install -U wifi_qrcode

安装完成后可以通过下面的命令生成二维码:

$ wifi_qrcode wifi --ssid wifi名称 --auth WPA --password 密码

其中参数如下:

–ssid
必填
wifi的名称
–auth
选填
加密方式,可选WEP、WPA, 或者 nopass(若没设置密码)
–password
选填
密码,若加密方式为nopass,此项可忽略
–hidden
选填
wifi是否可见,若不可见设置为True,默认为False
–output
选填
生成的二维码文件名称
比如wifi名称为hellowifi,加密方式是WPA2,密码是

$$fun_of_python@2020$$

,生成命令就是

$ wifi_qrcode wifi --ssid hellowifi --auth WPA --password $$fun_of_python@2020$$

执行成功后就可以在当前文件夹下看的一个二维码图片,默认是qrcode.png,如果加了–output参数就是指定的文件名。

然后通过手机上的相机功能(注意不是用微信或支付宝的扫二维码功能!!!)扫描生成的二维码就可以加入该wifi了,是不是很简单?

如果只是想学习如何生成二维码,到这里就可以了。

下面来分析一下这个库的原理。

访问这个库的GitHub地址https://github.com/shpaker/wifi_qrcode可以看到,这个库的实现很简单,主要包含以下几个文件:

init.py main.py app.py makers.py utils.py
其中__init__.py是用来初始化Python 包的,main.py是执行入口文件,核心代码是在剩下的三个文件中。

从app.py可以看到它的实现是基于python的二维码生成库qrcode实现的,它除了生成wifi二维码外还可以生成邮件的功能,这里分析下wifi二维码,主要代码如下:

def wifi(self,
            ssid: Union[str, int],
            auth: str = AuthType.WPA.name,
            password: Optional[Union[str, int]] = None,
            hidden: bool = False,
            output: str = DEFAULT_FILE_NAME) -> None:

    self._parse_file_name(output)

    auth_type = AuthType.nopass

    try:
        auth_type = AuthType[auth.upper()]

        if auth_type is not AuthType.nopass and not password:
            self.status = ValidateInputStatus.WIFI_EMPTY_PASSWORD
    except KeyError:
        self.status = ValidateInputStatus.WIFI_UNKNOWN_AUTH_TYPE

    if self.status is ValidateInputStatus.SUCCESS:
        data = make_wifi(ssid=ssid,
                            auth=auth_type,
                            password=password,
                            hidden=hidden)

        print(f'Data: {data}')

        img = make_image(data=data,
                            file_format=self.file_format,
                            fill_color=QR_FILL_COLOR,
                            back_color=QR_BACK_COLOR)

        self._save(img)

这个函数的参数就是上面命令行的参数,实现逻辑主要是通过make_wifi函数生成二维码的数据,在通过make_image生成二维码图片,生成二维码图片是基于qrcode的,具体方法可以参考https://github.com/lincolnloop/python-qrcode,这里重点分析一下make_wifi函数,该函数是在maker.py中实现的,代码如下:

def make_wifi(ssid: Union[str, int],
              auth: AuthType = AuthType.nopass,
              password: Optional[Union[str, int]] = None,
              hidden: bool = False) -> str:

    if not isinstance(ssid, str):
        ssid = str(ssid)

    if password and not isinstance(password, str):
        password = str(password)

    for spec_char in MECARD_SPECIAL_CHARACTERS:
        ssid = ssid.replace(spec_char, f'\\{spec_char}')
        if password:
            password = password.replace(spec_char, f'\\{spec_char}')

    fields = {WifiMecardParam.AUTH: auth.value, WifiMecardParam.SSID: ssid}

    if hidden:
        fields[WifiMecardParam.HIDDEN] = 'true'

    if auth is not AuthType.nopass and password:
        fields[WifiMecardParam.PASSWORD] = password

    wifi_data = make_mecard_data(title=DataScheme.WIFI.value, fields=fields)

    return wifi_data

这里是处理wifi的参数,将wifi名称和密码转换为字符串并将处理其中的特殊字符(文件上面定义的MECARD_SPECIAL_CHARACTERS, ‘;,:"’),最后将参数放在field字段中并用utils.py中make_mecard_data函数生成一个字符串,比如上面的命令

$ wifi_qrcode wifi --ssid hellowifi --auth WPA --password $$fun_of_python@2020$$

生成的字符串就是

WIFI:T:WPA;S:hellowifi;P:16474fun_of_python@202016474;;

make_mecard_data函数的代码如下:

def make_mecard_data(title: str, fields: Dict[WifiMecardParam, str]) -> str:
    fields_list = list()
    for field, value in fields.items():
        fields_list.append(f'{field.value}:{value}')

    mecard_data = f'{title}:{";".join(fields_list)};;'
    return mecard_data

清楚了原理之后,同学们也可以实现一个自己的wifi二维码生成工具,比如可以利用之前教程学了Python之后,美化二维码如此简单中myqr库美化一下wifi二维码,生成适合自己的风格二维码。

参考资料:

https://github.com/shpaker/wifi_qrcode

https://github.com/lincolnloop/python-qrcode


欢迎关注我的公众号“Python的乐趣”,原创技术文章第一时间推送。

扫一下这个神奇的二维码,Wifi不用输密码_第2张图片

你可能感兴趣的:(Python的乐趣,python)