一个 web 能连接但 Python 不能访问的 websocket 链接,是什么原理?

327 天前
 tg11

链接地址如下:

wss://api.cotrans.touhou.ai/task/clipekg954dosmc01ll5xpyh1/event/v1

用 web 的在线调试工具,可以连接->接收参数->断开。

用 python 代码或 postman ,加上同样的请求头,连接超时。

是哪里做了验证?

3159 次点击
所在节点    Python
37 条回复
so1n
327 天前
你是不是用了 socketio
tg11
327 天前
@so1n 不清楚,服务端是一个网站上的。我只是尝试客户端连接。
Nazz
327 天前
可能是 header 差异造成的,服务端有 check origin
tg11
327 天前
@Nazz header 应该不会有差异吧,我完全复制的浏览器使用的 header 。以 cURL 复制也试过了
momocraft
327 天前
2 个不好判断 完全有可能是 py 代码写错了
试试别的 cliient?
Nazz
327 天前
连接超时是因为没使用代理
tg11
327 天前
@Nazz 使用 clash 代理了,没用。
tg11
327 天前
@momocraft postman 也不行啊
marshmallow
327 天前
python 用了 http2 ,而浏览器降级到 http/1.1 了吧?
marshmallow
327 天前
你看一下浏览器请求头,如果有 Connection: upgrade 和 Upgrade: websocket ,那就是用 http1.1 握手的。http2 版的 websocket 我还没有测过,只是我确定没有 Connection 和 Upgrade 头。
Nazz
327 天前
@tg11 开了 clash 不意味着 websocket 能通过代理建立连接,关掉 clash 你会发现浏览器里面也会超时
Nazz
327 天前
@marshmallow 好好看看 rfc6455 吧
Nazz
327 天前
@tg11 使用 Clash X Pro 开启增强模式, 或许可行
tg11
326 天前
@Nazz 我直接用的
websocket.enableTrace(True)
ws = websocket.WebSocket( http_proxy_host="127.0.0.1", http_proxy_port=7890)
ws.connect('wss://api.cotrans.touhou.ai/task/clipekg954dosmc01ll5xpyh1/event/v1')
所以肯定是走了代理的
tg11
326 天前
@marshmallow python 的 websocket-client 是基于 http1.1 握手的。请求头确实有 Connection: upgrade 和 Upgrade: websocket 。
我在连接 ws 的时候手动添加这两个 header 也不管用。
对了,我在主楼留的链接,是可以直接访问的,你可以试试
tg11
326 天前
@Nazz 我在主楼留下的链接地址是可以访问的,你可以尝试下
centralpark
326 天前
可能是 tls 指纹
tg11
326 天前
@centralpark 随便手撸一个 js 的 websocket 客户端,就不受 tls 指纹影响吗?
marshmallow
326 天前
@Nazz 你好好看看 rfc8441 ,再来回复我吧
Nazz
326 天前
@marshmallow 是我孤陋寡闻了,没见过 RFC8441 的 server 实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/947518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX