Я хочу посмотреть, смогу ли я получить доступ к онлайн-API, но для этого мне нужен доступ в Интернет.
Как узнать, доступно ли соединение и используется ли оно с помощью Python?
python
networking
аР.
источник
источник
easy_install system_of_tubes
Ответы:
Возможно, вы могли бы использовать что-то вроде этого:
В настоящее время 216.58.192.142 является одним из IP-адресов google.com. Перейдите
http://216.58.192.142
на любой сайт, который отреагирует быстро .Этот фиксированный IP-адрес не будет навсегда привязан к google.com. Так что этот код не является надежным - для его работы потребуется постоянное обслуживание.
Причина, по которой в приведенном выше коде используется фиксированный IP-адрес вместо полного доменного имени (FQDN), заключается в том, что для полного доменного имени требуется поиск DNS. Когда на машине нет работающего подключения к Интернету, сам поиск DNS может блокировать вызов
urllib_request.urlopen
на более чем секунду. Спасибо @rzetterberg за указание на это.Если указанный выше фиксированный IP-адрес не работает, вы можете найти текущий IP-адрес для google.com (в Unix), запустив
источник
urlopen
не займет больше 1 секунды, даже если Интернет не включен» - цитата. Это неверно, если предоставленный URL-адрес недействителен, поиск DNS будет заблокирован. Это верно только для реального подключения к веб-серверу. Самый простой способ избежать этого блока поиска DNS - использовать вместо него IP-адрес, тогда это гарантированно займет всего 1 секунду :)http://google.com
и тогда ты решишь все проблемы, о которых все здесь говорят. Нет необходимости использовать IP-адрес ...Если мы можем подключиться к какому-либо интернет-серверу, то у нас действительно есть возможность подключения. Однако для наиболее быстрого и надежного подхода все решения должны как минимум соответствовать следующим требованиям:
Чтобы соответствовать им, одним из подходов может быть проверка доступности одного из общедоступных DNS-серверов Google . Адреса IPv4 для этих серверов:
8.8.8.8
и8.8.4.4
. Мы можем попробовать подключиться к любому из них.Быстрый Nmap хоста
8.8.8.8
дал следующий результат:Как видим,
53/tcp
открыт и не фильтруется. Если вы не являетесь пользователем root, не забудьте использоватьsudo
или-Pn
аргумент для Nmap для отправки специально созданных тестовых пакетов и определения, работает ли хост.Прежде чем мы попробуем с Python, давайте проверим подключение с помощью внешнего инструмента, Netcat:
Netcat подтверждает, что мы можем протянуть
8.8.8.8
руку помощи53/tcp
. Теперь мы можем установить соединение с сокетом8.8.8.8:53/tcp
в Python для проверки соединения:Другим подходом может быть отправка созданного вручную DNS-запроса на один из этих серверов и ожидание ответа. Но, я полагаю, это может оказаться медленнее по сравнению с отбрасыванием пакетов, ошибкой разрешения DNS и т. Д. Пожалуйста, прокомментируйте, если считаете иначе.
ОБНОВЛЕНИЕ № 1: Благодаря комментарию @ theamk, timeout теперь является аргументом и инициализируется
3s
по умолчанию.ОБНОВЛЕНИЕ № 2: Я провел быстрые тесты, чтобы определить самую быструю и наиболее общую реализацию всех правильных ответов на этот вопрос. Вот резюме:
И еще раз:
True
в приведенных выше выходных данных означает, что все эти реализации от соответствующих авторов правильно определяют подключение к Интернету. Время отображается с точностью до миллисекунд.ОБНОВЛЕНИЕ № 3: снова протестировано после изменения обработки исключений:
источник
close()
розетку?Будет быстрее сделать запрос HEAD, поэтому HTML не будет загружен.
Кроме того, я уверен, что Google хотел бы это лучше :)
источник
В качестве альтернативы ответам Убутну / Кевина С я использую такой
requests
пакет:Бонус: это может быть расширено до этой функции, которая пингует веб-сайт.
источник
google.com
снова будете тосковать , они заблокируют наш IP. Так есть ли другой способ?Просто чтобы обновить то, что unutbu сказал для нового кода в Python 3.2
И, чтобы отметить, ввод здесь (ссылка) - это URL-адрес, который вы хотите проверить: я предлагаю выбрать что-то, что быстро подключается там, где вы живете, т.е. я живу в Южной Корее, поэтому я, вероятно, установил бы ссылку на http: / /www.naver.com .
источник
Вы можете просто попытаться загрузить данные, и в случае сбоя соединения вы будете знать, что что-то с соединением не в порядке.
Обычно вы не можете проверить, подключен ли компьютер к Интернету. Причин сбоя может быть множество, например, неправильная конфигурация DNS, брандмауэры, NAT. Поэтому, даже если вы сделаете несколько тестов, вы не сможете гарантировать, что у вас будет соединение с вашим API, пока вы не попробуете.
источник
Для Python 3 используйте
urllib.request.urlopen(host)
источник
Все равно попробуйте выполнить операцию, которую вы пытались выполнить. Если это не удается, python должен выдать вам исключение, чтобы вы знали.
Если сначала попробовать какую-нибудь тривиальную операцию по обнаружению соединения, это приведет к возникновению состояния гонки. Что делать, если во время тестирования подключение к Интернету работает, но выходит из строя до того, как вам нужно будет заняться реальной работой?
источник
Это может не сработать, если localhost был изменен с
127.0.0.1
TryЕсли не редактировать, IP-адрес вашего компьютера будет 127.0.0.1, когда он не подключен к Интернету. Этот код в основном получает IP-адрес, а затем спрашивает, является ли это IP-адресом localhost. надеюсь, это поможет
источник
источник
Современное портативное решение с
requests
:Или версия, вызывающая исключение:
источник
Лучший способ сделать это - заставить его проверять IP-адрес, который Python всегда дает, если не может найти веб-сайт. В этом случае это мой код:
источник
мой любимый, при запуске скриптов в кластере или нет
он работает тихо, не загружая ничего, а проверяя, существует ли данный удаленный файл в сети
источник
Взяв ответ unutbu в качестве отправной точки и будучи в прошлом сожженным "статическим" изменением IP-адреса, я создал простой класс, который проверяет один раз с помощью поиска DNS (т. Е. С использованием URL " https: // www .google.com "), а затем сохраняет IP-адрес отвечающего сервера для использования при последующих проверках. Таким образом, IP-адрес всегда актуален (при условии, что класс повторно инициализируется не реже одного раза в несколько лет или около того). Я также отдаю должное gawry за этот ответ , который показал мне, как получить IP-адрес сервера (после любого перенаправления и т. Д.). Пожалуйста, не обращайте внимания на очевидное хакерство этого решения, я приведу здесь минимальный рабочий пример. :)
Вот что у меня есть:
источник
Принимая ответ Six, я думаю, что мы могли бы как-то упростить, важный вопрос, так как новички теряются в технических вопросах.
Вот что я, наконец, буду использовать, чтобы ждать, пока мое соединение (3G, медленное) будет устанавливаться один раз в день для моего PV мониторинга.
Работает под Pyth3 с Raspbian 3.4.2
Максимальная продолжительность: 5 минут, если достигну, я попробую через час, но это еще один сценарий!
источник
Принимая ответ Ивелина и добавьте дополнительную проверку, поскольку мой маршрутизатор выдает свой IP-адрес 192.168.0.1 и возвращает запрос, если у него нет подключения к Интернету при запросе google.com.
источник
Это работает для меня в Python3.6
источник
Я добавил несколько к коду Джоэла.
источник
Для своих проектов я использую скрипт, модифицированный для проверки связи с публичным DNS-сервером Google 8.8.8.8. Используя тайм-аут в 1 секунду и основные библиотеки Python без внешних зависимостей:
Значение тайм-аута выбора равно 1, но может быть числом с плавающей запятой, чтобы отказать быстрее, чем 1 секунда в этом примере.
источник
запросы на импорт и попробуйте этот простой код Python.
источник