Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过请求访问一个网站(Python库),但在PostMan(Chrome应用程序)下工作_Python_Python 3.x_Python Requests - Fatal编程技术网

无法通过请求访问一个网站(Python库),但在PostMan(Chrome应用程序)下工作

无法通过请求访问一个网站(Python库),但在PostMan(Chrome应用程序)下工作,python,python-3.x,python-requests,Python,Python 3.x,Python Requests,我试图通过Python请求访问一个由IIS托管的网站,该网站启用了基本身份验证,并禁用了其他身份验证方法 以下是我的密码: 以下是输出: 如果我将URL更改为、或其他,它将工作并返回http状态代码=200 另外,我在Postmanchorome应用程序中模拟了一个Post/Get,使用相同的身份验证相同的URL,它仍然有效 但如果运行邮递员生成的代码,它将失败,并出现相同的错误 我怀疑错误是因为脚本是在CUI而不是GUI下运行的,GUI将在OS的代理环境下运行,而CUI可能不会。但为什么仍然成

我试图通过Python请求访问一个由IIS托管的网站,该网站启用了基本身份验证,并禁用了其他身份验证方法

以下是我的密码:

以下是输出:

如果我将URL更改为、或其他,它将工作并返回http状态代码=200

另外,我在Postmanchorome应用程序中模拟了一个Post/Get,使用相同的身份验证相同的URL,它仍然有效

但如果运行邮递员生成的代码,它将失败,并出现相同的错误

我怀疑错误是因为脚本是在CUI而不是GUI下运行的,GUI将在OS的代理环境下运行,而CUI可能不会。但为什么仍然成功访问google.com?如果代理服务器的身份验证失败,它应该拒绝所有请求,包括“谷歌和其他网站”

已经尝试过许多解决方案,比如添加代理,但没有基本身份验证,但运气不好

如果有人能提供任何提示,非常感谢


谢谢。

我终于找到了根本原因

Httplib2未捕获并应用OS代理设置

请求不会自动捕获并应用OS代理设置

这就是HTTP请求被拒绝的原因。在使用Python请求时,NTLM Auth在代理中失败

因此,解决方案很简单,忽略Python请求库代码中的OS代理

另一种方法是实现代理NTLM Auth,但它会很复杂,至少我没有在互联网上找到任何相关代码

以下代码适用于:

import httplib2

h = httplib2.Http(".cache")

h.add_credentials('xxx', 'xxxx') # Basic authentication

resp, content = h.request("http://test:180/test.aspx", "GET", body="")
print (content)
下面的代码是由PostMan生成的,如果忽略默认操作系统代理,则可以使用两种解决方案:禁用gobal代理设置或使用空代理

import requests
url = "http://test:180/test.aspx"
session = requests.Session()
session.trust_env = False #disable OS proxy
headers = {
    'authorization': "Basic d3NndWVzdDpzbWMxxjMhQA==",
    'cache-control': "no-cache",
    'postman-token': "157e52fa-95f5-5287-9ee0-xxxxxxxx"
}

response = session.get(url, headers=headers)
print(response.text)

#use empty proxy instead
proxies = {
  "http": None,
  "https": None,
}
response = requests.get(url, auth=HTTPBasicAuth('test', 'test'), proxies=proxies)
print (response)

使用wireshark检查两个帧之间的差异。很明显,Postman/httplib2和使用auth=HTTPBasicAuth'wsguest',xxxx'参数生成的请求之间的授权标头是不同的。尝试将授权标头添加到requests headers参数,并删除授权。如果这样做有效,我会将auth参数创建的授权头与您硬编码的授权头进行比较。@William我确实尝试过这种方法,但没有成功。标头中似乎有什么特殊的东西导致请求被Squid代理阻止。“我会把它挖出来,在手头的紧急项目完成后,我必须使用wireshark或fiddler来比较http数据包。”eyllanesc更新了答案。我用wireshark找出了不同之处。Python请求生成的HTTP请求被重新定向到ip.dst=[proxy server],但Httplib2没有。谢谢你的建议。因为我的IIS网站位于内部网络中。因此,代理不应重定向请求。
import httplib2

h = httplib2.Http(".cache")

h.add_credentials('xxx', 'xxxx') # Basic authentication

resp, content = h.request("http://test:180/test.aspx", "GET", body="")
print (content)
import requests
url = "http://test:180/test.aspx"
session = requests.Session()
session.trust_env = False #disable OS proxy
headers = {
    'authorization': "Basic d3NndWVzdDpzbWMxxjMhQA==",
    'cache-control': "no-cache",
    'postman-token': "157e52fa-95f5-5287-9ee0-xxxxxxxx"
}

response = session.get(url, headers=headers)
print(response.text)

#use empty proxy instead
proxies = {
  "http": None,
  "https": None,
}
response = requests.get(url, auth=HTTPBasicAuth('test', 'test'), proxies=proxies)
print (response)