gpt4 book ai didi

python - 适用于 urllib.request 但不适用于请求

转载 作者:行者123 更新时间:2023-12-03 17:24:46 25 4
gpt4 key购买 nike

我正在尝试使用 post 方法向 API 发送请求,我的代码如下所示:

import urllib.request
import json

url = "https://api.cloudflareclient.com/v0a745/reg"
referrer = "e7b507ed-5256-4bfc-8f17-2652d3f0851f"
body = {"referrer": referrer}
data = json.dumps(body).encode('utf8')
headers = {'User-Agent': 'okhttp/3.12.1'}
req = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(req)
status_code = response.getcode()
print (status_code)
实际上它工作正常,但我想改用“请求”库,因为它具有以下代码的代理更新和更灵活:
import requests
import json

url = "https://api.cloudflareclient.com/v0a745/reg"
referrer = "e7b507ed-5256-4bfc-8f17-2652d3f0851f"
data = {"referrer": referrer}
headers = {'User-Agent': 'okhttp/3.12.1'}
req = requests.post(url, headers=headers, json=data)
status_code = req.status_code
print (status_code)
但它返回 403 状态码 ,我该如何解决?
请记住,此 API 对所有人开放,您可以放心地运行代码。

编辑-1 : 我试过删除 json.dumps(body).encode('utf8')或只是 .encode('utf8')来自@tomasz-wojcik 建议的第二个代码,但我仍然收到 403,而第一个代码仍然有效!
编辑 2 : 我尝试向 postman 提出请求,成功提出请求并返回 200 状态码 . postman 生成了以下python代码:
import requests

url = "https://api.cloudflareclient.com/v0a745/reg"

payload = "{\"referrer\": \"e7b507ed-5256-4bfc-8f17-2652d3f0851f\"}"
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'okhttp/3.12.1',
'Host': 'api.cloudflareclient.com'
}

response = requests.request("POST", url, headers=headers, data=payload)

status_code = response.status_code
print (status_code)
如果你在 postman 之外运行代码,它仍然返回 403 状态码 ,我有点困惑,我想也许“请求”库不会改变第二个代码中的用户代理。
编辑 3 :我查看了它,发现它适用于 python 2.7.16,但不适用于 python 3.8.5!
编辑 4 :一些开发人员报告说第二个代码也适用于 python 3.6,但主要是为什么它适用于其他版本但不适用于 3.8 或 3.7?
返回 403 状态代码(第二个代码)的 Python 版本:3.8.5 & 3.7
返回 200 状态代码(第二个代码)的 Python 版本:3.6 & 2.7.16

最佳答案

问题似乎与主机处理 ssl 的方式有关。较新版本的请求使用 certifi,在您的情况下,这与主机服务器有关。我将请求降级到早期版本并且它起作用了。 (2.1.0)。您可以在 requirements.txt 中修复版本,它应该适用于任何 python 版本。
https://requests.readthedocs.io/en/master/user/advanced/#ca-certificates


Before version 2.16, Requests bundled a set of root CAs that it trusted, sourced from the Mozilla trust store.
The certificates were only updated once for each Requests version. When certifi was not installed, this led to extremely out-of-date certificate bundles when using significantly older versions of Requests.

For the sake of security we recommend upgrading certifi frequently!

关于python - 适用于 urllib.request 但不适用于请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235326/

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