使用 Python 和 websocket-client 库发送安全 (SSL) 网络套接字请求并希望更好地了解正在发生的事情

Sending a secure (SSL) web socket request using Python and the websocket-client library and hoping to better understand what's happening

我正在尝试使用 Python 和 websocket-client 库构建和发送 websocket 请求,但我想了解为什么我总是收到 400 或 502 代码,或者连接尝试 URL 和 header 值的不同变体时超时。

一方面,我对网络套接字请求有点陌生,而且在诊断常规旧 HTTP 请求方面也不是专家。

幸运的是,有可用的调试信息,允许我以纯文本形式查看请求。

老实说,在这一点上,我几乎只是随机地在板上扔飞镖,调整 websocket URL 和 header 值,但我真的很想能够知道如何系统地解决这个问题。

对于更广泛的上下文,这是我正在尝试改编的 github 存储库(基本上,我正在尝试抽象出代码的最基本部分以了解它的工作原理并获得最简单的可能版本 - 没有任何花里胡哨的东西)。

https://github.com/odsum/TinyChatBot

这是发送到 general/generic tinychat URL(具有标准 SLL 端口 443)的示例请求

cookies: <RequestsCookieJar[<Cookie hash=79d26a617642869dcbf218289211945c for .tinychat.com/>, <Cookie pass=925c6a6f825421f84bd0e68e4fdd404b for .tinychat.com/>, <Cookie tcuid=rB8UtFxM4FGx2ka1BMmrAg== for .tinychat.com/>, <Cookie user=cooldudeusername for .tinychat.com/>, <Cookie XSRF-TOKEN=eyJpdiI6ImhUeU1cL3NXMzJVQXRsTVh6a1NkdGFBPT0iLCJ2YWx1ZSI6IndiN1ZYbEJQOTZHYXpjUVFcL25SU1BPcTV6Y2tKbVRUYTV1NHJ5cWxXeXNRMGIwNnl0WDNEeU9wZXUrdEdTTWkwd0xNK09VcFhDRnpsd3dXTE1JY0l1UT09IiwibWFjIjoiYjdlZmIxNWNhNTJkYzczOTYzYTk2Nzg5MjQyODhhZGE2NTIxZDQ5Nzk3NWRhOTg5NGExNDkwM2JiYjk2NjFkNyJ9 for tinychat.com/>, <Cookie remember_82e5d2c56bdd0811318f0cf078b78bfc=eyJpdiI6Ik1rbzIxWGRDdTBrN1huMFp1RzZleXc9PSIsInZhbHVlIjoibHI3NTROcFc4V3pYSk90K2RValZwdjRvSml2K1wvdVhNSHd5SDZKWFdZaEZ6Qk4wVHFTa1EybzIySXQ4RzN0R3R5VTJqMGR2QlUySkVxWG9sWmNBUTdreTF0NTdVV0hcLzdTa1dIbHVsQVU5d1wvYVhmZFRhRTkzaXFqaFBzaWFET04iLCJtYWMiOiJlNmUzOTYzNjA0YWU5YTEzOTlkZTdhZTc2NjhlYzQ2OWQ5MGJhZWI2OGQ4MTUzNjNiNjQwYTEyZmQ3MmY1NTkxIn0%3D for tinychat.com/>, <Cookie sm_dapi_session=1 for tinychat.com/>, <Cookie tcsession=3de8c7d90f323fcc4753d764722d6582649f34f6 for tinychat.com/>]>

--- request header ---
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: wss.tinychat.com:443
Origin: https://tinychat.com
Sec-WebSocket-Key: XlfPqPAzStqTbVg2Y4lxBQ==
Sec-WebSocket-Version: 13
User-Agent
Connection
Cache-Control
Accept
Accept-Language
Accept-Encoding
Sec-WebSocket-Protocol
Sec-WebSocket-Extensions

-----------------------
--- response header ---
HTTP/1.1 502 Bad Gateway
Server: awselb/2.0
Date: Sat, 26 Jan 2019 22:33:54 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
-----------------------

