नेटवर्क कनेक्शन की जाँच करना


133

मैं यह देखना चाहता हूं कि क्या मैं एक ऑनलाइन एपीआई का उपयोग कर सकता हूं, लेकिन इसके लिए मुझे इंटरनेट का उपयोग करने की आवश्यकता है।

यदि पायथन का उपयोग करके कोई कनेक्शन उपलब्ध और सक्रिय है तो मैं कैसे देख सकता हूं?


यदि आप अजगर में हैं, तो यह निश्चित रूप से एक कनेक्शन विफलता या समय समाप्त होने की स्थिति में एक अपवाद फेंक देगा। आप या तो कोशिश कर सकते हैं / उस के आसपास पकड़ सकते हैं, या बस इसे सतह दे सकते हैं।
jdizzle

1
@ ट्रिटिक: मुझे उम्मीद है कि यह एक मजाक था, क्योंकि यह काम नहीं करता है
इंस्पेक्टरगेटगेट

1
@ इंस्पेक्टरगैजेट:easy_install system_of_tubes
एस.लॉट

2
@aF: Unutbu के समाधान को देखें। यह दिखाता है (सबसे तेजी से संभव तरीके से) अगर आप google.com का उपयोग करने में सक्षम हैं तो कैसे जांचें। यदि आपकी समस्या एपीआई तक पहुँचने की चिंता करती है, तो टाइमआउट = 1 की स्थापना करते हुए इसे एक्सेस करने की कोशिश क्यों नहीं की जाती है? यह आपको ठीक से बताएगा कि जिस एपीआई को आप एक्सेस करना चाहते हैं वह सुलभ है। एक बार जब आप यह जान लेते हैं, तो आप आगे बढ़ सकते हैं और एपीआई का उपयोग कर सकते हैं या उस समय की प्रतीक्षा कर सकते हैं जब आप इसे एक्सेस करने में सक्षम हों।
इंस्पेक्टरगैजेट

जैसा मैंने कहा, मुझे बस एक साधारण चीज़ की ज़रूरत थी जैसे कि अनटुबू ने कहा। आप इस के साथ इस तरह के उपद्रव करने की जरूरत नहीं है ..
एएफ।

जवाबों:


132

शायद आप इस तरह से कुछ का उपयोग कर सकते हैं:

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एक सेकंड से अधिक के लिए रोक सकता है । इसे इंगित करने के लिए @rzetterberg को धन्यवाद।


यदि ऊपर दिया गया निश्चित IP पता काम नहीं कर रहा है, तो आप google.com (unix पर) को चलाकर वर्तमान IP पता पा सकते हैं

% dig google.com  +trace 
...
google.com.     300 IN  A   216.58.192.142

1
बस "पर कॉल करने के लिए एक नोट urlopen1 सेकंड से अधिक नहीं ले जाएगा, भले ही इंटरनेट" पर "है" - बोली। यह सच नहीं है यदि आपूर्ति की गई url अमान्य है, तो DNS लुकअप ब्लॉक हो जाएगा। यह वेब-सर्वर के वास्तविक कनेक्शन के लिए ही सही है। इस डीएनएस लुकअप ब्लॉक से बचने का सबसे सरल तरीका इसके बजाय आईपी-
एड्रेस

8
यह कोई लंबा काम नहीं करता है। सितंबर 2013 तक, लंबे समय के बाद 74.125.113.99 बार, इसलिए यह फ़ंक्शन हमेशा गलत वापस आएगा। मुझे लगता है कि Google ने अपना नेटवर्क बदल दिया है।
theamk

4
अब बाकी सरल है। Google "74.125.113.99 urllib" के लिए। यह हजारों ओपन-सोर्स प्रोजेक्ट लौटाएगा जिसमें गलत कोड शामिल था। (मेरे लिए, सिर्फ पहले पृष्ठ में कम से कम 5 हैं: nvpy, suekychebot, BhatDict, upy, checkConnection)। वे सभी अब टूट चुके हैं।
theamk

