Je veux voir si je peux accéder à une API en ligne, mais pour cela, je dois avoir accès à Internet.
Comment puis-je voir s'il existe une connexion disponible et active à l'aide de Python?
python
networking
un F.
la source
la source
easy_install system_of_tubes
Réponses:
Vous pourriez peut-être utiliser quelque chose comme ceci:
Actuellement, 216.58.192.142 est l'une des adresses IP de google.com. Changez
http://216.58.192.142
pour n'importe quel site susceptible de répondre rapidement .Cette adresse IP fixe ne correspondra pas à google.com pour toujours. Donc, ce code n'est pas robuste - il aura besoin d'une maintenance constante pour continuer à fonctionner.
La raison pour laquelle le code ci-dessus utilise une adresse IP fixe au lieu d'un nom de domaine complet (FQDN) est qu'un FQDN nécessiterait une recherche DNS. Lorsque la machine ne dispose pas d'une connexion Internet fonctionnelle, la recherche DNS elle-même peut bloquer l'appel
urllib_request.urlopen
pendant plus d'une seconde. Merci à @rzetterberg pour l'avoir signalé.Si l'adresse IP fixe ci-dessus ne fonctionne pas, vous pouvez trouver une adresse IP actuelle pour google.com (sous unix) en exécutant
la source
urlopen
ne prendra pas beaucoup plus de 1 seconde même si Internet n'est pas" on "." - devis. Ce n'est pas vrai si l'url fournie n'est pas valide, la recherche DNS se bloquera. Cela n'est vrai que pour la connexion réelle au serveur Web. Le moyen le plus simple d'éviter ce bloc de recherche DNS est d'utiliser l'adresse IP à la place, alors il est garanti que cela ne prendra qu'une seconde :)http://google.com
et ensuite vous résolvez tous les problèmes dont tout le monde parle ici. Il n'est pas nécessaire d'utiliser une adresse IP ...Si nous pouvons nous connecter à un serveur Internet, nous avons effectivement une connectivité. Cependant, pour une approche la plus rapide et la plus fiable, toutes les solutions doivent au moins respecter les exigences suivantes:
Pour s'y conformer, une approche pourrait consister à vérifier si l'un des serveurs DNS publics de Google est accessible. Les adresses IPv4 de ces serveurs sont
8.8.8.8
et8.8.4.4
. Nous pouvons essayer de nous connecter à l'un d'entre eux.Un rapide Nmap de l'hôte a
8.8.8.8
donné le résultat ci-dessous:Comme nous pouvons le voir,
53/tcp
est ouvert et non filtré. Si vous êtes un utilisateur non root, n'oubliez pas d'utilisersudo
ou l'-Pn
argument pour Nmap pour envoyer des paquets de sonde spécialement conçus et déterminer si un hôte est actif.Avant d'essayer avec Python, testons la connectivité à l'aide d'un outil externe, Netcat:
Netcat confirme que nous pouvons atteindre
8.8.8.8
plus53/tcp
. Nous pouvons maintenant configurer une connexion socket8.8.8.8:53/tcp
en Python pour vérifier la connexion:Une autre approche pourrait consister à envoyer une sonde DNS construite manuellement à l'un de ces serveurs et à attendre une réponse. Mais, je suppose, cela pourrait s'avérer plus lent en comparaison en raison de pertes de paquets, d'un échec de résolution DNS, etc. Veuillez commenter si vous pensez le contraire.
UPDATE # 1: Grâce au commentaire de @ theamk, timeout est maintenant un argument et initialisé
3s
par défaut.MISE À JOUR # 2: J'ai fait des tests rapides pour identifier l'implémentation la plus rapide et la plus générique de toutes les réponses valides à cette question. Voici le résumé:
Et encore une fois:
True
dans la sortie ci-dessus signifie que toutes ces implémentations des auteurs respectifs identifient correctement la connectivité à Internet. L'heure est affichée avec une résolution en millisecondes.UPDATE # 3: Testé à nouveau après le changement de gestion des exceptions:
la source
close()
la prise?Il sera plus rapide de simplement faire une requête HEAD afin qu'aucun HTML ne soit récupéré.
De plus, je suis sûr que Google aimerait mieux de cette façon :)
la source
Comme alternative aux réponses ubutnu / Kevin C, j'utilise le
requests
package comme ceci:Bonus: cela peut être étendu à cette fonction qui pings un site Web.
la source
google.com
à nouveau, ils bloqueront notre adresse IP. Alors, y a-t-il un autre moyen.?Juste pour mettre à jour ce que unutbu a dit pour le nouveau code dans Python 3.2
Et, juste pour noter, l'entrée ici (référence) est l'url que vous voulez vérifier: je suggère de choisir quelque chose qui se connecte rapidement là où vous vivez - c'est-à-dire que je vis en Corée du Sud, donc je mettrais probablement une référence à http: / /www.naver.com .
la source
Vous pouvez simplement essayer de télécharger des données, et si la connexion échoue, vous saurez que quelque chose avec la connexion ne va pas.
En gros, vous ne pouvez pas vérifier si l'ordinateur est connecté à Internet. Il peut y avoir de nombreuses raisons d'échec, comme une mauvaise configuration DNS, des pare-feu, NAT. Donc, même si vous effectuez des tests, vous ne pouvez pas avoir la garantie que vous serez connecté à votre API avant d'essayer.
la source
Pour python 3, utilisez
urllib.request.urlopen(host)
la source
Essayez malgré tout l'opération que vous tentiez de faire. En cas d'échec, python devrait vous lancer une exception pour vous en informer.
Essayer d'abord une opération triviale pour détecter une connexion introduira une condition de concurrence. Que se passe-t-il si la connexion Internet est valide lorsque vous testez mais tombe en panne avant que vous n'ayez besoin d'effectuer un travail réel?
la source
Cela peut ne pas fonctionner si l'hôte local a été modifié depuis
127.0.0.1
TrySauf modification, l'adresse IP de votre ordinateur sera 127.0.0.1 lorsqu'elle n'est pas connectée à Internet. Ce code obtient essentiellement l'adresse IP, puis demande s'il s'agit de l'adresse IP de l'hôte local. J'espère que cela pourra aider
la source
la source
Une solution portable moderne avec
requests
:Ou, une version qui lève une exception:
la source
Le meilleur moyen de le faire est de le faire vérifier par rapport à une adresse IP que Python donne toujours s'il ne trouve pas le site Web. Dans ce cas, voici mon code:
la source
mon préféré, lors de l'exécution de scripts sur un cluster ou non
cela fonctionne tranquillement, sans rien télécharger mais en vérifiant que le fichier distant donné existe sur le Web
la source
Prenant la réponse d'unutbu comme point de départ, et ayant été gravé dans le passé par un changement d'adresse IP "statique", j'ai créé une classe simple qui vérifie une fois en utilisant une recherche DNS (c'est-à-dire en utilisant l'URL " https: // www .google.com "), puis stocke l'adresse IP du serveur répondant pour une utilisation lors de vérifications ultérieures. De cette façon, l'adresse IP est toujours à jour (en supposant que la classe est réinitialisée au moins une fois tous les quelques années environ). Je remercie également gawry pour cette réponse , qui m'a montré comment obtenir l'adresse IP du serveur (après toute redirection, etc.). Veuillez ne pas tenir compte du piratage apparent de cette solution, je vais ici pour un exemple de travail minimal. :)
Voici ce que j'ai:
la source
En prenant la réponse de Six, je pense que nous pourrions simplifier d'une manière ou d'une autre, une question importante car les nouveaux arrivants sont perdus dans des questions hautement techniques.
Voici ce que je vais enfin utiliser pour attendre que ma connexion (3G, lente) soit établie une fois par jour pour ma surveillance PV.
Fonctionne sous Pyth3 avec Raspbian 3.4.2
fonctionnement maximum: 5 minutes si atteint, j'essaierai dans une heure mais c'est un autre morceau de script!
la source
Prenant la réponse d'Ivelin et ajoutez une vérification supplémentaire car mon routeur fournit son adresse IP 192.168.0.1 et renvoie une tête s'il n'a pas de connexion Internet lors de l'interrogation de google.com.
la source
Cela fonctionne pour moi en Python3.6
la source
J'en ai ajouté quelques-uns au code de Joel.
la source
Pour mes projets, j'utilise un script modifié pour envoyer une requête ping au serveur DNS public de google 8.8.8.8. Utilisation d'un délai d'expiration de 1 seconde et des bibliothèques python principales sans dépendances externes:
La valeur du délai de sélection est 1, mais peut être un nombre à virgule flottante de choix pour échouer plus facilement que 1 seconde dans cet exemple.
la source
importez les demandes et essayez ce simple code python.
la source