V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tg11
V2EX  ›  Python

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

  •  
  •   tg11 · 2023-06-10 13:18:31 +08:00 · 3595 次点击
    这是一个创建于 561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    链接地址如下:

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

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

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

    是哪里做了验证?

    第 1 条附言  ·  2023-06-10 20:15:22 +08:00
    上面这个 wss 地址是可以访问的,有兴趣的可以试一下看看
    37 条回复    2023-06-15 17:49:57 +08:00
    so1n
        1
    so1n  
       2023-06-10 14:29:49 +08:00
    你是不是用了 socketio
    tg11
        2
    tg11  
    OP
       2023-06-10 14:34:13 +08:00
    @so1n 不清楚,服务端是一个网站上的。我只是尝试客户端连接。
    Nazz
        3
    Nazz  
       2023-06-10 15:57:57 +08:00 via Android
    可能是 header 差异造成的,服务端有 check origin
    tg11
        4
    tg11  
    OP
       2023-06-10 16:02:01 +08:00
    @Nazz header 应该不会有差异吧,我完全复制的浏览器使用的 header 。以 cURL 复制也试过了
    momocraft
        5
    momocraft  
       2023-06-10 16:24:01 +08:00
    2 个不好判断 完全有可能是 py 代码写错了
    试试别的 cliient?
    Nazz
        6
    Nazz  
       2023-06-10 16:26:04 +08:00 via Android
    连接超时是因为没使用代理
    tg11
        7
    tg11  
    OP
       2023-06-10 16:30:19 +08:00
    @Nazz 使用 clash 代理了,没用。
    tg11
        8
    tg11  
    OP
       2023-06-10 16:30:42 +08:00
    @momocraft postman 也不行啊
    marshmallow
        9
    marshmallow  
       2023-06-10 16:34:19 +08:00
    python 用了 http2 ,而浏览器降级到 http/1.1 了吧?
    marshmallow
        10
    marshmallow  
       2023-06-10 16:38:44 +08:00
    你看一下浏览器请求头,如果有 Connection: upgrade 和 Upgrade: websocket ,那就是用 http1.1 握手的。http2 版的 websocket 我还没有测过,只是我确定没有 Connection 和 Upgrade 头。
    Nazz
        11
    Nazz  
       2023-06-10 17:18:55 +08:00 via Android
    @tg11 开了 clash 不意味着 websocket 能通过代理建立连接,关掉 clash 你会发现浏览器里面也会超时
    Nazz
        12
    Nazz  
       2023-06-10 17:24:40 +08:00 via Android
    @marshmallow 好好看看 rfc6455 吧
    Nazz
        13
    Nazz  
       2023-06-10 18:12:04 +08:00
    @tg11 使用 Clash X Pro 开启增强模式, 或许可行
    tg11
        14
    tg11  
    OP
       2023-06-10 20:09:01 +08:00
    @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
        15
    tg11  
    OP
       2023-06-10 20:14:17 +08:00
    @marshmallow python 的 websocket-client 是基于 http1.1 握手的。请求头确实有 Connection: upgrade 和 Upgrade: websocket 。
    我在连接 ws 的时候手动添加这两个 header 也不管用。
    对了,我在主楼留的链接,是可以直接访问的,你可以试试
    tg11
        16
    tg11  
    OP
       2023-06-10 20:14:50 +08:00
    @Nazz 我在主楼留下的链接地址是可以访问的,你可以尝试下
    centralpark
        17
    centralpark  
       2023-06-10 20:51:51 +08:00   ❤️ 1
    可能是 tls 指纹
    tg11
        18
    tg11  
    OP
       2023-06-10 21:34:57 +08:00
    @centralpark 随便手撸一个 js 的 websocket 客户端,就不受 tls 指纹影响吗?
    marshmallow
        19
    marshmallow  
       2023-06-10 21:46:21 +08:00
    @Nazz 你好好看看 rfc8441 ,再来回复我吧
    Nazz
        20
    Nazz  
       2023-06-10 21:56:42 +08:00 via Android
    @marshmallow 是我孤陋寡闻了,没见过 RFC8441 的 server 实现
    Nazz
        21
    Nazz  
       2023-06-10 22:12:45 +08:00
    @tg11 你设置的是 http_proxy, wss 对应的是 https_proxy.
    我在浏览器试过, 开启 SwitchOmega 代理能正常连接, 关闭就会超时
    centralpark
        22
    centralpark  
       2023-06-10 22:28:05 +08:00
    @Nazz #21 那他这个应该就是被墙了……
    Nazz
        23
    Nazz  
       2023-06-10 22:48:46 +08:00
    @centralpark 我用 golang 写的客户端已经连上去了, 输出:
    {"type":"result","result":{"translation_mask":"https://cotrans-r2.moe.ci/mask/clipekg954dosmc01ll5xpyh1.png"}}

    然后过几秒会发生错误断开连接
    marshmallow
        24
    marshmallow  
       2023-06-10 22:55:28 +08:00
    @tg11 我刚测了一下,这个 http 代理配置应该不生效。
    我本机没开 clash ,走的路由器透明代理,浏览器和 python 都是直接连得上。
    marshmallow
        25
    marshmallow  
       2023-06-10 23:02:05 +08:00   ❤️ 1
    @Nazz haproxy 2.4+就支持啊,你 docker 运行下看看效果
    tg11
        26
    tg11  
    OP
       2023-06-10 23:04:05 +08:00
    @Nazz 断开连接是正常的,服务端主动断开的。要的就是这段 json 参数。你用 golang 写的时候挂代理了吗?
    Nazz
        27
    Nazz  
       2023-06-10 23:11:46 +08:00 via Android
    @tg11 开了 clash ,然后设置 socks5://127.0.0.1:1080
    est
        28
    est  
       2023-06-10 23:34:15 +08:00
    这不是 py 的 ws 的锅,是 py 的 ws 不支持代理吧?
    haoxue
        29
    haoxue  
       2023-06-11 07:13:58 +08:00 via Android
    可以抓包看一下,对比请求内容之间的差异,再进一步分析
    FaiChou
        30
    FaiChou  
       2023-06-11 10:17:43 +08:00
    用 Proxyman 抓包看看,设置代理为 Proxyman 的,Proxyman 上级代理是 clash, 或者直接用 ClashX Pro 增强模式。

    websocket.WebSocket( http_proxy_host="127.0.0.1", http_proxy_port=PROXYMANPORT)

    https://docs.proxyman.io/advanced-features/websocket
    Nazz
        31
    Nazz  
       2023-06-11 12:14:12 +08:00
    @marshmallow 知道有这个东西就行了. 我感觉 H2 升级 WebSocket 意义不大, 传输层都是 TCP, 而且 1.1 和 2 header 差异较大握手部分代码不能复用进一步导致开发者不愿意支持.
    marshmallow
        32
    marshmallow  
       2023-06-12 12:36:04 +08:00
    @Nazz 不能复用应该不是不愿意支持的主要原因吧。我感觉不如原来的实用才是更主要的原因。
    我想用 h2 websocket ,主要原因是想用来替代 v2ray 的 mux 。平时看视频感觉很卡,不知道是不是 v2ray 的 mux 做的太差了。
    Nazz
        33
    Nazz  
       2023-06-12 13:46:48 +08:00
    @marshmallow 实用性差不多, 握手之后都是 TCP Socket. HTTP/1.1 报文更简单, 而且已经得到了广泛应用.
    握手的报文不变, 把传输层换成 KCP/QUIC 更有意义.
    Nazz
        34
    Nazz  
       2023-06-12 13:48:31 +08:00
    @marshmallow 看视频卡可能是你的梯子延迟高. Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据, 对降低延迟没有帮助.
    marshmallow
        35
    marshmallow  
       2023-06-12 20:32:31 +08:00
    http2 就算没有实现 rfc8441 用起来差别也不大。如果 http3 没有实现 rfc9220 ,就感觉这个 http3 功能不完备。
    marshmallow
        36
    marshmallow  
       2023-06-12 21:01:36 +08:00
    延迟高和看视频关系应该不大吧,延迟只影响浏览体验,想通过代理玩游戏可能玩不了。我出现的情况是就访问视频那个流地址会 20 秒,然后超时,访问其他网站都正常,不知道具体什么原因。
    v2ray 介绍里说的 Mux 功能就是为了降低延迟而设计的吧。

    这两天把代理客户端用上 haproxy 了,感觉再把服务器端也配置好 haproxy 应该延迟能降不少。我现在配置的东西有点多杂,第一次访问一个网站可能要连 4 ,5 秒。
    wingor2015
        37
    wingor2015  
       2023-06-15 17:49:57 +08:00
    网上超了一段,
    from websocket import create_connection

    ws = create_connection("wss://api.cotrans.touhou.ai/task/clipekg954dosmc01ll5xpyh1/event/v1", timeout=5)
    if ws.connected:
    ws.send('8')
    print(ws.recv())
    # ws.close()

    打印了这个{"type":"result","result":{"translation_mask":"https://cotrans-r2.moe.ci/mask/clipekg954dosmc01ll5xpyh1.png"}}
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3660 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.