这里的下一个示例使用动态生成的 WSS URL,它具有唯一的子域和端口(在代码的前面获取)。

cookies: <RequestsCookieJar[<Cookie hash=af9b5641e1fffed6c3f7ca8b74c29b54 for .tinychat.com/>, <Cookie pass=414fc913a67cf4fdc59f93f117e98e2c for .tinychat.com/>, <Cookie tcuid=rB8UtFxM4Ymx2ka1BMtqAg== for .tinychat.com/>, <Cookie user=cooldudeusername for .tinychat.com/>, <Cookie XSRF-TOKEN=eyJpdiI6Im9RckxrVDFmbllEaE5QeXlKUVBDZXc9PSIsInZhbHVlIjoiQUFwRkdwVXE5NFwvYk43Z0NnY3BJbnlJZzRWQWZDMEZHNFgrbG1nMUJOOG84dFwvYWk0N3dXNDcya3hyaXBcLzdSODRCOGpUbnVoNHdNRGJ2eDhTRitwZXc9PSIsIm1hYyI6IjA2YjFjYmY3OGI4MGE5MTljNjI4MmE2ZWJkYzI0YTdkZWQ2N2MxOWNkNTM4ODZmYTg1Mjc4ZjViNTlmNjU3NTAifQ%3D%3D for tinychat.com/>, <Cookie remember_82e5d2c56bdd0811318f0cf078b78bfc=eyJpdiI6IloyRDluMHV6dGlJY3dUeHB5VFNnaFE9PSIsInZhbHVlIjoieXRLUWhXY2NRcjNHOTdoN1lQMXVIOW9zZUpcL1ZaWXg2XC9vZ0x3K3BjUnRtcEh6ZFNzNEh1SUgrR1FId0hiTTB6ZEtkMThUWFhGcXlYUko5T0xXYU5wUUYrMHBcL0NWTWtUXC9nMVloNWR0NDZqU1B1UlI1UU9Ic2dCNHExTmUyVG1XIiwibWFjIjoiMmEyZTc0OTg3ZDBhMzUyOTU0NzAyZmY5MzM2ZTQ5MDIxOTFhYjJjOTY1NWZlOTJhODFkZmI4ODk0ZGMwN2NiZCJ9 for tinychat.com/>, <Cookie sm_dapi_session=1 for tinychat.com/>, <Cookie tcsession=ad801ba583d0ce703a8d1cf313fe75f86a036ea3 for tinychat.com/>]>

--- request header ---
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: wss0703.tinychat.com:27857
Origin: https://tinychat.com
Sec-WebSocket-Key: ha4h+9adTDWAitNtimMy7Q==
Sec-WebSocket-Version: 13
User-Agent
Connection
Cache-Control
Accept
Accept-Language
Accept-Encoding
Sec-WebSocket-Protocol
Sec-WebSocket-Extensions

-----------------------
--- response header ---
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
-----------------------

我尝试过其他变体,但没有必要在此处粘贴代码来显示每个其他场景,因为可能存在无限多种可能性。

当谈到调整 header 时(无论是添加其他的,删除一些现有的,还是改变已经在混合中的值),我只是不知道如何制作在这方面的明智决定。

(顺便说一下,这是我的第一个 Stack Overflow post...有点令人兴奋,不会撒谎)。

好的,我成功了。

事实证明,大多数 header 值不仅完全没有必要,而且有些甚至可能是错误的、不准确的或其他不正确的。

此外,cookie 也完全没有必要。

对于可能遇到此问题的任何其他人 - 关于 cookie 最基本性质的简短课程:

Cookie 可以而且显然经常只包含一个标记字符串,该标记字符串是在 session 开始时动态生成的,但必须随每个后续请求一起发送。

因此,令牌可以保存在内存中的一个简单变量中,而不是显式地使用请求库的 cookie。

这里有一些关于 cookie 的更多有用信息:https://www.sohamkamani.com/blog/2017/01/08/web-security-session-cookies/