<p>我终于解决了我的问题。不是用最优雅的方式,但对我有用。在</p>
<p>阅读后:</p>
<p><a href="https://stackoverflow.com/questions/33046733/force-requests-to-use-ipv4-ipv6">Force requests to use IPv4 / IPv6</a>
和
<a href="https://stackoverflow.com/questions/18007174/python-urllib2-force-ipv4">Python urllib2 force IPv4</a></p>
<p>我决定做一个DNS查找,只发送一个带有FQDN的主机头来获取内容。(VHOST需要主机头)</p>
<p>下面是一段丑陋的片段:</p>
<pre><code># Ugly hack to get either IPv4 or IPv6 response from server
parsed_uri = urlparse(server)
fqdn = "{uri.netloc}".format(uri=parsed_uri)
scheme = "{uri.scheme}".format(uri=parsed_uri)
path = "{uri.path}".format(uri=parsed_uri)
try:
ipVersion = ip_kind(fqdn[1:-1])
ip = fqdn
except ValueError:
addrs = socket.getaddrinfo(fqdn, 80)
if haveIPv6:
ipv6_addrs = [addr[4][0] for addr in addrs if addr[0] == socket.AF_INET6]
ip = "[" + ipv6_addrs[0] + "]"
else:
ipv4_addrs = [addr[4][0] for addr in addrs if addr[0] == socket.AF_INET]
ip = ipv4_addrs[0]
server = "{}://{}{}".format(scheme, ip, path)
url = urllib.Request(server, None, {'User-agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5'})
# Next line adds the host header
url.host = fqdn
content = urllib.urlopen(url).read()
</code></pre>
<p>这远不是理想的,它可以更干净,但它对我有效。在</p>
<p>它在这里实现:<a href="https://github.com/SteveClement/ipgetter/tree/IPv6" rel="nofollow noreferrer">https://github.com/SteveClement/ipgetter/tree/IPv6</a>
这只需浏览一个服务器列表,这些服务器会返回您的边界网关ip,现在也在IPv6中。在</p>