WiFi共享二维码自动生成

  • 前言
  • 基本原理
  • Github上的实现与使用
    • 使用pip安装
    • 使用git安装
    • 使用AUR安装
    • 根据需求使用USage
  • 代码方法的实现与解释
    • 代码的下载
    • 部分代码的解释与修改
    • Windows系统运行源代码实际操作
  • 总结

前言

现今WiFi的使用已经覆盖到千家万户之中,甚至由于需求在一个地方会有多个WiFi。

当亲朋好友或者同事伙伴等首次来或WiFi密码有所改变时,就会存在要连接WiFi的需求。如果WiFi密码过于简单password66668888,会不安全也不放心;若密码过于复杂Dr0jEVQw13XzkGMTuJp03LNN8SMZ3XLi,告知与输入都极为麻烦。

现在的智能手机已经可以实现快速共享当时已连接的WiFi,如下图:


但仍会存在各种不便,不如将生成各个WiFi共享二维码图片后打印出来,此时使用手机扫二维码即可。这里分享推荐一个GitHub项目:wifi-password,该项目支持Windows、Linux、macOS。

来源:https://github.com/sdushantha/wifi-password

基本原理

对于一般使用的WiFi,当电脑连接成功后,此时电脑内已经有了此WiFi相关的信息如名称、密码等。

此Github项目主要基于两条电脑系统指令(本文均以Windows为例,以下均不赘述)。
首先,

netsh wlan show interfaces


主要为了获取SSID,后面的值即为连接的WiFi名称。

其次,

netsh wlan show profile name="SSID" key=clear


主要为了获取关键内容,后面的值即为连接的WiFi密码。

最后根据SSID关键内容生成二维码图片即可。

Github上的实现与使用

使用pip安装

python3 -m pip install --user wifi-password

使用git安装

git clone https://github.com/sdushantha/wifi-password
cd wifi-password
python3 setup.py install

使用AUR安装

sudo pamac build wifi-password

基于的语言:python
需要安装的库:qrcode、image、Pillow、colorama

根据需求使用USage

usage: wifi_password [options]
optional arguments:-h, --help            show this help message and exit--show-qr, -show      Show a ASCII QR code onto the terminal/console--save-qr [PATH], -save [PATH]Create the QR code and save it as an image--ssid SSID, -s SSID  Specify a SSID that you have previously connected to--version             Show version number

代码方法的实现与解释

会存在一些情况导致使用失败,可以通过下载源代码,通过相应修改代码的运行方式进行使用。

代码的下载

下载链接一:
https://files.pythonhosted.org/packages/source/w/wifi-password/wifi-password-1.1.1.tar.gz
下载地址二:
https://github.com/sdushantha/wifi-password/archive/master.zip

下载解压缩后:

其中wifi_password文件夹内容为:

主要使用与修改wifi_password.py源文件(以下为源代码):

