Connect to a WiFi network in Python
Connecting a computer to the internet has become inevitable now. The connection can be made either with Ethernet technology or Wi-Fi technology. Though every Operating System offers way with its simple easy GUI, using the Python script has a nice ring to it. This article explains how a computer can be connected to the internet with Wi-Fi technology using a Python script in Windows and Linux operating systems.
The netsh and nmcli
netsh is a command-line tool in Windows that offers various facilities for networking. To add a new Wi-Fi connection, Windows requires the credentials to be stored in an XML file.nmcli is a command-line tool in the Linux distributions that offers facilities for networking. Unlike Windows netsh, nmlci is quite simple to use. These commands are used in the Python script to connect to a network.
A Python script to connect with Wi-Fi network
Typing a series of commands every time for connecting to a network can be annoying. With the knowledge of the commands, a Python script can be used to do it. The script works by executing the commands in a subshell. Here is a Python script that connects to a Wi-Fi network, given its name and password (for new networks).
import os
import platform
import getpass
def createNewConnection(name, SSID, key):
config = """<?xml version=\"1.0\"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>"""+name+"""</name>
<SSIDConfig>
<SSID>
<name>"""+SSID+"""</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
<MSM>
<security>
<authEncryption>
<authentication>WPA2PSK</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>false</protected>
<keyMaterial>"""+key+"""</keyMaterial>
</sharedKey>
</security>
</MSM>
</WLANProfile>"""
if platform.system() == "Windows":
command = "netsh wlan add profile filename=\""+name+".xml\""+" interface=Wi-Fi"
with open(name+".xml", 'w') as file:
file.write(config)
elif platform.system() == "Linux":
command = "nmcli dev wifi connect '"+SSID+"' password '"+key+"'"
os.system(command)
if platform.system() == "Windows":
os.remove(name+".xml")
def connect(name, SSID):
if platform.system() == "Windows":
command = "netsh wlan connect name=\""+name+"\" ssid=\""+SSID+"\" interface=Wi-Fi"
elif platform.system() == "Linux":
command = "nmcli con up "+SSID
os.system(command)
def displayAvailableNetworks():
if platform.system() == "Windows":
command = "netsh wlan show networks interface=Wi-Fi"
elif platform.system() == "Linux":
command = "nmcli dev wifi list"
os.system(command)
try:
displayAvailableNetworks()
option = input("New connection (y/N)? ")
if option == "N" or option == "":
name = input("Name: ")
connect(name, name)
print("If you aren't connected to this network, try connecting with correct credentials")
elif option == "y":
name = input("Name: ")
key = getpass.getpass("Password: ")
createNewConnection(name, name, key)
connect(name, name)
print("If you aren't connected to this network, try connecting with correct credentials")
except KeyboardInterrupt as e:
print("\nExiting...")The script uses platform.system() to identify commands for the appropriate platform. Here the commands are executed in a subshell with os.system() method with a command as its argument. getpass() is a method that can make password invisible when typed. The try-except is used to prevent any runtime exceptions.
Running the script in Windows produces the following output.
Output when connecting to a known network
Interface name : Wi-Fi
There are 1 networks currently visible.
SSID 1 : Lenovo Wi-Fi
Network type : Infrastructure
Authentication : WPA2-Personal
Encryption : CCMP
New connection (y/N)?
Name: Lenovo Wi-Fi
Connection request was completed successfully.
If you aren't connected to this network, try connecting with correct credentialsOutput when connecting to a new network
Interface name : Wi-Fi
There are 1 networks currently visible.
SSID 1 : Lenovo Wi-Fi
Network type : Infrastructure
Authentication : WPA2-Personal
Encryption : CCMP
New connection (y/N)? y
Attempting to add Profile...
Name: Lenovo Wi-Fi
Password:
Profile Lenovo Wi-Fi is added on interface Wi-Fi.
Connection request was completed successfully.
If you aren't connected to this network, try connecting with correct credentialsRunning the script in Linux produces some pretty output.
Output when connecting to a known network
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
E4:A7:C5:C1:75:E6 Lenovo Wi-Fi Infra 11 65 Mbit/s 100 ▂▄▆█ WPA2
New connection (y/N)?
Name: Lenovo Wi-Fi
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
If you aren't connected to this network, try connecting with correct credentialsOutput when connecting to a new network
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
E4:A7:C5:C1:75:E6 Lenovo Wi-Fi Infra 11 65 Mbit/s 100 ▂▄▆█ WPA2
New connection (y/N)? y
Name: Lenovo Wi-Fi
Password:
Device 'wlp2s0' successfully activated with '82005b12-d6a5-4601-9579-113214923eb9'.
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
If you aren't connected to this network, try connecting with correct credentialsI hope you have understood and able to connect with the WiFi network by yourself by writing code in Python.
Leave a Reply