You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python连接受Cloudflare保护的WebSocket遇403错误求助

解决Cloudflare保护下WebSocket连接403错误

我需要用Python连接一个受Cloudflare保护的WebSocket服务器,但始终返回403错误,尝试了以下代码仍无法解决:

import asyncio
import websockets

async def connect_ws():
    cookies = {
        "token": "...",
        "lb-session-id": "...",
    }
    headers = {
        "accept-encoding": "gzip, deflate, br, zstd",
        "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
        "connection": "Upgrade",
        "cookies": "; ".join([f"{k}={v}" for k, v in cookies.items()]),
        "host": "playerok.com",
        "origin": "https://playerok.com",
        "sec-websocket-protocol": "graphql-transport-ws",
        "sec-websocket-version": "13",
        "upgrade": "websocket",
        "user-agent": "..."
    }
    
    try:
        async with websockets.connect(
            "wss://playerok.com/subscriptions",
            extra_headers=headers
        ) as ws:
            await ws.send('{"type":"connection_init"}')
            print(await ws.recv())
    except websockets.exceptions.InvalidStatusCode as e:
        print(e.status_code)
        print(e.headers)

asyncio.run(connect_ws())

问题分析与解决步骤

  • 不要手动拼接Cookie头:websockets库自带cookies参数,直接传入字典即可。手动在headers里添加cookies会和库自动生成的Cookie头冲突,导致Cloudflare验证失败。
  • 必须获取Cloudflare的cf_clearanceCookie:这是Cloudflare反爬验证的核心标识,需要先通过HTTP请求访问目标域名,触发并完成Cloudflare验证后才能获取。
  • 移除冗余头设置:connection、upgrade、sec-websocket-version这些头websockets库会自动处理,手动设置可能导致格式错误。
  • 保持User-Agent一致性:验证Cookie和WebSocket连接使用的User-Agent必须完全一致,否则cf_clearance会失效。

修改后的代码示例

import asyncio
import websockets
import aiohttp

async def get_cloudflare_cookies():
    # 使用和浏览器一致的User-Agent
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    async with aiohttp.ClientSession() as session:
        # 先访问目标网站主页,获取Cloudflare验证后的Cookie
        async with session.get("https://playerok.com", headers=headers) as resp:
            return {k: v.value for k, v in resp.cookies.items()}

async def connect_ws():
    # 获取Cloudflare验证Cookie
    cf_cookies = await get_cloudflare_cookies()
    # 合并自定义Cookie
    cf_cookies.update({
        "token": "...",
        "lb-session-id": "...",
    })
    
    headers = {
        "accept-encoding": "gzip, deflate, br, zstd",
        "accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
        "origin": "https://playerok.com",
        "sec-websocket-protocol": "graphql-transport-ws",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    
    try:
        async with websockets.connect(
            "wss://playerok.com/subscriptions",
            cookies=cf_cookies,
            extra_headers=headers
        ) as ws:
            await ws.send('{"type":"connection_init"}')
            print(await ws.recv())
    except websockets.exceptions.InvalidStatusCode as e:
        print(e.status_code)
        print(e.headers)

asyncio.run(connect_ws())

额外注意事项

  • 如果访问主页时遇到人机验证(如滑块),aiohttp无法自动处理,需要用playwright或selenium模拟浏览器完成验证后,再提取cf_clearanceCookie。
  • cf_clearanceCookie有效期较短,需要定期重新获取。
  • 确保所有请求的IP地址一致,Cloudflare会验证IP和Cookie的绑定关系。

内容的提问来源于stack exchange,提问作者Алексей Иванов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:42:45