gpt4 book ai didi

python - 如何以类似于 curl 的 --resolve 标志的方式在 python 的请求库中指定 URL 解析?

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:15 26 4
gpt4 key购买 nike

我正在编写一些 python 客户端代码,由于某些环境限制,我想指定一个 URL 并控制它的解析方式。我可以通过使用 --resolve 标志在 curl 中完成此操作。有没有办法用 Python 的请求库做一些类似的事情?

理想情况下,这会在 Python 2.7 中工作,但我也可以使 3.x 解决方案工作。

最佳答案

在做了一些挖掘之后,我(不出所料)发现 Requests 通过要求 Python 来解析主机名(这是要求您的操作系统来完成)。首先,我找到了一些示例代码来劫持 DNS 解析 (Tell urllib2 to use custom DNS),然后我在 socket documentation 中找出了有关 Python 如何解析主机名的更多细节。 .然后就是将所有东西连接在一起的问题:

import socket
import requests

def is_ipv4(s):
# Feel free to improve this: https://stackoverflow.com/questions/11827961/checking-for-ip-addresses
return ':' not in s

dns_cache = {}

def add_custom_dns(domain, port, ip):
key = (domain, port)
# Strange parameters explained at:
# https://docs.python.org/2/library/socket.html#socket.getaddrinfo
# Values were taken from the output of `socket.getaddrinfo(...)`
if is_ipv4(ip):
value = (socket.AddressFamily.AF_INET, 0, 0, '', (ip, port))
else: # ipv6
value = (socket.AddressFamily.AF_INET6, 0, 0, '', (ip, port, 0, 0))
dns_cache[key] = [value]

# Inspired by: https://stackoverflow.com/a/15065711/868533
prv_getaddrinfo = socket.getaddrinfo
def new_getaddrinfo(*args):
# Uncomment to see what calls to `getaddrinfo` look like.
# print(args)
try:
return dns_cache[args[:2]] # hostname and port
except KeyError:
return prv_getaddrinfo(*args)

socket.getaddrinfo = new_getaddrinfo

# Redirect example.com to the IP of test.domain.com (completely unrelated).
add_custom_dns('example.com', 80, '66.96.162.92')
res = requests.get('http://example.com')
print(res.text) # Prints out the HTML of test.domain.com.

我在写这篇文章时遇到的一些警告:

  • 这对 https 效果不佳。代码工作正常(只需使用 https://443 而不是 http://80) .但是,SSL 证书与域名相关联,Requests 将尝试验证证书上的名称是否为您尝试连接的原始域。
  • getaddrinfo 返回略有不同的 IPv4 和 IPv6 地址信息。我对 is_ipv4 的实现感觉很老套,如果您在实际应用程序中使用它,我强烈建议您使用更好的版本。
  • 代码已经在 Python 3 上进行了测试,但我看不出有什么理由不能在 Python 2 上按原样运行。

关于python - 如何以类似于 curl 的 --resolve 标志的方式在 python 的请求库中指定 URL 解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44374215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com