4
यदि यह स्पष्ट नहीं है, तो मैं इस विधि का उपयोग नहीं करता। पुराना आईपी 3 साल से कम समय के लिए अच्छा था। नया आईपी आज काम करता है। इसे अपनी परियोजना में रखें, और यह 3 साल से कम समय में रहस्यमय तरीके से टूट सकता है।
सीमेक

1
एर ... बस खुला है http://google.comऔर फिर आप उन सभी समस्याओं को हल करते हैं जो हर कोई यहां बात कर रहा है। कोई IP पते का उपयोग करने की आवश्यकता नहीं है ...
जेसन सी

106

यदि हम कुछ इंटरनेट सर्वर से जुड़ सकते हैं, तो हमारे पास वास्तव में कनेक्टिविटी है। हालांकि, सबसे तेज़ और सबसे विश्वसनीय दृष्टिकोण के लिए, सभी समाधानों को निम्न आवश्यकताओं का पालन करना चाहिए, बहुत कम से कम:

  • DNS रिज़ॉल्यूशन से बचें (हमें एक आईपी की आवश्यकता होगी जो कि सबसे अच्छी तरह से जाना जाता है और अधिकांश समय उपलब्ध होने की गारंटी है)
  • एप्लिकेशन लेयर कनेक्शन (HTTP / FTP / IMAP सेवा से कनेक्ट करना) से बचें
  • पाइथन या पसंद की अन्य भाषा की बाहरी उपयोगिताओं के कॉल से बचें (हमें भाषा-अज्ञेय समाधान के साथ आने की आवश्यकता है जो तीसरे पक्ष के समाधानों पर भरोसा नहीं करता है)

इनका अनुपालन करने के लिए, एक तरीका यह हो सकता है कि जाँच करें कि क्या Google का सार्वजनिक DNS सर्वर उपलब्ध नहीं है। इन सर्वर के लिए IPv4 पतों हैं 8.8.8.8और 8.8.4.4। हम उनमें से किसी से जुड़ने का प्रयास कर सकते हैं।

मेजबान के एक त्वरित नैंप 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खुला और बिना फ़िल्टर किया हुआ है। यदि आप एक गैर-रूट उपयोगकर्ता हैं, तो तैयार किए गए जांच पैकेट भेजने और यह निर्धारित करने के लिए कि एनएपी के लिए तर्क sudoया उपयोग करने के लिए याद रखें -Pn

इससे पहले कि हम पायथन के साथ प्रयास करें, आइए एक बाहरी उपकरण, नेटकैट का उपयोग करके कनेक्टिविटी का परीक्षण करें:

$ nc 8.8.8.8 53 -zv
Connection to 8.8.8.8 53 port [tcp/domain] succeeded!

नेटकैट पुष्टि करता है कि हम 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

6
यह सबसे अच्छा उत्तर है, DNS रिज़ॉल्यूशन से बचना और विडंबना यह है कि, Google की DNS सेवा को पोर्ट 53 पर परामर्श दें।
m3nda

1
@AviMehenwal Google DNS नाम रिज़ॉल्यूशन सेवा का उपयोग करने के लिए इस आईपी को अपने मुफ्त के हिस्से के रूप में प्रदान करता है। जब तक Google अन्यथा निर्णय नहीं लेता तब तक IP को बदलना नहीं है। मैं इसे बिना किसी समस्या के अब कुछ वर्षों के लिए एक वैकल्पिक DNS सर्वर के रूप में उपयोग कर रहा हूं।
7h3rAm

1
@ ल्यूक कि बाहर इशारा करने के लिए धन्यवाद। मैंने उपयोगकर्ताओं को अपवाद के बारे में सूचित करने और डिफ़ॉल्ट उत्तर के रूप में गलत वापस करने के लिए उत्तर अपडेट किया है।
7h3rAm

