WebSocket
Captura y descifra el tráfico WebSocket (WS/WSS) con Proxyman desde navegadores web, dispositivos y simuladores iOS, Android y servidores NodeJS o Python.
1. ¿Qué es?
Proxyman puede capturar tráfico WebSocket (WS) y WebSocket seguro (WSS), y te permite previsualizarlo fácilmente.
- Captura WS/WSS desde dispositivos físicos iOS y el simulador de iOS (requiere el framework Atlantis)
- Captura WS/WSS desde navegadores web y aplicaciones de Mac.
- Captura WS/WSS desde dispositivos físicos Android o emuladores de Android.
- Muestra los mensajes WebSocket con formato legible.
- Filtra los mensajes All / Sent / Received.
- Consulta el contenido en formato JSON / Tree Preview / HEX.
- Personaliza las columnas: Frame, Length, Data, Time, ...
- Decodifica automáticamente los mensajes binarios a JSON, si es posible.
- Abre los mensajes WebSocket en editores externos, como Sublime o VS Code.
- Edita, descarta o envía mensajes WebSocket con Scripting (Proxyman 26.2.0 o posterior para macOS, Proxyman 26.1.0 o posterior para Windows/Linux).
2. Capturar WS/WSS desde navegadores web
WebSocket en localhost
Proxyman puede capturar un WebSocket en localhost, como ws://localhost:3000, desde Google Chrome con Automatic Setup.
- Ve al menú Setup -> Automatic Setup…
- Selecciona Google Chrome (New Profile o Current Profile). Se abre una nueva ventana de Google Chrome.
- Abre la página de tu WebSocket en localhost en esta ventana. Proxyman la capturará.
WebSocket en producción
Proxyman captura automáticamente tu tráfico WS/WSS desde Google Chrome, sin ninguna configuración.
- Abre Proxyman y Google Chrome
- Genera algo de tráfico WS/WSS, por ejemplo, en https://echo.websocket.org/.ws
- Inspecciona los datos WS/WSS en Proxyman
WebSocket con payload Protobuf
Desde Proxyman para macOS 6.5.0 o posterior, Proxyman puede decodificar Protobuf en tus mensajes WebSocket.
- Asegúrate primero de que Proxyman pueda capturar tu tráfico WebSocket
- Haz clic derecho en un mensaje WebSocket de Protobuf -> Protobuf -> Decode Raw Text… o Decode with Message Type…
- Raw mode: útil si no tienes un archivo desc de Protobuf.
- Message Type: usa un tipo de mensaje de tu archivo desc de Protobuf.

Decodificar el payload de WebSocket con Protobuf
3. Capturar WS/WSS desde iOS
Si tu app de iOS usa URLSessionWebSocketTask o bibliotecas WebSocket de iOS, como Starscream o SocketRocket, es posible que Proxyman no pueda capturar el tráfico WS/WSS.
- Motivo: Es así por diseño de Apple. URLSessionWebSocketTask no respeta el proxy HTTP del sistema. Todo el tráfico WS/WSS va directamente a Internet, así que Proxyman o Charles Proxy no pueden capturarlo.
- App de ejemplo: https://github.com/ProxymanApp/websocket-example-ios-app
✅ Solución 1 (recomendada para iOS 17 o posterior)
- Sigue la guía de configuración para tus dispositivos iOS o simuladores de iOS. Asegúrate de que el certificado esté instalado y marcado como de confianza en tu dispositivo.
- En Proxyman: Tools -> Proxy Settings -> SOCKS Proxy Settings… -> actívalo. Anota el puerto.
- En la ventana principal de Proxyman, anota la IP actual de la barra de herramientas.

Obtener la IP actual de Proxyman
- En tu app: configura un proxy SOCKS. Asegúrate de que solo esté activo en las compilaciones de debug, por ejemplo, con un interruptor. No quieres que esta configuración esté en tu compilación de release.
- Para NWConnection
let parameters = webSocketURL.scheme == "wss" ? NWParameters.tls : NWParameters.tcp
let options = NWProtocolWebSocket.Options()
options.autoReplyPing = true
parameters.defaultProtocolStack.applicationProtocols.insert(options, at: 0)
if #available(iOS 17.0, *) {
let socksv5Proxy = NWEndpoint.hostPort(host: "x.x.x.x", port: 8889) // Please replace x.x.x.x with a real Proxyman IP
let config = ProxyConfiguration.init(socksv5Proxy: socksv5Proxy)
let context = NWParameters.PrivacyContext(description: "my socksv5Proxy")
context.proxyConfigurations = [config]
parameters.setPrivacyContext(context)
}
let connection = NWConnection(to: .url(webSocketURL), using: parameters)
connection.start(queue: .main)
- Para URLSession y URLSessionWebSocketTask
private lazy var urlSession: URLSession = {
let config = URLSessionConfiguration.default
if #available(iOS 17.0, *) {
let socksv5Proxy = NWEndpoint.hostPort(host: "x.x.x.x", port: 8889) // Please replace x.x.x.x with a real Proxyman IP
let proxyConfig = ProxyConfiguration.init(socksv5Proxy: socksv5Proxy)
config.proxyConfigurations = [proxyConfig]
}
return URLSession(configuration: config, delegate: nil, delegateQueue: nil)
}()
- ¡Listo! ✅

Capturar WebSocket desde iOS con Proxyman
- Crédito a FranklinSamboni -> https://github.com/ProxymanApp/Proxyman/issues/586#issuecomment-2125082129
- Tutorial: Cómo interceptar y depurar WebSocket desde simuladores o dispositivos iOS
✅ Solución 2
Usa el Atlantis Framework (desarrollado por Proxyman) para capturar el tráfico WS/WSS de URLSessionWebSocketTask desde iOS.
Lee más en la guía de tráfico WS/WSS de Atlantis.
4. Capturar WebSockets desde tu navegador web (Chrome, Safari, etc.)
- Proxyman puede capturar WS/WSS desde un navegador web sin configuración previa. No tienes que configurar nada.
- Cómo usarlo: abre Google Chrome -> visita tu sitio web que establece una conexión WS/WSS -> abre Proxyman -> busca los dominios de tu WebSocket -> en el panel Response, haz clic en Enable SSL Proxying para estos dominios. Recarga tu sitio web en el navegador. Proxyman capturará y descifrará WS/WSS ✅
5. Capturar WebSocket desde un servidor NodeJS, Golang o Python
- Proxyman puede capturar WS/WSS desde tu servidor NodeJS, Golang, Python o Ruby.
- Cómo usarlo: lee automatic-setup.md para iniciar tu servidor en la Terminal que se abre -> establece una conexión WS/WSS -> Proxyman captura y descifra la conexión automáticamente ✅
6. Mapear WebSocket de localhost <-> producción
Puedes mapear el tráfico WebSocket entre localhost <-> producción. Consulta la herramienta Map Remote.
7. Modificar mensajes WebSocket con Scripting
Desde Proxyman 26.2.0 para macOS y Proxyman 26.1.0 para Windows/Linux, puedes modificar mensajes WebSocket sobre la marcha con unas pocas líneas de JavaScript. Marca Modify WebSocket Messages en una regla de Scripting y, después, usa onWebsocket() para:
- Editar un mensaje de texto o binario, en ambas direcciones.
- Descartar un mensaje, para que el otro extremo nunca lo vea.
- Enviar un mensaje nuevo al cliente o al servidor.
- Cerrar el WebSocket para probar cómo se reconecta tu app.
function onWebsocket(context, url, request, response, message) {
if (message.from === "server" && message.type === "text") {
message.data = message.data.replace("staging.example.com", "api.example.com");
}
return message;
}