मैं https://stackoverflow.com/a/33046939/5059062 लिए एक समान दृष्टिकोण लिया, लेकिन इसके बजाय socket
में बात यह है कि DNS अनुरोध करता है बाहर समझौता तो यह केवल करता है आईपीवी 6 या IPv4, हर अनुरोध, इस में इस्तेमाल किया जा सकता है जिसका मतलब है के लिए urllib
requests
में प्रभावी रूप से प्रभावी रूप से।
यदि आपका प्रोग्राम यूनिक्स पाइप और अन्य ऐसी चीजों का भी उपयोग करता है तो यह बुरा हो सकता है, इसलिए मैं बंदरगाह के साथ सावधानी बरतता हूं।
import requests
import socket
from unittest.mock import patch
import re
orig_getaddrinfo = socket.getaddrinfo
def getaddrinfoIPv6(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET6, type=type, proto=proto, flags=flags)
def getaddrinfoIPv4(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET, type=type, proto=proto, flags=flags)
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv6):
r = requests.get('http://ip6.me')
print('ipv6: '+re.search(r'\+3>(.*?)</',r.content.decode('utf-8')).group(1))
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv4):
r = requests.get('http://ip6.me')
print('ipv4: '+re.search(r'\+3>(.*?)</',r.content.decode('utf-8')).group(1))
और requests
बिना:
import urllib.request
import socket
from unittest.mock import patch
import re
orig_getaddrinfo = socket.getaddrinfo
def getaddrinfoIPv6(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET6, type=type, proto=proto, flags=flags)
def getaddrinfoIPv4(host, port, family=0, type=0, proto=0, flags=0):
return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET, type=type, proto=proto, flags=flags)
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv6):
r = urllib.request.urlopen('http://ip6.me')
print('ipv6: '+re.search(r'\+3>(.*?)</',r.read().decode('utf-8')).group(1))
with patch('socket.getaddrinfo', side_effect=getaddrinfoIPv4):
r = urllib.request.urlopen('http://ip6.me')
print('ipv4: '+re.search(r'\+3>(.*?)</',r.read().decode('utf-8')).group(1))
3.5.2
क्षमा करें, मुझे अभी भी एक आईपीवी 4 उत्तर मिलता है। मैंने 'प्रिंट (request.get ('https://icanhazip.com') .text) की कोशिश की। – ominug
दुर्भाग्यवश, मेरे पास इस समय आईपीवी 6 के साथ कुछ भी नहीं है; मैंने यह सुनिश्चित करने के लिए एक प्रिंट स्टेटमेंट और एक कनेक्ट स्टेटमेंट जोड़ा है कि मुझे HTTPConnection ऑब्जेक्ट – Foon
पर बंदरगाह करने के बारे में कुछ याद नहीं आया ठीक है, मैंने इसे फिर से कोशिश की। कनेक्ट विधि को नहीं कहा जाता है। – ominug