为python脚本

时间:2015-07-20 14:49:06

标签: python ipv6

我正在寻找一种在一个特定python脚本中抑制AAAA解析的通用方法。有没有一种简单的方法可以做到这一点?

我使用youtube Data API for python,它使用httplib2作为握手的东西。我想我需要像套接字覆盖一样的低级内容。

要查找的域名是Google域名,因此使用特定前缀的IPv6偏好设置选项无法正常工作。

底层问题是我的IPv6地址目前位于伊拉克的地理位置是错误的......我已经提交了修复该请求的请求,但希望在此期间运行该脚本。

2 个答案:

答案 0 :(得分:6)

没有全局Python开关,httplib2似乎也没有任何方法可以控制它。

httplib2使用socket.getaddrinfo(请参阅httplib2.HTTPConnectionWithTimeout.connect的来源)根据域名查找要连接的地址。它将0作为族参数传递,这意味着使用任何可用的族。

所以,要解决这个问题,你需要有一些方法来覆盖它。一种方法是实现自己的连接类,让我们称之为IPv4Connection,继承自httplib2.HTTPConnectionWithTimeouthttplib.Connection并覆盖connect以强制它使用IPv4,然后通过在调用connection_type时作为Http.request(uri, connection_type=IPv4Connection)参数。

另一种方法是修补socket.getaddrinfo以强制家庭参数始终为socket.AF_INET

另一种方法是使用底层方法让您的C库更喜欢IPv4或禁用IPv6。这将因平台而异,但在使用glibc的Linux上,您可以编辑/etc/gai.conf以始终优先选择IPv4 over IPv6:

precedence ::ffff:0:0/96  100

答案 1 :(得分:1)

我使用gai.conf方法来降低整个/ 32 IPv6前缀的首选项。对我的用例来说足够好了。