Quero ver se consigo acessar uma API online, mas para isso preciso ter acesso à Internet.
Como posso ver se há uma conexão disponível e ativa usando o Python?
python
networking
aF.
fonte
fonte
easy_install system_of_tubes
Respostas:
Talvez você possa usar algo como isto:
Atualmente, 216.58.192.142 é um dos endereços IP do google.com. Mude
http://216.58.192.142
para qualquer site que possa responder rapidamente .Esse IP fixo não será mapeado para google.com para sempre. Portanto, esse código não é robusto - ele precisará de manutenção constante para mantê-lo funcionando.
O motivo pelo qual o código acima usa um endereço IP fixo em vez de um nome de domínio totalmente qualificado (FQDN) é porque um FQDN exigiria uma pesquisa de DNS. Quando a máquina não possui uma conexão com a Internet, a própria pesquisa de DNS pode bloquear a chamada
urllib_request.urlopen
por mais de um segundo. Obrigado a @rzetterberg por apontar isso.Se o endereço IP fixo acima não estiver funcionando, você poderá encontrar um endereço IP atual para google.com (no unix) executando
fonte
urlopen
não levará muito mais que 1 segundo, mesmo que a internet não esteja" ligada "." - citação. Isso não é verdade se o URL fornecido for inválido; a pesquisa de DNS será bloqueada. Isso é verdadeiro apenas para a conexão real com o servidor da web. A maneira mais simples de evitar esse bloco de pesquisa de DNS é usar o endereço IP em vez disso, então é garantido para ter apenas um segundo :)http://google.com
e então você resolve todos os problemas que todo mundo continua falando aqui. Não há necessidade de usar um endereço IP ...Se pudermos nos conectar a algum servidor da Internet, teremos realmente conectividade. No entanto, para uma abordagem mais rápida e confiável, todas as soluções devem atender aos seguintes requisitos, no mínimo:
Para cumpri-las, uma abordagem seria: verificar se um dos servidores DNS públicos do Google está acessível. Os endereços IPv4 para esses servidores são
8.8.8.8
e8.8.4.4
. Podemos tentar conectar-se a qualquer um deles.Um Nmap rápido do host
8.8.8.8
deu o resultado abaixo:Como podemos ver,
53/tcp
é aberto e não filtrado. Se você é um usuário não root, lembre-se de usarsudo
ou o-Pn
argumento para o Nmap enviar pacotes de análise criados e determinar se um host está ativo.Antes de tentarmos com o Python, vamos testar a conectividade usando uma ferramenta externa, Netcat:
Confirma NetCAT que podemos alcançar
8.8.8.8
mais53/tcp
. Agora podemos configurar uma conexão de soquete8.8.8.8:53/tcp
no Python para verificar a conexão:Outra abordagem poderia ser enviar um probe DNS criado manualmente para um desses servidores e aguardar uma resposta. Mas, suponho, pode ser mais lento em comparação devido a quedas de pacotes, falha na resolução de DNS etc. Por favor, comente se você pensa de outra forma.
ATUALIZAÇÃO # 1: Graças ao comentário de @ theamk, o tempo limite agora é um argumento e inicializado
3s
por padrão.ATUALIZAÇÃO # 2: fiz testes rápidos para identificar a implementação mais rápida e genérica de todas as respostas válidas para esta pergunta. Aqui está o resumo:
E mais uma vez:
True
na saída acima, significa que todas essas implementações dos respectivos autores identificam corretamente a conectividade com a Internet. O tempo é mostrado com resolução de milissegundos.ATUALIZAÇÃO # 3: testado novamente após a alteração no tratamento de exceções:
fonte
close()
o soquete?Será mais rápido fazer uma solicitação HEAD, para que nenhum HTML seja buscado.
Também tenho certeza que o google gostaria desta maneira :)
fonte
Como alternativa às respostas do ubutnu / Kevin C, eu uso o
requests
pacote assim:Bônus: isso pode ser estendido a essa função que faz ping em um site.
fonte
google.com
voltar a tentar novamente, eles bloquearão nosso IP. Então, existe alguma outra maneira?Apenas para atualizar o que o unutbu disse para o novo código no Python 3.2
E, apenas para observar, a entrada aqui (referência) é o URL que você deseja verificar: sugiro escolher algo que se conecte rapidamente onde você mora - ou seja, eu moro na Coréia do Sul, então provavelmente definiria a referência http: / /www.naver.com .
fonte
Você pode apenas tentar fazer o download de dados e, se a conexão falhar, você saberá que algumas coisas com a conexão não estão bem.
Basicamente, você não pode verificar se o computador está conectado à Internet. Pode haver muitas razões para a falha, como configuração de DNS incorreta, firewalls, NAT. Portanto, mesmo se você fizer alguns testes, não poderá ter certeza de que terá conexão com sua API até tentar.
fonte
Para python 3, use
urllib.request.urlopen(host)
fonte
Tente a operação que você estava tentando fazer de qualquer maneira. Se falhar, o python deve lançar uma exceção para você saber.
Tentar alguma operação trivial primeiro para detectar uma conexão introduzirá uma condição de corrida. E se a conexão à Internet for válida quando você testar, mas cair antes de precisar fazer um trabalho real?
fonte
Isso pode não funcionar se o host local tiver sido alterado de
127.0.0.1
TryA menos que editado, o IP do seu computador será 127.0.0.1 quando não estiver conectado à Internet. Esse código basicamente obtém o endereço IP e pergunta se é o endereço IP do host local. espero que ajude
fonte
fonte
Uma solução portátil moderna com
requests
:Ou, uma versão que gera uma exceção:
fonte
A melhor maneira de fazer isso é fazer a verificação em um endereço IP que o python sempre fornece, caso não consiga encontrar o site. Nesse caso, este é o meu código:
fonte
meu favorito, ao executar scripts em um cluster ou não
isso executa o wget silenciosamente, sem baixar nada, mas verificando se o arquivo remoto fornecido existe na web
fonte
Tomando a resposta do unutbu como ponto de partida e tendo sido queimado no passado por uma alteração de endereço IP "estático", criei uma classe simples que verifica uma vez usando uma pesquisa DNS (ou seja, usando o URL " https: // www .google.com ") e, em seguida, armazena o endereço IP do servidor que responde para uso nas verificações subsequentes. Dessa forma, o endereço IP está sempre atualizado (assumindo que a classe seja reinicializada pelo menos uma vez a cada poucos anos). Também dou crédito a gawry por esta resposta , que me mostrou como obter o endereço IP do servidor (após qualquer redirecionamento, etc.). Por favor, desconsidere o aparente hackiness desta solução, estou indo para um exemplo de trabalho mínimo aqui. :)
Aqui está o que eu tenho:
fonte
Tomando a resposta de Six, acho que poderíamos simplificar de alguma forma, uma questão importante, pois os recém-chegados se perdem em questões altamente técnicas.
Aqui, o que eu finalmente usarei para aguardar que minha conexão (3G, lenta) seja estabelecida uma vez por dia para meu monitoramento fotovoltaico.
Funciona no Pyth3 com Raspbian 3.4.2
duração máxima: 5 minutos, se atingido, tentarei em uma hora, mas é outro script!
fonte
Tomando a resposta de Ivelin e adicionando uma verificação extra, meu roteador entrega seu endereço IP 192.168.0.1 e retorna uma cabeça se não tiver conexão com a Internet ao consultar o google.com.
fonte
Isso funciona para mim no Python3.6
fonte
Eu adicionei alguns ao código de Joel.
fonte
Para meus projetos, uso o script modificado para executar ping no servidor DNS público do Google 8.8.8.8. Usando um tempo limite de 1 segundo e bibliotecas python principais sem dependências externas:
O valor do tempo limite de seleção é 1, mas pode ser um número de ponto flutuante preferido para falhar mais rapidamente do que o segundo neste exemplo.
fonte
importe solicitações e tente este código python simples.
fonte