python 获取已连接wifi密码工具

个人博客

所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nixgnauhcuy's blog

如需转载,请标明出处!

技术是描述某种尚未发挥作用的东西的词汇. —— Douglas Adams

前言

😄鸽王回归,鸽了好久没发文章,难得有空,制作点简单的小工具!


原理

制作工具前,我们先了解下获取已连接过的 WIFI 账号密码的原理。

win+R 打开我们的 cmd 命令行窗口,输入 netsh wlan show network,可以获取当前网络接口下可连接的所有 WIFI 名称,如果想更多的信息,则输入 netsh wlan show networks mode=bssid,来显示当前周边有效无线网络的相关信息(网卡地址、加密类型、信号强度、无线电类型、占用频道、基本速率等信息)。

image
image

但是这些信息还不包括我们需要的 WIFI 名称及密码,所以我们再进一步,输入 netsh wlan show profiles,显示当前本机保存的 profiles,随后再单独对某一个配置文件进行查询,如图片中的 nixgnauhcuy,输入 netsh wlan show profiles nixgnauhcuy key=clear,在安全设置中的关键内容,可以看到我已连接的 WIFI nixgnauhcuy 的密码 123456789

image
image

通过上面的方式,我们就查到了单个 WIFI 的信息,那么剩下的就是将其遍历,获取本机下所有已连接设备的账号密码。


UI 界面

原理我们已经琢磨清楚了,那么我们就先来设计我们工具的界面 UI,再来写逻辑。(因为是做工具,所以我才会多此一举,做多一步,需要的可以熟悉熟悉 QT,不需要的可以跳到下一步)

UI 界面我还是用 Qt Designer 来设计。界面功能比较简单,二个 Button 控件及一个 TabView 控件来实现,点击 Button 后获取本机下已连接账号和密码显示在 TabView 中,然后另一个 Button 将 TabView 的内容输出到表格中。

image

功能实现

因为原理相同,并且功能简单,所以将 UI 工具代码和不带 UI 的代码一起完成。

UI 版

将做好的 UI 文件保存到工程下,这里我将文件命名为 wifi_tool.ui,随后将 .ui 文件转成 Ui_wifi_tool.py.

Ui_wifi_tool.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(432, 270)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(20, 60, 391, 192))
        self.tableView.setObjectName("tableView")
        self.getButton = QtWidgets.QPushButton(self.centralwidget)
        self.getButton.setGeometry(QtCore.QRect(20, 20, 75, 23))
        self.getButton.setObjectName("getButton")
        self.saveButton = QtWidgets.QPushButton(self.centralwidget)
        self.saveButton.setGeometry(QtCore.QRect(340, 20, 75, 23))
        self.saveButton.setObjectName("saveButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "wifi tool"))
        self.getButton.setText(_translate("MainWindow", "获取"))
        self.saveButton.setText(_translate("MainWindow", "保存"))

随后在工程中编写我们的 main_ui.py,运行看看效果,

main_ui.py 代码如下:

# -*- coding: utf-8 -*-
import sys

from Ui_wifi_tool import Ui_MainWindow
from PyQt5.QtWidgets import (QApplication, QMainWindow)

class MyPyQT_Form(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    my_pyqt_form = MyPyQT_Form()
    my_pyqt_form.show()
    sys.exit(app.exec_())

运行效果如下:

image

开始编写我们的逻辑:

self.getButton.clicked.connect(self.get_wifi_info_butt)

def get_wifi_info_butt(self):
        # 获取本机下存在的 profile
        profiles = subprocess.run(["netsh", "wlan", "show", "profiles"], capture_output=True).stdout.decode('gbk')

        # 将 profile 中的 wifi 名取出
        wifi_names = (re.findall("所有用户配置文件 : (.*)\r", profiles))
        row = 0
        for wifi_name in wifi_names:
            column = 0
            item=QStandardItem('%s'% wifi_name)
            self.model.setItem(row, column, item)
            self.worksheet.write(row, column, wifi_name)

            # 获取 profile 中的密码
            profile_info = subprocess.run(["netsh", "wlan", "show", "profiles", wifi_name, "key=clear"], capture_output=True).stdout.decode('gbk')

            # 将 profile 中的 wifi 密码取出
            key = (re.findall("关键内容            : (.*)\r", profile_info))
            column += 1
            item=QStandardItem('%s'% str(key[0]))
            self.model.setItem(row, column, item)
            self.worksheet.write(row, column, str(key[0]))
            row += 1

上面主要运用 subprocess 模块,执行我们上述原理的指令,捕获指令执行后的输出,用正则表达式取出我们需要的内容,也就是账号及其密码,其次,还将账号密码写入 TabView 和表格中。

最后增加保存控件的逻辑,也就是保存账号密码的内容到表格 wifi_key.xls 中。

self.saveButton.clicked.connect(self.save_wifi_info_butt)

def save_wifi_info_butt(self):
        self.workbook.save('wifi_key.xls')
image
image

非 UI 版

非 UI 版逻辑同上,只是少了界面控件的操作,具体代码如下:

# -*- coding: utf-8 -*-
import subprocess
import re

if __name__ == '__main__':
    # 获取本机下存在的 profile
    profiles = subprocess.run(["netsh", "wlan", "show", "profiles"], shell=False, capture_output=True).stdout.decode('gbk')

    # 将 profile 中的 wifi 名取出
    wifi_names = (re.findall("所有用户配置文件 : (.*)\r", profiles))
    for wifi_name in wifi_names:

        # 获取 profile 中的密码
        profile_info = subprocess.run(["netsh", "wlan", "show", "profiles", wifi_name, "key=clear"], shell=False, capture_output=True).stdout.decode('gbk')

        # 将 profile 中的 wifi 密码取出
        key = (re.findall("关键内容            : (.*)\r", profile_info))

        print('name = ' + wifi_name + ', password =', key[0])
image

结语

关于本篇的相关代码已经上传到 github 上去了,有兴趣的可以访问 python_wifi_tool 查看,浏览的同时也可以在该 github 仓库中点个 Star 支持我一下😄。

与本文相关的内容还有:
python 开发环境搭建
python 制作串口工具(一)
python 制作串口工具(二)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容