一个 web 能连接但 Python 不能访问的 websocket 链接,是什么原理? - V2EX
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 4243 次点击
    这是一个创建于 862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    链接地址如下:

    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
    可以抓包看一下,对比请求内容之间的差异,再进一步分析
    ethusdt
        30
    ethusdt  
       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     Solana     923 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:58 PVG 06:58 LAX 15:58 JFK 18:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86