Python проверка пк на подключение к WIFI
Интересует вопрос, кто-то пробовал реализовать программу на python которая проверяла подключен ли пк пользователя к wifi или к проводному интернету? Столкнулся с сложностями при создании такой программы, в интернете к сожалению не много информации об этом.
Потребность в такой программе связана с тормозным вай фаем при использовании браузера, пример моей программы прикладываю (не работает)
import psutil
def check_internet_connection():
interfaces = psutil.net_if_addrs()
for interface_name, interface_addresses in interfaces.items():
for address in interface_addresses:
if str(address.family) == 'AddressFamily.AF_INET':
if interface_name == 'Wi-Fi' or interface_name.startswith('Wi-Fi'):
return 'Подключен по WIFI'
else:
return 'Подключен по проводу'
return 'Нету подключения к интернету'
print(check_internet_connection())
Ответы (2 шт):
Ваш код проверяет название интерфейса на основании наличия IP-адреса на сетевых интерфейсах. Наличие IP-адресов не говорит о наличии работающего интернет-соединения (это может быть локальная сеть без доступа в интернет, например), и не говорит о том, что оно вообще используется: IP-адрес может быть назначен, но никакие маршруты не установлены (типичная ситуация для интерфейсов виртуальных машин).
Самое простое, что можно сделать в вашем случае — определить имя или тип интерфейса маршрута по умолчанию. Сделать это можно, например, следующим образом:
- Создать UDP-сокет и посмотреть его исходящий IP-адрес
- Проверить, какому из интерфейсов этот адрес принадлежит
Вроде того:
import psutil
import socket
def check_internet_connection():
# Создаём UDP-сокет
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# "Подключаем" его к 8.8.8.8:80 — нужно для обнаружения исходящего IP-адреса, никакие пакеты не будут отправлены
s.connect(("8.8.8.8", 80))
# Получаем исходящий IP-адрес
ipaddr, _ = s.getsockname()
interfaces = psutil.net_if_addrs()
for interface_name, interface_addresses in interfaces.items():
for address in interface_addresses:
if address.family == socket.AF_INET and ipaddr == address.address:
# Сопоставляем исходящий IP-адрес сокета названию интерфейса
return interface_name
print(check_internet_connection())
Возможно, когда-нибудь кому-нибудь пригодится:
import subprocess
import re
def is_wifi_connected():
result = subprocess.run(['netsh', 'interface', 'show', 'interface'], capture_output=True, text=True,encoding='cp866')
interfaces = result.stdout.split('\n')
for interface in interfaces:
if 'Беспроводная' in interface and 'Подключен' in interface:
return True
return False