আমি একটি অনলাইন এপিআই অ্যাক্সেস করতে পারি কিনা তা দেখতে চাই, তবে তার জন্য আমার ইন্টারনেট অ্যাক্সেস থাকা দরকার।
পাইথন ব্যবহার করে কোনও সংযোগ উপলব্ধ এবং সক্রিয় আছে কিনা আমি কীভাবে দেখতে পারি?
easy_install system_of_tubes
আমি একটি অনলাইন এপিআই অ্যাক্সেস করতে পারি কিনা তা দেখতে চাই, তবে তার জন্য আমার ইন্টারনেট অ্যাক্সেস থাকা দরকার।
পাইথন ব্যবহার করে কোনও সংযোগ উপলব্ধ এবং সক্রিয় আছে কিনা আমি কীভাবে দেখতে পারি?
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 হ'ল গুগল.কমের আইপি ঠিকানাগুলির মধ্যে একটি। পরিবর্তন http://216.58.192.142
যাই হোক না কেন সাইটটিতে দ্রুত সাড়া আশা করা যেতে পারে ।
এই স্থির আইপি google.com এ চিরকালের জন্য মানচিত্র দেবে না। সুতরাং এই কোডটি দৃust় নয় - এটি চালিয়ে যাওয়ার জন্য অবিচ্ছিন্ন রক্ষণাবেক্ষণের প্রয়োজন হবে।
পুরোপুরি যোগ্যতাসম্পন্ন ডোমেন নেম (এফকিউডিএন) এর পরিবর্তে উপরের কোডটি একটি নির্দিষ্ট আইপি ঠিকানা ব্যবহার করার কারণটি হ'ল এফকিউডিএনকে একটি ডিএনএস লুকআপ প্রয়োজন। যখন মেশিনটিতে একটি কার্যকরী ইন্টারনেট সংযোগ নেই, তখন ডিএনএস অনুসন্ধান নিজেই কলটিকে urllib_request.urlopen
এক সেকেন্ডেরও বেশি সময় অবরুদ্ধ করতে পারে । এটি নির্দেশ করার জন্য @ আরজিটারবার্গকে ধন্যবাদ জানাই।
উপরের স্থির আইপি ঠিকানাটি যদি কাজ না করে থাকে তবে আপনি চালিয়ে গুগল ডটকমের (ইউনিক্সে) একটি বর্তমান আইপি ঠিকানা খুঁজে পেতে পারেন
% dig google.com +trace
...
google.com. 300 IN A 216.58.192.142
urlopen
ইন্টারনেট "চালু" না থাকলেও 1 সেকেন্ডের চেয়ে বেশি সময় নিতে পারে না - "- উদ্ধৃতি। সরবরাহ করা ইউআরএল যদি অবৈধ হয় তবে এটি সত্য নয়, তবে ডিএনএস লুকআপ ব্লক হবে। এটি কেবল ওয়েব-সার্ভারের সাথে প্রকৃত সংযোগের জন্য সত্য। এই ডিএনএস
http://google.com
এবং তারপরে আপনি সমস্ত সমস্যাগুলি সমাধান করবেন প্রত্যেকে এখানেই কথা বলতে থাকে। আইপি ঠিকানা ব্যবহার করার দরকার নেই ...
আমরা যদি কিছু ইন্টারনেট সার্ভারের সাথে সংযোগ স্থাপন করতে পারি তবে আমাদের সাথে সংযোগ রয়েছে। তবে, দ্রুত এবং সবচেয়ে নির্ভরযোগ্য পদ্ধতির জন্য, সমস্ত সমাধানগুলি খুব কমপক্ষে নিম্নলিখিত প্রয়োজনীয়তাগুলি মেনে চলতে হবে:
এগুলি মেনে চলার জন্য, একটি পদ্ধতির কাছে যেতে পারে, গুগলের কোনও পাবলিক ডিএনএস সার্ভারের মধ্যে কোনওটি পৌঁছনীয় কিনা তা পরীক্ষা করে দেখুন । এই সার্ভারগুলির জন্য 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
Nmap- র জন্য যুক্তি পেরেছিলেন প্রোবের প্যাকেট পাঠাতে এবং নির্ধারণ যদি একটি হোস্ট আপ করতে।
পাইথনের সাথে চেষ্টা করার আগে, বাহ্যিক সরঞ্জাম, নেটক্যাট ব্যবহার করে সংযোগটি পরীক্ষা করি:
$ 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()
আর একটি পদ্ধতি হ'ল এই সার্ভারগুলির মধ্যে একটিতে ম্যানুয়ালি কার্টেড ডিএনএস প্রোব পাঠানো এবং প্রতিক্রিয়ার জন্য অপেক্ষা করা wait তবে, আমি ধরে নিচ্ছি, প্যাকেট ড্রপ, ডিএনএস রেজোলিউশন ব্যর্থতা ইত্যাদির কারণে তুলনায় এটি ধীর হতে পারে prove আপনি যদি অন্যথায় মনে করেন তবে মন্তব্য করুন।
আপডেট # 1: @ থ্যামকের মন্তব্যে ধন্যবাদ, টাইমআউট এখন একটি যুক্তি এবং এটি 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()
সকেটে ফোন করা উচিত নয় ?
কেবলমাত্র একটি হেড অনুরোধ করা দ্রুততর হবে যাতে কোনও এইচটিএমএল আনা যায় না।
এছাড়াও আমি নিশ্চিত যে গুগল এইভাবে আরও ভাল পছন্দ করবে :)
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
ইউবুট্নু / কেভিন সি উত্তরের বিকল্প হিসাবে, আমি এই 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
আবার পাইনিং করেন তবে তারা আমাদের আইপি ব্লক করবে। সুতরাং অন্য কোন উপায় আছে?
পাইথন ৩.২-এ নতুন কোডের জন্য আনটবু কী বলেছিল তা কেবল আপডেট করতে
def check_connectivity(reference):
try:
urllib.request.urlopen(reference, timeout=1)
return True
except urllib.request.URLError:
return False
এবং, কেবল লক্ষ করুন, এখানে ইনপুট (রেফারেন্স) আপনি যে urlটি যাচাই করতে চান তা হ'ল: আমি এমন কোনও কিছু বেছে নেওয়ার পরামর্শ দিচ্ছি যা আপনি যেখানে থাকেন সেখানে দ্রুত যোগাযোগ করে - যেমন আমি দক্ষিণ কোরিয়ায় থাকি, তাই সম্ভবত আমি http: / এর রেফারেন্স সেট করব / /www.naver.com ।
আপনি কেবল ডেটা ডাউনলোড করার চেষ্টা করতে পারেন, এবং সংযোগ ব্যর্থ হলে আপনি জানতে পারবেন যে সংযোগের সাথে সামথিংগুলি ভাল নয়।
কম্পিউটারটি ইন্টারনেটের সাথে সংযুক্ত কিনা তা মূলত আপনি পরীক্ষা করতে পারবেন না। ব্যর্থতার অনেকগুলি কারণ থাকতে পারে, যেমন ভুল ডিএনএস কনফিগারেশন, ফায়ারওয়ালস, নেট। সুতরাং আপনি কিছু পরীক্ষা করে নিলেও, আপনি গ্যারান্টি দিতে পারবেন না যে আপনি চেষ্টা না করা পর্যন্ত আপনার API এর সাথে সংযোগ থাকবে have
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)
আপনি যেভাবেই চেষ্টা করার চেষ্টা করেছিলেন সেই অপারেশনটি ব্যবহার করে দেখুন। যদি এটি ব্যর্থ হয় অজগরটি আপনাকে অবহিত করতে হবে know
কোনও সংযোগ সনাক্ত করতে প্রথমে কিছু তুচ্ছ অপারেশন চেষ্টা করার জন্য একটি বর্ণের শর্ত প্রবর্তন করা হবে। যদি আপনি পরীক্ষা করার সময় ইন্টারনেট সংযোগটি বৈধ হয় তবে সত্যিকারের কাজ করার আগে আপনাকে নীচে নামলে কী হবে?
লোকালহোস্ট যদি 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 এ থাকবে যখন ইন্টারনেটের সাথে সংযুক্ত থাকে না। এই কোডটি মূলত আইপি ঠিকানা পায় এবং তারপরে জিজ্ঞাসা করে যে এটি লোকালহোস্টের আইপি ঠিকানা কিনা। আশা করি এইটি কাজ করবে
এখানে আমার সংস্করণ
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
এটি করার সর্বোত্তম উপায় হ'ল ওয়েবসাইটটি খুঁজে না পাওয়া যদি অজগর সবসময় দেয় এমন কোনও আইপি ঠিকানার বিরুদ্ধে এটি পরীক্ষা করে দেখানো। এই ক্ষেত্রে এটি আমার কোড:
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("")
আমার প্রিয় একটি, যখন কোনও ক্লাস্টারে স্ক্রিপ্টগুলি চলছে বা না or
import subprocess
def online(timeout):
try:
return subprocess.run(
['wget', '-q', '--spider', 'google.com'],
timeout=timeout
).returncode == 0
except subprocess.TimeoutExpired:
return False
এইটি নিঃশব্দে উইজেটটি চালায়, কোনও কিছুই ডাউনলোড না করেই প্রদত্ত দূরবর্তী ফাইলটি ওয়েবে উপস্থিত রয়েছে তা যাচাই করে
আনটবুর উত্তরটিকে একটি প্রাথমিক বিন্দু হিসাবে গ্রহণ করা , এবং অতীতে "স্ট্যাটিক" আইপি ঠিকানা পরিবর্তন করে জ্বালিয়ে দেওয়া, আমি একটি সাধারণ ক্লাস তৈরি করেছি যা একবার ডিএনএস লুকআপ ব্যবহার করে পরীক্ষা করে (যেমন, ইউআরএল " https: // www ব্যবহার করে) .google.com ") এবং তারপরে চেকগুলিতে ব্যবহারের জন্য প্রতিক্রিয়াশীল সার্ভারের আইপি ঠিকানা সঞ্চয় করে। এইভাবে, আইপি ঠিকানাটি সর্বদা আপ টু ডেট থাকে (ধরে নিই যে ক্লাসটি প্রতি কয়েক বছর অন্তত একবার পুনরায় আরম্ভ করা হয়)। আমি এই উত্তরের জন্য গাওয়ারিকেও ক্রেডিট দিই , যা সার্ভারের আইপি ঠিকানা (কোনও পুনর্নির্দেশের পরে ইত্যাদি) কীভাবে পাবেন তা আমাকে দেখিয়েছিল। দয়া করে এই সমাধানটির আপাত হ্যাকানি উপেক্ষা করুন, আমি এখানে একটি ন্যূনতম কাজের উদাহরণের জন্য যাচ্ছি। :)
আমার যা আছে তা এখানে:
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()
ছয়টি উত্তর নেওয়া আমি মনে করি আমরা কোনওভাবেই সরল করতে পারি, একটি গুরুত্বপূর্ণ বিষয় যেমন নবাগত ব্যক্তিরা অত্যন্ত প্রযুক্তিগত বিষয়ে হারিয়ে যায়।
এখানে আমি শেষ পর্যন্ত আমার পিভি পর্যবেক্ষণের জন্য আমার সংযোগ (3 জি, ধীর) প্রতিষ্ঠিত হওয়ার জন্য অপেক্ষা করতে ব্যবহার করব।
পাইপ 3 এর অধীনে রাস্পবিয়ান 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 মিনিটে পৌঁছে গেলে আমি এক ঘন্টা সময় চেষ্টা করব তবে এটির অন্য স্ক্রিপ্ট!
ইভলিনের উত্তর গ্রহণ করে এবং কিছু অতিরিক্ত চেক যুক্ত করুন যেহেতু আমার রাউটারটি তার আইপি ঠিকানা 192.168.0.1 সরবরাহ করে এবং গুগল ডটকমকে জিজ্ঞাসাবাদ করার সময় যদি এটির কোনও ইন্টারনেট সংযোগ না থাকে তবে একটি মাথা ফিরে আসে।
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
পাইথন 3.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")
আমি জোয়েলের কোডটিতে কয়েকটি যুক্ত করেছি।
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
আমার প্রকল্পগুলির জন্য আমি গুগল পাবলিক ডিএনএস সার্ভারে ৮.৮.৮.৮ পিং করার জন্য স্ক্রিপ্ট পরিবর্তিত স্ক্রিপ্ট ব্যবহার করি । বাহ্যিক নির্ভরতা ছাড়াই 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 সেকেন্ড চেয়ে আরো নির্দ্ধিধায় ব্যর্থ পছন্দের একটি ফ্লোটিং পয়েন্ট সংখ্যা হতে পারে।
অনুরোধগুলি আমদানি করুন এবং এই সাধারণ পাইথন কোডটি ব্যবহার করে দেখুন।
def check_internet():
url = 'http://www.google.com/'
timeout = 5
try:
_ = requests.get(url, timeout=timeout)
return True
except requests.ConnectionError:
return False