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 шт):

Автор решения: ValdikSS

Ваш код проверяет название интерфейса на основании наличия IP-адреса на сетевых интерфейсах. Наличие IP-адресов не говорит о наличии работающего интернет-соединения (это может быть локальная сеть без доступа в интернет, например), и не говорит о том, что оно вообще используется: IP-адрес может быть назначен, но никакие маршруты не установлены (типичная ситуация для интерфейсов виртуальных машин).

Самое простое, что можно сделать в вашем случае — определить имя или тип интерфейса маршрута по умолчанию. Сделать это можно, например, следующим образом:

  1. Создать UDP-сокет и посмотреть его исходящий IP-адрес
  2. Проверить, какому из интерфейсов этот адрес принадлежит

Вроде того:

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
→ Ссылка