python和nodejs的https实现有什么不同?

python和nodejs的https实现有什么不同?,python,node.js,http,Python,Node.js,Http,我想找出一个奇怪的问题。我有正在工作的python代码,我想将其翻译成NodeJS。Python代码非常简单且有效: import requests LOGIN_URL = 'https://android.clients.google.com/auth' params = {'Email': '***', 'EncryptedPasswd': b'***', 'service': 'androidmarket', 'accountType': 'HOSTED_OR_GOOGLE', 'has

我想找出一个奇怪的问题。我有正在工作的python代码,我想将其翻译成NodeJS。Python代码非常简单且有效:

import requests

LOGIN_URL = 'https://android.clients.google.com/auth'
params = {'Email': '***', 'EncryptedPasswd': b'***', 'service': 'androidmarket', 'accountType': 'HOSTED_OR_GOOGLE', 'has_permission': 1, 'source': 'android', 'device_country': 'us', 'lang': 'us'}
response = requests.post(LOGIN_URL, data=params, verify=True)
print(response.text)
以下是NodeJS的版本代码:

const request = require('request');

const LOGIN_URL = 'https://android.clients.google.com/auth'
const params = {'Email': '***', 'EncryptedPasswd': '***', 'service': 'androidmarket', 'accountType': 'HOSTED_OR_GOOGLE', 'has_permission': 1, 'source': 'android', 'device_country': 'us', 'lang': 'us'}
request({url: LOGIN_URL, method: 'POST', form: params}, function(error, response) {
   console.log(response.statusCode);
});
这不起作用,我得到了403-错误的要求。 我尝试将协议更改为http,然后检查Wireshark中的数据包内容。它们几乎相同,但有一些细微的差别。我试图通过覆盖NodeJS版本中的头来消除所有差异,但没有任何帮助。那么我猜https有问题吗

我错过了什么?Python和NodeJS之间有什么区别?

第二个猜测:

登录需要cookies,默认情况下,NodeJS
请求
禁用cookies。尝试:

const-request=request.defaults({jar:true})
第一个猜测:

python代码和Node.js代码之间的差异如下:

  • python代码发送以下标题:
HTTP\u接受:*/*
HTTP_ACCEPT_编码:gzip,deflate
HTTP_连接:保持活动状态
HTTP_用户_代理:python请求/2.24.0
  • 节点代码仅发送以下标头:
标题很可能是问题所在,但也可能是Python代码可以访问cookie jar,并且正在向请求添加cookie,而Node.JS代码不是

另一种可能性是,您的两个客户端使用两个不同的TLS堆栈(或至少两种不同的配置),而NodeJS客户端无法协商可接受的密码

我建议您使用Postman之类的工具手动尝试各种请求,以确定哪些请求有效,哪些请求无效。如果您在Postman中使用它,请使用Postman导出Python和NodeJS的代码段,并确认它们工作正常。如果导出的代码可以在Python中工作,但不能在NodeJS中工作,那么问题不在于代码


最有可能的问题是你没有意识到,因此没有告诉我们。让Postman export
curl
wget
命令,这样您就可以验证它们是否在Docker容器内工作,以及问题是否与容器或Docker网络有关。使用
curl-v
查看正在协商的TLS密码,并将NodeJS配置为仅使用该版本的TLS和该密码,因为Google喜欢阻止允许降级到旧的损坏的TLS版本或弱密码的客户端。

在两个代码中都使用url,然后返回(作为JSON数据)所有侦听器、cookies、,等等。发送到这个url,然后您可以比较Python和NodeJS的结果。最终使用一些本地代理服务器,比如or(在Python中创建)并在两个连接中使用它们来查看发送到服务器的所有数据,然后您可以对它们进行比较。您还可以使用或测试url,并且两者都具有生成不同语言代码的功能—例如,
Python
NodeJS
@furas我已经通过Wireshark测试了HTTP请求内容,并且我能够获得相同的内容对于Python和NodeJS,@momo但这似乎没有任何区别。当我在wireshark的http请求中看到这一点时,它们是相同的,因为
EncryptedPasswd
作为字符串发送。如果我没有清楚地描述它,我很抱歉,但我尝试更改了NodeJS版本以发送完全相同的数据,包括所有的头。我在Wireshark中检查了发送的请求,它们看起来一模一样。我只尝试了邮递员,它也可以执行邮递员的请求。然后我使用了“代码”功能。在NodeJS代码中导出请求,运行它,我仍然得到403-错误的请求。我使用所有头测试代码,甚至使用不同的模块
https
fetch
,我唯一的想法是问题在较低的级别上-即SSL/TLS@Aleksey登录可能会执行需要cookie的重定向,但NodeJS默认情况下会禁用cookie。我更新了我的答案。@OldPro我尝试了这个,但没有成功。还试图通过请求显式地传递cookie jar,但没有任何更改。如何验证是否正在进行重定向?
HTTP_CONNECTION: close