Simplest way to connect WiFi python
Asked Answered
T

4

9

I would like to connect to my wifi network using python. I know the SSID and the key for the network, and it's encrypted in WPA2 security. I have seen some libraries like wireless and pywifi but the first didn't work and the second was too complicated. What is the simpelest way to connect to wifi? what is the best library/way?

My failed code using wireless library (I've installed it via pip, of course):

from wireless import Wireless

wire = Wireless()
wire.connect(ssid='myhome',password='password')

interpreter output:

Traceback (most recent call last):
File "C:/Users/Aviv/PycharmProjects/Networks/WiFi/1/1.py", line 4, in 
<module>
wire = Wireless()
File "C:\Python27\lib\site-packages\wireless\Wireless.py", line 23, in 
__init__
self._driver_name = self._detectDriver()
File "C:\Python27\lib\site-packages\wireless\Wireless.py", line 50, in 
_detectDriver
compare = self.vercmp(ver, "0.9.9.0")
File "C:\Python27\lib\site-packages\wireless\Wireless.py", line 71, in vercmp
return cmp(normalize(actual), normalize(test))
File "C:\Python27\lib\site-packages\wireless\Wireless.py", line 70, in 
normalize
return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")]
ValueError: invalid literal for int() with base 10: 'file'
Twofaced answered 1/2, 2019 at 12:16 Comment(4)
Can you show what you tried and what error that you are facing?Hebron
I tried your code on my Ubuntu 16.04 it's working!Hebron
maybe the problem is in your wireless driver, not in your codeHebron
maybe connection driver have relay configuration and could have module errors but you need to take a look to the Traceback error log and try to solve it path filesystemPolyphone
V
15

Easy way to connect Wifi without any modules:

import os


class Finder:
    def __init__(self, *args, **kwargs):
        self.server_name = kwargs['server_name']
        self.password = kwargs['password']
        self.interface_name = kwargs['interface']
        self.main_dict = {}

    def run(self):
        command = """sudo iwlist wlp2s0 scan | grep -ioE 'ssid:"(.*{}.*)'"""
        result = os.popen(command.format(self.server_name))
        result = list(result)

        if "Device or resource busy" in result:
                return None
        else:
            ssid_list = [item.lstrip('SSID:').strip('"\n') for item in result]
            print("Successfully get ssids {}".format(str(ssid_list)))

        for name in ssid_list:
            try:
                result = self.connection(name)
            except Exception as exp:
                print("Couldn't connect to name : {}. {}".format(name, exp))
            else:
                if result:
                    print("Successfully connected to {}".format(name))

    def connection(self, name):
        cmd = "nmcli d wifi connect {} password {} iface {}".format(name,
            self.password,
            self.interface_name)
        try:
            if os.system(cmd) != 0: # This will run the command and check connection
                raise Exception()
        except:
            raise # Not Connected
        else:
            return True # Connected

if __name__ == "__main__":
    # Server_name is a case insensitive string, and/or regex pattern which demonstrates
    # the name of targeted WIFI device or a unique part of it.
    server_name = "example_name"
    password = "your_password"
    interface_name = "your_interface_name" # i. e wlp2s0  
    F = Finder(server_name=server_name,
               password=password,
               interface=interface_name)
    F.run()
Viceregal answered 3/4, 2019 at 7:52 Comment(0)
H
3

I hope you are using a windows machine. Then you should install winwifi module. Before installing the winwifi module, it is better to install plumbum module . Try it install in python 32 bit version.

Click this to install plumbum module: https://pypi.org/project/plumbum/

Then install winwifi :https://pypi.org/project/winwifi/

Now you could try connecting a known wifi using the following code:

import winwifi
winwifi.WinWiFi.connect('ssid_of_the_router')

This module has many more commands like:

winwifi.WinWiFi.disconnect()

winwifi.WinWiFi.addprofile('ssid_of_new_router'), etc.

You can check this by exploring my github repository: https://github.com/ashiq-firoz/winwifi_Guide

Hyperostosis answered 28/8, 2020 at 15:36 Comment(0)
C
2

If you are using Ubuntu/linux, you can use the natively available network manager cli package (nmcli):

import subprocess

def what_wifi():
    process = subprocess.run(['nmcli', '-t', '-f', 'ACTIVE,SSID', 'dev', 'wifi'], stdout=subprocess.PIPE)
    if process.returncode == 0:
        return process.stdout.decode('utf-8').strip().split(':')[1]
    else:
        return ''

def is_connected_to(ssid: str):
    return what_wifi() == ssid

def scan_wifi():
    process = subprocess.run(['nmcli', '-t', '-f', 'SSID,SECURITY,SIGNAL', 'dev', 'wifi'], stdout=subprocess.PIPE)
    if process.returncode == 0:
        return process.stdout.decode('utf-8').strip().split('\n')
    else:
        return []
        
def is_wifi_available(ssid: str):
    return ssid in [x.split(':')[0] for x in scan_wifi()]

def connect_to(ssid: str, password: str):
    if not is_wifi_available(ssid):
        return False
    subprocess.call(['nmcli', 'd', 'wifi', 'connect', ssid, 'password', password])
    return is_connected_to(ssid)

def connect_to_saved(ssid: str):
    if not is_wifi_available(ssid):
        return False
    subprocess.call(['nmcli', 'c', 'up', ssid])
    return is_connected_to(ssid)

Connect to a saved network:

connect_to_saved('my_wifi')

Otherwise, connect to a network with ssid and password:

connect_to('my_wifi', 'my_password')
Candidacandidacy answered 22/8, 2022 at 17:54 Comment(0)
M
1

You may try to just call the common built-in shell commands to connect to a WiFi, like on iOS:

networksetup -setairportnetwork en0 'SSDID' 'PASSWORD'

Take this to the os-library:

result = os.system("networksetup -setairportnetwork en0 'SSID' 'PASSWORD'")

On iOS this returns a 0 if the connection was successfull, otherwise you get an error message.

Mentalist answered 25/5, 2023 at 5:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.