PYTHON:请求和响应401

3

我有一个关于认证的小问题。我正在编写一个脚本,该脚本从用户那里获取登录名和密码(键盘输入),然后我想从网站(http而不是https)获取一些数据,但每次运行脚本时都会收到401响应消息。我阅读了来自Stack的一些类似帖子,并尝试了以下解决方案:

解决方案1

c = HTTPConnection("somewebsite")
userAndPass = b64encode(b"username:password").decode("ascii")
headers = { 'Authorization' : 'Basic %s' %  userAndPass }
c.request('GET', '/', headers=headers)
res = c.getresponse()
data = res.read()

解决方案2

with requests.Session() as c:
    url = 'somewebsite'
    USERNAME = 'username'
    PASSWORD = 'password'
    c.get(url)
    login_data = dict(username = USERNAME, password = PASSWORD)
    c.post(url,data = login_data)
    page = c.get('somewebsite', headers = {"Referer": "somwebsite"})
    print(page)

方案三

www = 'somewebsite'
value ={'filter':'somefilter'}
data = urllib.parse.urlencode(value)
data=data.encode('utf-8')
req = urllib.request.Request(www,data)
resp = urllib.request.urlopen(req)
respData = resp.read()
print(respData)
x = urllib.request.urlopen(www,"username","password")
print(x.read())'

我不知道如何解决这个问题。有人可以给我一些链接或提示吗?

可能是因为它正在读取错误代码401,这意味着HTTP 401未经授权的客户端错误状态响应代码,所以您可能未经授权登录,导致用户名或密码不正确。 - hypadr1v3
当我通过浏览器打开网站并输入我的密码和登录时,一切正常,但是当我从cmd运行它时,我会得到401错误。 - MB_YD
跟踪浏览器开发者工具中的请求,以了解它正在做什么。如果没有任何基本身份验证示例起作用,那么问题肯定出在其他地方。 - Alex Taylor
@MB_YD 你好,你解决了这个问题吗?我也遇到了同样的情况。 - srikanth
3个回答

3

你尝试过使用requests库的基本身份验证示例吗?

>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>

是的,但是401 :( - MB_YD

2

我能知道网站上使用的是哪种身份验证方式吗?

这是一个官方的基本认证示例 (http://docs.python-requests.org/en/master/user/advanced/#http-verbs)

from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth('fake@example.com', 'not_a_real_password')

r = requests.post(url=url, data=body, auth=auth)
print(r.status_code)

我已经检查过了,它是:NTLM。 - MB_YD
你会使用Chrome开发者工具吗?它可以让你追踪请求头。这个链接可能会有所帮助:https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#headers - EunChong Lee

1
要使用带有身份验证的API,我们需要具有提供请求访问权限的token_id或app_id。以下是一个示例,说明我们如何构建URL并获取响应:强调文本
import requests
city = input()
api_call = "http://api.openweathermap.org/data/2.5/weather?"
app_id = "892d5406f4811786e2b80a823c78f466"
req_url = api_call + "q=" + city + "&appid=" + app_id
response = requests.get(req_url)
data = response.json()
if (data["cod"] == 200):
    hum = data["main"]["humidity"]
    print("Humidity is % d " %(hum))
elif data["cod"] != 200:
    print("Error occurred : " ,data["cod"], data["message"])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接