gpt4 book ai didi

python - 如何删除对 "HTTP For Humans"请求库的依赖并改用 urllib?

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:19 25 4
gpt4 key购买 nike

为此我需要使用 urllib,而不是 urllib2、urllib3 或 Requests。

curl 等效...

curl -H "Content-Type: application/json" -X POST -d '{"title":"My New Title","content":"blahblah","excerpt":"blah"}' http://localhost/wp-json/wp/v2/posts --user 'user:xxx'

...下面的代码工作正常:

r = requests.post(url + '/wp-json/wp/v2/posts', 
auth=HTTPBasicAuth(username, password),
data=json.dumps(params),
headers={'content-type': 'application/json'})

if(not(r.ok)):
raise Exception('failed with rc=' + r.status_code)

return json.loads(r.text)

但这失败了:

params = {
'title': 'The Title',
'content': content,
'exerpt': 'blah'
}
postparam = json.dumps(params).encode('utf-8')

password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, url, username, password)
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
opener = urllib.request.build_opener(handler)

req = urllib.request.Request(url + '/wp-json/wp/v2/posts', method='POST', data=postparam)
req.add_header('Content-Type', 'application/json')

r = opener.open(req)

if(r.getcode() != 200):
raise Exception('failed with rc=' + r.getcode())

回溯:

Traceback (most recent call last):
File "test_wp_api.py", line 10, in <module>
rs = create(endpoint, "test")
File "C:\...\wordpress.py", line 28, in create
r = opener.open(req)
File "c:\usr\Python37-32\lib\urllib\request.py", line 531, in open
response = meth(req, response)
File "c:\usr\Python37-32\lib\urllib\request.py", line 641, in http_response
'http', request, response, code, msg, hdrs)
File "c:\usr\Python37-32\lib\urllib\request.py", line 569, in error
return self._call_chain(*args)
File "c:\usr\Python37-32\lib\urllib\request.py", line 503, in _call_chain
result = func(*args)
File "c:\usr\Python37-32\lib\urllib\request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized

是什么原因造成的,如何解决?

最佳答案

我来猜一猜。请试试这个,如果它不能解决您的问题,我可以放弃答案(但它不会轻易适合原样的评论)。

不确定请求。但是 curl 在提供凭据时不会等待质询(HTTP 401 和有关支持的身份验证方法的信息)来尝试(响应)身份验证(尝试)。一些服务器不发送这样的挑战,只是期待预认证 session 或强制(幸运的猜测)认证。我也必须像这样与一些主持人交谈。如果是这种情况,您无法更改服务器设置并且您可以假设支持 HTTP basic,您可以尝试在每个请求中强制使用您的凭据。重复使用您的 openerusernamepassword 并且您还需要为此代码段导入 base64 :

credentials = '{}:{}'.format(username, password).encode('ascii')
credentials = base64.b64encode(credentials)
credentials = b"Basic " + credentials
opener.addheaders.append(("Authorization", credentials))

关于python - 如何删除对 "HTTP For Humans"请求库的依赖并改用 urllib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623657/

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