2
@JasonC टीसीपी / 53 से कनेक्ट करना पोर्ट 53 से अधिक DNS कनेक्शन से भिन्न है। आपके सादृश्य द्वारा जाने पर, अनुप्रयोग द्वारा उपयोग किए जाने वाले प्रत्येक टीसीपी पोर्ट को एप्लिकेशन स्तर प्रोटोकॉल कनेक्शन के रूप में वर्गीकृत किया जाएगा। नहीं, ये सच नहीं है। एक टीसीपी सॉकेट को पोर्ट से कनेक्ट करना एप्लीकेशन स्तर कनेक्शन नहीं है। मैं एक डीएनएस लुकअप नहीं कर रहा हूं, बल्कि सिर्फ एक आधा-टीसीपी हैंडशेक कर रहा हूं। यह पूर्ण DNS लुकअप करने के समान नहीं है।
7h3rAm

2
क्या हमें close()सॉकेट पर कॉल नहीं करना चाहिए ?
br

60

यह केवल एक HEAD अनुरोध करने के लिए तेज़ होगा ताकि कोई HTML प्राप्त न हो।
इसके अलावा, मुझे यकीन है कि गूगल इस तरह से बेहतर होगा :)

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

8
केवल 20 मिली सेकंड लेता है जबकि शीर्ष उत्तर में 1 सेकंड लगता है।
वैली

8
+1 यह पूरे पृष्ठ को डाउनलोड करने का कोई मतलब नहीं है यदि आप केवल यह जांचना चाहते हैं कि क्या सर्वर उपलब्ध है और जवाब दे रहा है। यदि आपको सामग्री की आवश्यकता है तो सामग्री डाउनलोड करें
Thatsch

बिना किसी कारण के, url '8.8' का उपयोग करना अभी भी काम करता है, जो स्पष्ट रूप से, '8.8' या ' 8.8 ' वास्तविक वेब ब्राउज़र में काम नहीं करता है।
पोलव

2 घंटे एक काम के समाधान की तलाश में और फिर मुझे यह मिला ... साफ और सरल
पेड्रो सेरपा

21

उबटनू / केविन सी के जवाब के विकल्प के रूप में, मैं 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

1
अनुरोध एक महान पुस्तकालय है। हालाँकि कई उदाहरणों के विपरीत यहाँ मैं IANA के example.com या example.org का उपयोग अधिक विश्वसनीय दीर्घकालिक विकल्प के रूप में करूँगा क्योंकि यह पूरी तरह से ICANN द्वारा नियंत्रित है ।
चिराले

क्या इंटरनेट चलाने की स्थिति की जांच करने का कोई अन्य तरीका है। क्योंकि यदि आप google.comफिर से दोबारा पिंग करते हैं, तो वे हमारे आईपी को ब्लॉक कर देंगे। तो क्या कोई और तरीका है।?
संजीव

15

बस यह अपडेट करने के लिए कि पायथन 3.2 में नए कोड के लिए क्या कहा जाता है

def check_connectivity(reference):
    try:
        urllib.request.urlopen(reference, timeout=1)
        return True
    except urllib.request.URLError:
        return False

और, बस ध्यान दें, यहां इनपुट (संदर्भ) वह url है जिसे आप जांचना चाहते हैं: मैं सुझाव देता हूं कि कुछ ऐसा चुनें जो तेजी से जोड़ता है जहां आप रहते हैं - यानी मैं दक्षिण कोरिया में रहता हूं, इसलिए मैं शायद http: / /www.naver.com


अगर डीएनएस सर्वर उपलब्ध नहीं है तो मैं 30 सेकंड इंतजार करूंगा।
विक्टर जोरास

10

आप बस डेटा डाउनलोड करने का प्रयास कर सकते हैं, और यदि कनेक्शन विफल हो जाता है तो आपको पता चल जाएगा कि कनेक्शन वाला somethings ठीक नहीं है।