#!/usr/bin/env python3"""
Quickly fetch your WiFi password and if needed, generate a QR code
of your WiFi to allow phones to easily connect
by Siddharth Dushantha
"""import pathlib
import sys
import subprocess
import argparse
from shutil import which
import re
import os
import qrcode
import colorama__version__ = "1.1.1"def run_command(command: str) -> str:"""Runs a given command using subprocess module"""env = os.environ.copy()env["LANG"] = "C"output, _ = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=True, env=env).communicate()return output.decode("utf-8").rstrip("\r\n")def print_error(text) -> None:"""Shows an error message and exits the program with the status code 1"""print(f"ERROR: {text}", file=sys.stderr)sys.exit(1)def get_ssid() -> str:"""Get the SSID which the computer is currently connected to"""if sys.platform == "darwin":airport = pathlib.Path("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport")if not airport.is_file():print_error(f"Can't find 'airport' command at {airport}")ssid = run_command(f"{airport} -I | awk '/ SSID/ {{print substr($0, index($0, $2))}}'")elif sys.platform == "linux":if which("nmcli") is None:print_error("Network Manager is required to run this program on Linux.")ssid = run_command("nmcli -t -f active,ssid dev wifi | egrep '^yes:' | sed 's/^yes://'")elif sys.platform == "win32":ssid = run_command("netsh wlan show interfaces | findstr SSID")if ssid == "":print_error("SSID was not found")ssid = re.findall(r"[^B]SSID\s+:\s(.*)", ssid)[0]return ssiddef get_password(ssid: str) -> str:"""Gets the password for a given SSID"""if ssid == "":print_error("SSID is not defined")if sys.platform == "darwin":password = run_command(f"security find-generic-password -l \"{ssid}\" -D 'AirPort network password' -w")elif sys.platform == "linux":# Check if the user is running with super user privilagesif os.geteuid() != 0:password = run_command(f"sudo nmcli -s -g 802-11-wireless-security.psk connection show '{ssid}'")else:password = run_command(f"nmcli -s -g 802-11-wireless-security.psk connection show '{ssid}'")elif sys.platform == "win32":password = run_command(f"netsh wlan show profile name=\"{ssid}\" key=clear | findstr Key")password = re.findall(r"Key Content\s+:\s(.*)", password)[0]if password == "":print_error("Could not find password")return passworddef generate_qr_code(ssid: str, password: str, path: str, show_qr: bool) -> None:"""Generate a QR code based on the given SSID and password"""# Source: https://git.io/JtLIvtext = f"WIFI:T:WPA;S:{ssid};P:{password};;"qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4)qr.add_data(text)if show_qr:# This will emulate support for ANSI escape sequences, which is needed# in order to display the QR code on Windowscolorama.init()qr.make()qr.print_tty()if path:file_name = ssid.replace(" ", "_") + ".png"if path == "STORE_LOCALLY":path = file_nametry:img = qr.make_image()img.save(path)except FileNotFoundError:print_error(f"No such file/directory: '{path}'")print(f"QR code has been saved to {path}")def main() -> None:parser = argparse.ArgumentParser(usage="%(prog)s [options]")parser.add_argument("--show-qr", "-show",action="store_true",default=False,help="Show a ASCII QR code onto the terminal/console")parser.add_argument("--save-qr", "-save",metavar="PATH",nargs="?",const="STORE_LOCALLY",help="Create the QR code and save it as an image")parser.add_argument("--ssid", "-s",help="Specify a SSID that you have previously connected to")parser.add_argument("--version",action="store_true",help="Show version number")args = parser.parse_args()if args.version:print(__version__)sys.exit()if args.ssid is None:args.ssid = get_ssid()password = get_password(args.ssid)if args.show_qr or args.save_qr:generate_qr_code(ssid=args.ssid, password=password, path=args.save_qr, show_qr=args.show_qr)returnprint(password)if __name__ == "__main__":main()

部分代码的解释与修改

首先,使用argparse模块编写命令行接口、解析参数及生成使用帮助手册。

其次,通过get_ssid()函数获取SSID,

def get_ssid() -> str:"""Get the SSID which the computer is currently connected to"""if sys.platform == "darwin":airport = pathlib.Path("/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport")if not airport.is_file():print_error(f"Can't find 'airport' command at {airport}")ssid = run_command(f"{airport} -I | awk '/ SSID/ {{print substr($0, index($0, $2))}}'")elif sys.platform == "linux":if which("nmcli") is None:print_error("Network Manager is required to run this program on Linux.")ssid = run_command("nmcli -t -f active,ssid dev wifi | egrep '^yes:' | sed 's/^yes://'")elif sys.platform == "win32":ssid = run_command("netsh wlan show interfaces | findstr SSID")if ssid == "":print_error("SSID was not found")ssid = re.findall(r"[^B]SSID\s+:\s(.*)", ssid)[0]return ssid

【注】

  1. 根据不同操作系统会对应相应的运行命令;
  2. 使用Windows系统时,返回的SSID实际可能为WiFi名\r,可以在最后前修改为:
ssid = ssid[:-1]        # 去除\r
return ssid

接着,通过get_password(ssid: str)函数获取PassWord,传入的参数为上一步获取的SSID值。

【注】

  1. 若操作系统的终端命令结果为中文结果,则需将**run_command(command: str)**方法中的返回值修改为:
return output.decode("gbk").rstrip("\r\n")
  1. password值的获取也相应修改为:
password = run_command(f"netsh wlan show profile name=\"{ssid}\" key=clear | findstr 关键内容")
password = re.findall(r"关键内容\s+:\s(.*)", password)[0]

最后,若将获取的SSIDPassWord参数传入**generate_qr_code(ssid: str, password: str, path: str, show_qr: bool)**函数中,可以生成WiFi共享二维码。

Windows系统运行源代码实际操作

  1. 打开cmd命令提示符
  2. cd切换路径至源文件所在文件夹;
  3. 确定安装的qrcode、image、Pillow、colorama库所在的环境被激活activate
  4. 输入python wifi-password.py,可以显示密码;
  5. 输入python wifi-password.py -show,可以在命令窗口显示二维码;
  6. 输入python wifi-password.py -save,可以在目录文件夹下保存二维码图片;


  7. 还有其他功能就不多做赘述了。

总结

本项目首次是在微信文章上看到【逛逛Github】,本着有趣的想法进行尝试。

WiFi共享二维码自动生成相关推荐

  1. JAVA实现基于ZXing的二维码自动生成与图片合成

    JAVA实现基于ZXing的二维码自动生成与图片合成 近日做项目需要生成带有信息的二维码,并嵌入到一张图片中.实现思路采用Zxing生成二维码,java图形库进行图片的嵌入. 生成二维码 ZXing是 ...

  2. Chrome浏览器地址栏配置二维码自动生成工具

    打开Chrome浏览器 新开一个窗口地址栏输入 chrome://flags/ 搜索qr code 下拉框选择Enable选项 重启浏览器即可 点击需要生成二维码的网页地址栏 出现如下图标 点击小图标 ...

  3. 小程序参数二维码自动生成

    当小程序审核通过后,那么线上的小程序二维码是如何生成呢?芝麻小程序码提供了程序二维码生成工具. 网址如下 https://weixin.hotapp.cn 芝麻小程序码的特色 (1)支持小程序路径带参 ...

  4. 二维码条形码生成打印软件C#源码,根据变量自动添加抬头

    二维码条形码生成打印软件C#源码,根据变量自动添加抬头,非常方便,工控朋友可以直接拿过去使用,完整源码 16100635774317133鲲鹏自动化

  5. 如何在浏览器实现二维码流水号生成并实现自动打打印(上篇)

    如何在浏览器实现二维码流水号生成并实现自动打打印(上篇) (原创) 这编文章介绍如何在C/S架构的系统里,添加一个生成打印二维码 /条形码的页面,并业实现流水号自动打印的方法. 网页生成二维码 /条形 ...

  6. 二维码图片生成工具C#winform源码

    二维码图片生成工具C#winform源码 源码描述: 一.源码特点 采用winform进行开发,生成二维码并保存,欢迎下载 二.功能介绍 本源码是一个可以自动生成二维码图片的小模块,可以添加自己的lo ...

  7. 微信公众号渠道二维码怎么生成?可以进行用户分组吗?

    公众号渠道二维码是一种带参数的二维码,微信公众平台为服务号提供了生成带参二维码的接口,满足服务号的推广分析需求,运营者可以通过渠道二维码来判定粉丝来源,并对用户进行分组管理. 微信公众号渠道二维码的作 ...

  8. 如何生成二维码?生成二维码其实很简单

    如何生成二维码?在日常的工作学习中我们总是会接触到各种各样的二维码,比如支付宝收款码.公众号主页码.广告宣传码等等.有一些二维码我们直接保存就可以,但是有一些二维码却需要我们自己进行制作.下面小编就来 ...

  9. 微信二维码的生成(java后端)--邀请新人

    目录 写在前言 1.微信官方文档 2.具体分析 写在前言 最近因为在学习微信小程序邀请新用户的功能,所以需要后端生成二维码并且携带本人的用户id或者其他的信息,传给前端.用户通过这个二维码去进行登录或 ...

  10. 微信小程序二维码如何生成?

    微信小程序二维码能够方便小程序的推广,那么微信小程序的二维码如何生成?微信小程序二维码都有哪些? 正式二维码 在"设置"中查看小程序的正式二维码,该二维码只用于访问小程序的线上正式 ...

最新文章

  1. EPSON机器人_SPEL+语言
  2. 使用python完成的一个烟花小程序-厉害了,我用Python写了一个自动回复拜年信息的小程序!...
  3. 19.Extjs主页面显示js
  4. WPF布局控件Grid的基本使用 - 使用kaxaml
  5. Spring AOP里面的几个名词的概念:
  6. centos mysql 5.6 源码_Centos7环境中mysql-5.6.39 源码安装
  7. 未来社区及其趋势探索
  8. Leetcode每日一题:7.整数反转
  9. Html中文字过多,单行超出和多行超出显示省略号
  10. NLP论文中出现的名词解释(不断更新)
  11. python爬虫抓文章_公众号文章抓取(python爬虫如何抓取微信公众号文章)
  12. Java 设计模式最佳实践:六、让我们开始反应式吧
  13. 怎样鉴别台式计算机主板型号,如何识别联想主板型号
  14. 企业产品互联网推广的有效方法
  15. 100个优秀安全测试工具
  16. 钢铁侠是如何练成的(一)
  17. Oracle的异构数据迁移工具 - OMW及ODI
  18. 推荐六款逆天好用的黑科技微信小程序,手机内存再小也可以任性耍
  19. Pixhawk指示灯的含义
  20. AMBA总线---APB总线协议

热门文章

  1. resin设置权限_Resin学习笔记
  2. 用Java生成word文档
  3. 经纬度 距离 mysql_mysql 根据经纬度计算距离并排序
  4. linux新硬盘装系统,目前是windows,要全新硬盘安装linux,该怎么操作?
  5. 南大lamda实验室失败面经分享
  6. 一个北京妞儿写的经典的话,太现实了!
  7. java j2se下载_J2SE基础之下载eclipse并创建项目
  8. 在SQL 2014 Server上安装Northwind和Pubs示例数据库
  9. 【安卓按键精灵自动取色(可用于比色,多点找色,找图实现)】
  10. 软件测试书在线阅读,软件测试实用教程