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

浏览: 1399

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

本教程将分享一个方法,可以将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二维码,生成适合自己的风格二维码。

参考资料:

shpaker/wifi_qrcode

lincolnloop/python-qrcode


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

fun_of_python.jpg

推荐 0
本文由 101python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册