मूल रूप से आप यह नहीं देख सकते हैं कि कंप्यूटर इंटरनेट से जुड़ा है या नहीं। विफलता के कई कारण हो सकते हैं, जैसे गलत DNS कॉन्फ़िगरेशन, फ़ायरवॉल, NAT। इसलिए यदि आप कुछ परीक्षण करते हैं, तो भी आप इस बात की गारंटी नहीं दे सकते हैं कि जब तक आप कोशिश नहीं करेंगे, तब तक आपका एपीआई के साथ संबंध रहेगा।


2
"यह अनुमति की तुलना में माफी के लिए पूछना आसान है"
कोबाल

यह अच्छा होने की जरूरत नहीं है। मुझे बस किसी साइट से जुड़ने या कुछ पिंग करने की कोशिश करने की आवश्यकता है और अगर यह टाइमआउट वॉयला देता है। मैं उसे कैसे कर सकता हूँ?
एएफ।

क्या कोई कारण है जिसे आप बस एपीआई से कनेक्ट करने का प्रयास नहीं कर सकते हैं? असली कनेक्शन से पहले आपको इसकी जांच क्यों करनी चाहिए?
टॉमस वायसॉकी

मैं अजगर का उपयोग करके एक html पृष्ठ बनाता हूं। Html पृष्ठ उन दलीलों को खारिज करता है जो मैं अजगर कार्यक्रम में देता हूं। मुझे केवल कुछ html कोड डालने की आवश्यकता है यदि मैं एपीआई तक पहुंच सकता हूं। इसलिए मुझे पहले पता होना चाहिए।
एएफ।

6
import urllib

def connected(host='http://google.com'):
    try:
        urllib.urlopen(host)
        return True
    except:
        return False

# test
print( 'connected' if connected() else 'no internet!' )

अजगर 3 के लिए, का उपयोग करें urllib.request.urlopen(host)


4

आप जिस भी ऑपरेशन को करने की कोशिश कर रहे थे, वह कोशिश करें। यदि यह विफल रहता है तो अजगर को आपको यह बताने के लिए एक अपवाद फेंक देना चाहिए।

एक कनेक्शन का पता लगाने के लिए पहले कुछ तुच्छ ऑपरेशन की कोशिश करने के लिए दौड़ की स्थिति का परिचय दिया जाएगा। यदि आप परीक्षण करते समय इंटरनेट कनेक्शन वैध होते हैं, लेकिन वास्तविक काम करने की आवश्यकता होने से पहले क्या होता है?


3

यदि लोकलहोस्ट को 127.0.0.1 ट्राई से बदला गया है तो यह काम नहीं कर सकता

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 )

जब तक संपादित नहीं किया जाता, तब तक आपके कंप्यूटर का आईपी 127.0.0.1 होगा जब इंटरनेट से जुड़ा नहीं होगा। यह कोड मूल रूप से आईपी एड्रेस प्राप्त करता है और फिर पूछता है कि क्या यह लोकलहोस्ट आईपी एड्रेस है। उम्मीद है की वो मदद करदे


यह एक दिलचस्प जांच है, हालांकि यह केवल तभी पहचाना जाएगा जब आप किसी नेटवर्क से जुड़े हों। चाहे वह इंटरनेट हो या नैटडाउन सबनेट अभी भी एक सवाल बना रहेगा।
7h3rAm

@ 7h3rAm, यह एक अच्छा बिंदु है, DCHP को इंटरनेट कनेक्शन, मेरी गलती की आवश्यकता नहीं है।

इसके लिए केवल एक नेटवर्क एनआईसी कनेक्ट की आवश्यकता होती है जिसे प्राप्त किया गया है जिसे एक आईपी सौंपा गया है। अन्य सभी उत्तरों के विपरीत, इसमें LAN, राउटर, फ़ायरवॉल, ISP सभी तरह के सिस्टम के लिए कनेक्शन की आवश्यकता नहीं होती है। यह अभी भी यह दिखाने में विफल है कि एनआईसी जुड़ा हुआ है अगर यह एक गैर डीएचसीपी सौंपा पता (स्थिर) है
user150471

@ user150471, पहले से ही बताया, आपके योगदान के लिए धन्यवाद।

