首页 > 解决方案 > 使用 Python 和 websocket-client 库发送安全 (SSL) Web 套接字请求,并希望更好地了解正在发生的事情

问题描述

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

一方面,我对 Web 套接字请求有点陌生,在诊断常规旧 HTTP 请求方面并不是任何类型的专家。

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

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

对于更广泛的背景,这是我正在尝试调整的 github 存储库(基本上,我正在尝试抽象出代码的最基本部分以了解它是如何工作的并获得最简单的版本工作 - 没有任何钟声和口哨声)。

https://github.com/odsum/TinyChatBot

这是发送到通用/通用 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,该 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
-----------------------

我尝试了其他变体,但是在这里粘贴代码以显示其他所有场景是没有意义的,因为可能存在无限多的可能性。

在调整标题时(无论是添加其他标题,删除其中的一些,还是更改已经混合的标题的值),我只是不知道如何在这方面做出明智的决定。

(顺便说一句,这是我的第一篇 Stack Overflow 帖子……有点令人兴奋,不会撒谎)。

标签: pythonsslwebsocketrequestrequest-headers

解决方案


好吧,我得到它的工作。

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

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

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

Cookie 可以而且显然经常只包含在会话开始时动态生成的单个令牌字符串,但必须与每个后续请求一起发送。

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

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


推荐阅读