Je veux voir si je peux accéder à une API en ligne, mais pour cela, je dois avoir un accès à Internet.
Comment puis-je voir si une connexion est disponible et active en utilisant Python ?
Je veux voir si je peux accéder à une API en ligne, mais pour cela, je dois avoir un accès à Internet.
Comment puis-je voir si une connexion est disponible et active en utilisant Python ?
Vous pourriez peut-être utiliser quelque chose comme ça :
import urllib2
def internet_on():
try:
urllib2.urlopen('http://216.58.192.142', timeout=1)
return True
except urllib2.URLError as err:
return False
Actuellement, 216.58.192.142 est l'une des adresses IP de google.com. Changement http://216.58.192.142
sur n'importe quel site où l'on peut s'attendre à une réponse rapide .
Cette IP fixe ne correspondra pas à google.com pour toujours. Ce code n'est donc pas pas robuste -- il faudra une maintenance constante pour qu'il continue à fonctionner.
La raison pour laquelle le code ci-dessus utilise une adresse IP fixe au lieu d'un nom de domaine pleinement qualifié (FQDN) est qu'un FQDN nécessiterait une consultation du DNS. Lorsque la machine ne dispose pas d'une connexion Internet opérationnelle, la recherche DNS elle-même peut bloquer l'appel à l'adresse IP. urllib_request.urlopen
pendant plus d'une seconde. Merci à @rzetterberg de l'avoir signalé.
Si l'adresse IP fixe ci-dessus ne fonctionne pas, vous pouvez trouver une adresse IP courante pour google.com (sur unix) en exécutant
% dig google.com +trace
...
google.com. 300 IN A 216.58.192.142
Juste une note sur "l'appel à urlopen
ne prendra pas beaucoup plus d'une seconde, même si l'internet n'est pas "allumé"". Ce n'est pas vrai si l'url fournie n'est pas valide, alors la recherche DNS sera bloquée. C'est seulement vrai pour la connexion réelle au serveur web. La façon la plus simple d'éviter ce blocage de la recherche DNS est d'utiliser l'adresse IP à la place, ce qui garantit que la recherche ne prendra qu'une seconde :)
CELA NE FONCTIONNE PLUS. En date de septembre 2013, 74.125.113.99 s'arrête après un long moment, donc cette fonction retournera toujours False. Je suppose que Google a modifié la configuration de son réseau.
@theamk : Merci de m'avoir prévenu. Je l'ai changé en 74.125.228.100 ce qui devrait fonctionner pour l'instant.
En guise d'alternative aux réponses de ubutnu/Kevin C, j'utilise la fonction requests
paquet comme ça :
import requests
def connected_to_internet(url='http://www.google.com/', timeout=5):
try:
_ = requests.head(url, timeout=timeout)
return True
except requests.ConnectionError:
print("No internet connection available.")
return False
Bonus : cette fonction peut être étendue à une fonction de ping pour un site web.
def web_site_online(url='http://www.google.com/', timeout=5):
try:
req = requests.head(url, timeout=timeout)
# HTTP errors are not raised by default, this statement does that
req.raise_for_status()
return True
except requests.HTTPError as e:
print("Checking internet connection failed, status code {0}.".format(
e.response.status_code))
except requests.ConnectionError:
print("No internet connection available.")
return False
La demande est une grande bibliothèque. Cependant, contrairement à de nombreux exemples ici, j'utiliserais Exemple de l'IANA.com ou example.org comme un choix plus fiable à long terme, car il est entièrement contrôlé par l'administration de l'État. ICANN .
Existe-t-il un autre moyen de vérifier l'état de fonctionnement d'Internet ? Parce que si vous vous languissez google.com
encore une fois, alors ils bloqueront notre IP. Alors, y a-t-il un autre moyen ?
Très bien. Je l'ai modifié en utilisant requests.head()
pour obtenir uniquement une réponse HEAD.
Juste pour mettre à jour ce qu'a dit unutbu pour le nouveau code dans Python 3.2
def check_connectivity(reference):
try:
urllib.request.urlopen(reference, timeout=1)
return True
except urllib.request.URLError:
return False
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 -- par exemple, je vis en Corée du Sud, donc je mettrais probablement la référence à http://www.naver.com .
Vous pouvez simplement essayer de télécharger des données, et si la connexion échoue, vous saurez que quelque chose ne va pas avec la connexion.
En fait, vous ne pouvez pas vérifier si l'ordinateur est connecté à Internet. Il peut y avoir de nombreuses raisons à cet échec, comme une mauvaise configuration DNS, des pare-feu, NAT. Ainsi, même si vous effectuez des tests, vous ne pouvez pas garantir que vous aurez une connexion avec votre API avant d'essayer.
Ça n'a pas besoin d'être aussi bon. J'ai simplement besoin d'essayer de me connecter à un site ou d'envoyer un ping à quelque chose et si cela donne un timeout voilá. Comment puis-je faire cela ?
Y a-t-il une raison pour laquelle vous ne pouvez pas simplement essayer de vous connecter à l'API ? Pourquoi devez-vous la vérifier avant de vous connecter réellement ?
Essayez l'opération que vous vouliez faire de toute façon. Si elle échoue, python devrait vous envoyer une exception pour vous le faire savoir.
Essayer d'abord une opération triviale pour détecter une connexion revient à introduire une condition de course. Que se passe-t-il si la connexion Internet est valide au moment du test mais qu'elle tombe en panne avant que vous n'ayez à effectuer votre travail ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Si vous êtes en python, il est presque certain qu'une exception sera levée en cas d'échec de connexion ou de dépassement de délai. Vous pouvez soit essayer de contourner ce problème, soit le laisser remonter à la surface.
1 votes
@Triptych : J'espère que c'était une blague, parce que ça ne marche pas.
2 votes
@inspecteurG4dget :
easy_install system_of_tubes
2 votes
@aF : Regardez la solution d'Unutbu. Elle montre (de la manière la plus rapide possible) comment vérifier si vous pouvez accéder à google.com. Si votre problème concerne l'accès à l'API, pourquoi ne pas essayer d'y accéder en fixant timeout=1 ? Cela vous dira exactement si l'API à laquelle vous voulez accéder est accessible. Une fois que vous le savez, vous pouvez accéder à l'API ou attendre le moment où vous pourrez y accéder.
0 votes
Comme je l'ai dit, j'avais juste besoin d'une chose simple comme l'a dit unutbu. Tu n'as pas besoin de faire tant d'histoires avec ça
0 votes
@aF : Votre question n'a pas de sens. Il ne s'agit pas d'une "agitation". Vous demandez quelque chose qui ne peut pas exister. Vous ne pouvez pas vérifier des choses qui ne peuvent pas exister (comme une "connexion disponible et active"). Vous pouvez seulement faire la requête qui fonctionne ou échoue. Puisqu'il est impossible de répondre à la question (parce qu'une telle pensée ne peut pas exister), il serait bon d'envisager de mettre à jour la question afin qu'elle ait un sens et qu'elle reflète quelque chose que vous pourriez faire. vraiment mettre en œuvre.
0 votes
On pourrait suggérer une demande particulière qui pourrait être faite, et dont le succès serait testé, par procuration à l'intention originale de la question. Par exemple, vous voulez sauter certains tests s'il n'y a pas de connexion wifi ou ethernet ? C'est un désir parfaitement raisonnable. Dans ce cas, une bonne demande pourrait être de faire un ping sur Google, comme suggéré ci-dessus, ou d'essayer quelque chose de plus local, comme trouver l'IP de votre passerelle actuelle et essayer de faire un ping sur celle-ci ? Cela vous semble-t-il raisonnable ?