python - POST 请求 - 适用于本地(200),但不适用于 docker(403) - Python3
问题描述
我尝试使用的python代码,我能做的最简化的是:
import requests
params = {
'Email': 'someaccount@gmail.com',
'EncryptedPasswd': 'longEncryptedPassword'
}
response = requests.post('https://android.clients.google.com/auth', data=params)
print(response.status_code)
print(response.content)
现在,当我尝试在我的任何主机上运行该代码时,它工作正常:
ᐅ python -VV
Python 3.7.2 (default, Apr 23 2021, 12:30:59)
[GCC 10.2.0]
ᐅ python test.py
200
b'SID=BAD_COOKIE\nLSID=BAD_COOKIE\nservices=mail,hist,multilogin,android'
---
atay@atay$ ~ ᐅ python3 -VV
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0]
atay@atay$ ~ ᐅ python3 test.py
200
b'SID=BAD_COOKIE\nLSID=BAD_COOKIE\nservices=mail,hist,multilogin,android'
---
pi@raspberrypi$ ~ ᐅ python3 -VV
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0]
pi@raspberrypi$ ~ ᐅ python3 test.py
200
b'SID=BAD_COOKIE\nLSID=BAD_COOKIE\nservices=mail,hist,multilogin,android'
但是当尝试在 docker 上运行相同的代码时,我得到了错误响应:
docker run -v $(pwd):/app python:3.7.2 sh -c 'pip install requests && python -VV && python /app/test.py'
...
Python 3.7.2 (default, Mar 27 2019, 08:41:08)
[GCC 6.3.0 20170516]
403
b'Error=BadAuthentication'
我也无法理解的是——如果我使用 curlify 来创建 IMO 应该与该调用相同的 curl——它返回 403 而不是 200。
另一件事 - 如果我在 Postman 中创建相同的请求,它会返回 200,但如果我在 Postman 中将其导出到 CURL 命令,它会再次返回 403。
我不确定在这种情况下可能是什么问题,有什么线索吗?
解决方案
我会回答自己,因为我找到了解决方案,但仍然不明白出了什么问题。
看起来 pip 库requests>=2.25.0
不起作用,但所有早期版本都有效,因此将代码更改为:
ᐅ docker run -v $(pwd):/app python:3.9 sh -c 'pip install requests==2.25.0 && openssl version && python -VV && python /app/test.py'
让它工作。OpenSSL 也必须是 1.1.1,这就是我使用 3.9 而不是 3.7.2 的原因。
推荐阅读
- swift - 在 Watch 上无法按预期工作的页面的程序化 segues
- http-headers - 强制 Google Cloud 存储以 Content-Encoding 响应
- c# - 使用 JWT 令牌的 ASP.NET Core 网站到 WebApi 身份验证
- vb.net - VB.net 与网站交互(没有 WebBrowser)
- jenkins - 在 Cloud Foundry 中暂存 - .cignore
- javascript - 如何使用jQuery找到最近的表格行?
- jquery - jQuery 只是使用 .css() 忽略边距或边距-*?
- css - 多个背景图像 url:应用附加到 url 列表而不是替换的 css 样式
- c - getchar() 在我按下回车后返回一个不是换行符的字符
- javascript - Photoshop - 打开随机图像