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,提问作者Алексей Иванов
相关产品推荐
相关产品推荐

