온라인 API에 액세스 할 수 있는지 확인하고 싶지만 인터넷에 액세스해야합니다.
파이썬을 사용하여 연결이 가능하고 활성화되어 있는지 어떻게 알 수 있습니까?
easy_install system_of_tubes
온라인 API에 액세스 할 수 있는지 확인하고 싶지만 인터넷에 액세스해야합니다.
파이썬을 사용하여 연결이 가능하고 활성화되어 있는지 어떻게 알 수 있습니까?
easy_install system_of_tubes
답변:
아마도 당신은 다음과 같은 것을 사용할 수 있습니다 :
import urllib2
def internet_on():
try:
urllib2.urlopen('http://216.58.192.142', timeout=1)
return True
except urllib2.URLError as err:
return False
현재 216.58.192.142는 google.com의 IP 주소 중 하나입니다. 신속하게 응답 할 것으로 예상되는 사이트로 변경하십시오http://216.58.192.142
.
이 고정 IP는 google.com에 영원히 매핑되지 않습니다. 따라서이 코드는 강력하지 않습니다. 계속 작동하려면 지속적인 유지 관리가 필요합니다.
위 코드에서 FQDN (정규화 된 도메인 이름) 대신 고정 IP 주소를 사용하는 이유는 FQDN에 DNS 조회가 필요하기 때문입니다. 컴퓨터가 인터넷에 연결되어 있지 않으면 DNS 조회 자체가 urllib_request.urlopen
1 초 이상 통화를 차단할 수 있습니다 . 이것을 지적 해준 @rzetterberg에게 감사합니다.
위의 고정 IP 주소가 작동하지 않으면 다음을 실행하여 google.com (unix)의 현재 IP 주소를 찾을 수 있습니다.
% dig google.com +trace
...
google.com. 300 IN A 216.58.192.142
urlopen
인터넷이"켜져 있지 않은 경우에도 호출 시간이 1 초 이상 걸리지 않습니다. " 제공된 URL이 유효하지 않으면 DNS 조회가 차단됩니다. 웹 서버에 실제로 연결하는 경우에만 해당됩니다. 이 DNS 조회 블록을 회피하는 가장 간단한 방법은 :) 단 1 초 걸릴 대신 다음을 보장 년대 IP-ADRESS을 사용하는 것입니다
http://google.com
모든 사람들이 여기서 계속 이야기하는 모든 문제를 해결할 수 있습니다. IP 주소를 사용할 필요가 없습니다 ...
인터넷 서버에 연결할 수 있다면 실제로 연결되어있는 것입니다. 그러나 가장 빠르고 가장 안정적인 방법을 사용하려면 모든 솔루션이 최소한 다음 요구 사항을 준수해야합니다.
이를 준수하기위한 한 가지 방법은 Google의 퍼블릭 DNS 서버 중 하나에 도달 할 수 있는지 확인하는 것입니다 . 이 서버의 IPv4 주소는 8.8.8.8
및 8.8.4.4
입니다. 우리는 그들 중 하나에 연결을 시도 할 수 있습니다.
호스트의 빠른 Nmap 8.8.8.8
결과는 다음과 같습니다.
$ sudo nmap 8.8.8.8
Starting Nmap 6.40 ( http://nmap.org ) at 2015-10-14 10:17 IST
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.0048s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
53/tcp open domain
Nmap done: 1 IP address (1 host up) scanned in 23.81 seconds
우리가 볼 수 있듯이, 53/tcp
개방적이고 필터링되지 않습니다. 루트가 아닌 사용자 인 경우 Nmap에 대해 sudo
또는 -Pn
인수 를 사용 하여 제작 된 프로브 패킷을 전송하고 호스트가 작동 중인지 확인하십시오.
Python을 사용하기 전에 외부 도구 인 Netcat을 사용하여 연결을 테스트 해 보겠습니다.
$ nc 8.8.8.8 53 -zv
Connection to 8.8.8.8 53 port [tcp/domain] succeeded!
netcat을 확인한다 우리가 도달 할 수있는 8.8.8.8
이상 53/tcp
. 이제 8.8.8.8:53/tcp
파이썬에서 소켓 연결을 설정하여 연결 을 확인할 수 있습니다.
import socket
def internet(host="8.8.8.8", port=53, timeout=3):
"""
Host: 8.8.8.8 (google-public-dns-a.google.com)
OpenPort: 53/tcp
Service: domain (DNS/TCP)
"""
try:
socket.setdefaulttimeout(timeout)
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
return True
except socket.error as ex:
print(ex)
return False
internet()
다른 방법은 수동으로 조작 된 DNS 프로브를 이러한 서버 중 하나에 보내고 응답을 기다리는 것입니다. 그러나 패킷 손실, DNS 확인 실패 등으로 인해 속도가 느릴 수 있다고 생각합니다. 그렇지 않으면 의견을 말하십시오.
업데이트 # 1 : @theamk의 의견 덕분에 타임 아웃은 이제 인수이며 3s
기본적으로 초기화됩니다 .
업데이트 # 2 :이 질문에 대한 모든 유효한 답변의 가장 빠르고 가장 일반적인 구현을 식별하기 위해 빠른 테스트를 수행했습니다. 요약은 다음과 같습니다.
$ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
defos.py
True
00:00:00:00.487
iamaziz.py
True
00:00:00:00.335
ivelin.py
True
00:00:00:00.105
jaredb.py
True
00:00:00:00.533
kevinc.py
True
00:00:00:00.295
unutbu.py
True
00:00:00:00.546
7h3rAm.py
True
00:00:00:00.032
그리고 한 번 더 :
$ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
defos.py
True
00:00:00:00.450
iamaziz.py
True
00:00:00:00.358
ivelin.py
True
00:00:00:00.099
jaredb.py
True
00:00:00:00.585
kevinc.py
True
00:00:00:00.492
unutbu.py
True
00:00:00:00.485
7h3rAm.py
True
00:00:00:00.035
True
위 출력에서 각 작성자의 모든 구현이 인터넷 연결을 올바르게 식별 함을 나타냅니다. 시간은 밀리 초 해상도로 표시됩니다.
업데이트 # 3 : 예외 처리 변경 후 다시 테스트되었습니다.
defos.py
True
00:00:00:00.410
iamaziz.py
True
00:00:00:00.240
ivelin.py
True
00:00:00:00.109
jaredb.py
True
00:00:00:00.520
kevinc.py
True
00:00:00:00.317
unutbu.py
True
00:00:00:00.436
7h3rAm.py
True
00:00:00:00.030
close()
는 소켓 을 호출해서는 안 됩니까?
HEAD 요청을하는 것이 더 빠르므로 HTML을 가져 오지 않습니다.
또한 Google 이이 방법을 더 좋아할 것이라고 확신합니다. :)
try:
import httplib
except:
import http.client as httplib
def have_internet():
conn = httplib.HTTPConnection("www.google.com", timeout=5)
try:
conn.request("HEAD", "/")
conn.close()
return True
except:
conn.close()
return False
ubutnu / Kevin C 답변의 대안으로 다음 requests
과 같은 패키지를 사용합니다 .
import requests
def connected_to_internet(url='http://www.google.com/', timeout=5):
try:
_ = requests.get(url, timeout=timeout)
return True
except requests.ConnectionError:
print("No internet connection available.")
return False
보너스 : 이것은 웹 사이트를 핑하는이 기능으로 확장 될 수 있습니다.
def web_site_online(url='http://www.google.com/', timeout=5):
try:
req = requests.get(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
google.com
다시 고정 하면 IP가 차단되기 때문입니다. 다른 방법이 있습니까?
파이썬 3.2에서 새로운 코드에 대해 unutbu가 말한 것을 업데이트하기 만하면됩니다.
def check_connectivity(reference):
try:
urllib.request.urlopen(reference, timeout=1)
return True
except urllib.request.URLError:
return False
그리고 참고로, 여기에 입력 (참조)은 확인하려는 URL입니다 : 나는 당신이 살고있는 곳에서 빠르게 연결되는 것을 선택하는 것이 좋습니다. 즉, 나는 한국에 살고 있습니다 . /www.naver.com .
당신은 단지 데이터를 다운로드하려고 시도 할 수 있으며, 연결이 실패하면 연결에 문제가있는 것을 알 수 있습니다.
기본적으로 컴퓨터가 인터넷에 연결되어 있는지 확인할 수 없습니다. 잘못된 DNS 구성, 방화벽, NAT와 같은 여러 가지 실패 이유가있을 수 있습니다. 따라서 일부 테스트를 수행하더라도 시도 할 때까지 API와의 연결을 보장 할 수 없습니다.
localhost가 127.0.0.1
Try 에서 변경된 경우 작동하지 않을 수 있습니다
import socket
ipaddress=socket.gethostbyname(socket.gethostname())
if ipaddress=="127.0.0.1":
print("You are not connected to the internet!")
else:
print("You are connected to the internet with the IP address of "+ ipaddress )
편집하지 않으면 인터넷에 연결되지 않은 경우 컴퓨터의 IP는 127.0.0.1이됩니다. 이 코드는 기본적으로 IP 주소를 가져온 다음 그것이 로컬 호스트 IP 주소인지 묻습니다. 희망이 도움이
여기 내 버전이 있습니다
import requests
try:
if requests.get('https://google.com').ok:
print("You're Online")
except:
print("You're Offline")
현대적인 휴대용 솔루션 requests
:
import requests
def internet():
"""Detect an internet connection."""
connection = None
try:
r = requests.get("https://google.com")
r.raise_for_status()
print("Internet connection detected.")
connection = True
except:
print("Internet connection not detected.")
connection = False
finally:
return connection
또는 예외를 발생시키는 버전 :
import requests
from requests.exceptions import ConnectionError
def internet():
"""Detect an internet connection."""
try:
r = requests.get("https://google.com")
r.raise_for_status()
print("Internet connection detected.")
except ConnectionError as e:
print("Internet connection not detected.")
raise e
가장 좋은 방법은 파이썬이 웹 사이트를 찾을 수없는 경우 항상 제공하는 IP 주소를 확인하는 것입니다. 이 경우 이것은 내 코드입니다.
import socket
print("website connection checker")
while True:
website = input("please input website: ")
print("")
print(socket.gethostbyname(website))
if socket.gethostbyname(website) == "92.242.140.2":
print("Website could be experiencing an issue/Doesn't exist")
else:
socket.gethostbyname(website)
print("Website is operational!")
print("")
unutbu의 대답 을 출발점으로 삼아 과거에 "정적"IP 주소 변경으로 불에 타서 DNS 조회를 사용하여 한 번 확인하는 간단한 클래스를 만들었습니다 (예 : URL " https : // www .google.com ")으로 이동 한 다음 후속 검사에 사용할 응답 서버의 IP 주소를 저장합니다. 이런 식으로 IP 주소는 항상 최신 상태입니다 (수업이 적어도 몇 년마다 한 번씩 다시 초기화되었다고 가정). 또한 이 답변에 대해 gawry에게 신용을 주며 , 서버의 IP 주소를 얻는 방법을 보여줍니다 (리디렉션 등). 이 솔루션의 명백한 해킹을 무시하십시오. 여기서 최소한의 작업 예를 들겠습니다. :)
여기 내가 가진 것입니다 :
import socket
try:
from urllib2 import urlopen, URLError
from urlparse import urlparse
except ImportError: # Python 3
from urllib.parse import urlparse
from urllib.request import urlopen, URLError
class InternetChecker(object):
conn_url = 'https://www.google.com/'
def __init__(self):
pass
def test_internet(self):
try:
data = urlopen(self.conn_url, timeout=5)
except URLError:
return False
try:
host = data.fp._sock.fp._sock.getpeername()
except AttributeError: # Python 3
host = data.fp.raw._sock.getpeername()
# Ensure conn_url is an IPv4 address otherwise future queries will fail
self.conn_url = 'http://' + (host[0] if len(host) == 2 else
socket.gethostbyname(urlparse(data.geturl()).hostname))
return True
# Usage example
checker = InternetChecker()
checker.test_internet()
식스의 답변을 얻는다 나는 기술적 인 문제로 새로운 이민자들이 길을 잃었 기 때문에 어떻게 든 단순화 할 수 있다고 생각한다.
마지막으로 PV 모니터링을 위해 하루에 한 번 연결 (3G, 느림)이 설정 될 때까지 기다리는 데 사용합니다.
Pyth3에서 Raspbian 3.4.2와 함께 작동
from urllib.request import urlopen
from time import sleep
urltotest=http://www.lsdx.eu # my own web page
nboftrials=0
answer='NO'
while answer=='NO' and nboftrials<10:
try:
urlopen(urltotest)
answer='YES'
except:
essai='NO'
nboftrials+=1
sleep(30)
최대 실행 시간 : 5 분에 도달하면 한 시간 안에 다른 스크립트를 시도합니다!
내 라우터가 IP 주소 192.168.0.1을 전달하고 google.com을 쿼리 할 때 인터넷에 연결되어 있지 않으면 헤드를 반환하므로 Ivelin의 답변 을 얻고 추가 검사를 추가하십시오.
import socket
def haveInternet():
try:
# first check if we get the correct IP-Address or just the router's IP-Address
info = socket.getaddrinfo("www.google.com", None)[0]
ipAddr = info[4][0]
if ipAddr == "192.168.0.1" :
return False
except:
return False
conn = httplib.HTTPConnection("www.google.com", timeout=5)
try:
conn.request("HEAD", "/")
conn.close()
return True
except:
conn.close()
return False
이것은 Python3.6에서 작동합니다.
import urllib
from urllib.request import urlopen
def is_internet():
"""
Query internet using python
:return:
"""
try:
urlopen('https://www.google.com', timeout=1)
return True
except urllib.error.URLError as Error:
print(Error)
return False
if is_internet():
print("Internet is active")
else:
print("Internet disconnected")
Joel의 코드에 몇 가지를 추가했습니다.
import socket,time
mem1 = 0
while True:
try:
host = socket.gethostbyname("www.google.com") #Change to personal choice of site
s = socket.create_connection((host, 80), 2)
s.close()
mem2 = 1
if (mem2 == mem1):
pass #Add commands to be executed on every check
else:
mem1 = mem2
print ("Internet is working") #Will be executed on state change
except Exception as e:
mem2 = 0
if (mem2 == mem1):
pass
else:
mem1 = mem2
print ("Internet is down")
time.sleep(10) #timeInterval for checking
내 프로젝트 에는 Google 공개 DNS 서버 8.8.8.8을 핑하도록 수정 된 스크립트를 사용 합니다. 외부 종속성없이 1 초의 타임 아웃 및 핵심 파이썬 라이브러리 사용 :
import struct
import socket
import select
def send_one_ping(to='8.8.8.8'):
ping_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('icmp'))
checksum = 49410
header = struct.pack('!BBHHH', 8, 0, checksum, 0x123, 1)
data = b'BCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwx'
header = struct.pack(
'!BBHHH', 8, 0, checksum, 0x123, 1
)
packet = header + data
ping_socket.sendto(packet, (to, 1))
inputready, _, _ = select.select([ping_socket], [], [], 1.0)
if inputready == []:
raise Exception('No internet') ## or return False
_, address = ping_socket.recvfrom(2048)
print(address) ## or return True
send_one_ping()
선택 제한 시간 값은 1이지만, 본 예에서는 1 초 이상 더 쉽게 실패 선택 부동 소수점 숫자 일 수있다.