3

यहाँ मेरा संस्करण है

import requests

try:
    if requests.get('https://google.com').ok:
        print("You're Online")
except:
    print("You're Offline")

1
मुझे यह पसंद है, लेकिन यह बेहतर होगा यदि यह एक विशिष्ट टाइमआउट या कनेक्शन त्रुटि को छोड़कर जो अनुरोधों से उठाया गया है। जैसा कि, एक बिजली-त्वरित Ctrl-C ऑफ़लाइन प्रिंट करेगा।
user2561747

2

के साथ एक आधुनिक पोर्टेबल समाधान 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

1

ऐसा करने का सबसे अच्छा तरीका यह है कि आप आईपी पते के खिलाफ जांच करें जो अजगर हमेशा देता है यदि वह वेबसाइट नहीं ढूंढ सकता है। इस मामले में यह मेरा कोड है:

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("")

1

मेरे पसंदीदा एक, जब एक क्लस्टर पर स्क्रिप्ट चल रही है या नहीं

import subprocess

def online(timeout):
    try:
        return subprocess.run(
            ['wget', '-q', '--spider', 'google.com'],
            timeout=timeout
        ).returncode == 0
    except subprocess.TimeoutExpired:
        return False

यह चुपचाप चलता है, कुछ भी डाउनलोड नहीं करता है, लेकिन यह जांचता है कि दी गई दूरस्थ फ़ाइल वेब पर मौजूद है


0

एक प्रारंभिक बिंदु के रूप में unutbu के उत्तर को लेते हुए , और एक "स्थिर" आईपी पते को बदलते हुए अतीत में जला दिया गया है, मैंने एक साधारण वर्ग बनाया है जो DNS लुकअप का उपयोग करके एक बार जांच करता है (यानी, URL का उपयोग करके " https: // www .google.com "), और फिर बाद के चेक पर उपयोग के लिए प्रतिक्रिया देने वाले सर्वर का आईपी पता संग्रहीत करता है। इस तरह, आईपी पता हमेशा अद्यतित रहता है (यह मानते हुए कि कक्षा हर कुछ वर्षों में कम से कम एक बार पुनः आरंभ की जाती है)। मैं इस जवाब के लिए 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()

0

छह का उत्तर लेते हुए मुझे लगता है कि हम किसी भी तरह से सरल बना सकते हैं, एक महत्वपूर्ण मुद्दा क्योंकि नए लोग अत्यधिक तकनीकी मामलों में खो जाते हैं।

यहां मैं आखिरकार अपने पीवी निगरानी के लिए दिन में एक बार अपने कनेक्शन (3 जी, धीमा) की प्रतीक्षा करने के लिए क्या उपयोग करूंगा।

रासबियन 3.4.2 के साथ पायथ 3 के तहत काम करता है

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 मिनट अगर मैं पहुंच गया तो मैं एक घंटे के समय में कोशिश करूंगा लेकिन इसकी एक और स्क्रिप्ट!


आपके निबंध संस्करण का उपयोग नहीं होता है, यह करता है?
किडकोडर

0

इवलिन का जवाब लेना और कुछ अतिरिक्त जांच जोड़ना क्योंकि मेरा राउटर अपना आईपी पता 192.168.0.1 देता है और अगर google.com को क्वेरी करते समय इसका कोई इंटरनेट कनेक्शन नहीं है तो एक सिर लौटाता है।

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

0

यह मेरे लिए 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")

0

मैंने जोएल के कोड में कुछ जोड़ा।

    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

0

मेरी परियोजनाओं के लिए मैं 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 सेकंड तुलना में अधिक आसानी विफल पसंद का एक चल बिन्दु संख्या हो सकती है।


0

आयात अनुरोध और इस सरल अजगर कोड का प्रयास करें।

def check_internet():
url = 'http://www.google.com/'
timeout = 5
try:
    _ = requests.get(url, timeout=timeout)
    return True
except requests.ConnectionError:
return False
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.