linksocks


Namelinksocks JSON
Version 3.0.13 PyPI version JSON
download
home_pagehttps://github.com/linksocks/linksocks
SummaryPython bindings for LinkSocks - SOCKS proxy over WebSocket
upload_time2025-08-19 19:48:39
maintainerNone
docs_urlNone
authorjackzzs
requires_python>=3.9
licenseMIT
keywords socks proxy websocket network tunneling firewall bypass load-balancing go bindings
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # LinkSocks Python Bindings

[![PyPI version](https://badge.fury.io/py/linksocks.svg)](https://badge.fury.io/py/linksocks)
[![Python versions](https://img.shields.io/pypi/pyversions/linksocks.svg)](https://pypi.org/project/linksocks/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

Python bindings for LinkSocks - a SOCKS5 over WebSocket proxy tool.

## Overview

LinkSocks is a SOCKS proxy implementation over WebSocket protocol that allows you to securely expose SOCKS proxy services under Web Application Firewall (WAF) protection. This package provides Python bindings for the Go implementation.

### Key Features

- 🔄 **Forward & Reverse Proxy**: Support both forward and reverse SOCKS5 proxy modes
- 🌐 **WebSocket Transport**: Works under WAF protection using standard WebSocket connections
- ⚖️ **Load Balancing**: Round-robin load balancing for reverse proxy with multiple clients
- 🔐 **Authentication**: SOCKS5 proxy authentication and secure token-based WebSocket authentication
- 🌍 **Protocol Support**: Full IPv6 over SOCKS5 and UDP over SOCKS5 support
- 🐍 **Pythonic API**: Both synchronous and asynchronous APIs with context manager support

## Installation

### Using pip (Recommended)

```bash
pip install linksocks
```

### Development Installation

```bash
git clone https://github.com/linksocks/linksocks.git
cd linksocks/_bindings/python
pip install -e .
```

### Requirements

- Python 3.8 or later
- Go 1.19 or later (for building from source)

## Quick Start

### Forward Proxy Example

```python
import asyncio
from linksocks import Server, Client

async def main():
    # Create server and client with async context managers
    async with Server(ws_port=8765) as server:
        # Add forward token asynchronously
        token = await server.async_add_forward_token()
        
        async with Client(token, ws_url="ws://localhost:8765", socks_port=9870, no_env_proxy=True) as client:
            print("✅ Forward proxy ready!")
            print("🌐 SOCKS5 proxy: 127.0.0.1:9870")
            print("🔧 Test: curl --socks5 127.0.0.1:9870 http://httpbin.org/ip")
            
            # Keep running
            await asyncio.sleep(3600)

if __name__ == "__main__":
    asyncio.run(main())
```

### Reverse Proxy Example

```python
import asyncio
from linksocks import Server, Client

async def main():
    # Create server and client with async context managers
    async with Server(ws_port=8765) as server:
        # Add reverse token (port is auto-allocated)
        result = server.add_reverse_token()
        print(f"🔑 Reverse token: {result.token}")
        print(f"🌐 SOCKS5 proxy will be available on: 127.0.0.1:{result.port}")
        
        # Create client in reverse mode
        async with Client(result.token, ws_url="ws://localhost:8765", reverse=True, no_env_proxy=True) as client:
            print("✅ Reverse proxy ready!")
            print(f"🔧 Test: curl --socks5 127.0.0.1:{result.port} http://httpbin.org/ip")
            
            # Keep running
            await asyncio.sleep(3600)

if __name__ == "__main__":
    asyncio.run(main())
```

## API Reference

### Server Class

The `Server` class manages WebSocket connections and provides SOCKS5 proxy functionality.

```python
from linksocks import Server

# Create server with options
server = Server(
    ws_host="0.0.0.0",           # WebSocket listen address
    ws_port=8765,                # WebSocket listen port  
    socks_host="127.0.0.1",      # SOCKS5 listen address (reverse mode)
    buffer_size=32768,           # Buffer size for data transfer
    api_key="your_api_key",      # Enable HTTP API
    channel_timeout=30.0,        # WebSocket channel timeout (seconds)
    connect_timeout=10.0,        # Connection timeout (seconds)
    fast_open=False,             # Enable fast open optimization
    upstream_proxy="socks5://proxy:1080",  # Upstream proxy
    upstream_username="user",    # Upstream proxy username
    upstream_password="pass"     # Upstream proxy password
)
```

#### Token Management

```python
# Add forward proxy token (synchronous)
token = server.add_forward_token("custom_token")  # or auto-generate with None

# Add forward proxy token (asynchronous - recommended)
token = await server.async_add_forward_token("custom_token")

# Add reverse proxy token
result = server.add_reverse_token(
    token="custom_token",        # optional, auto-generated if None
    port=9870,                   # optional, auto-allocated if None
    username="socks_user",       # optional, SOCKS5 auth username
    password="socks_pass",       # optional, SOCKS5 auth password
    allow_manage_connector=True  # optional, allow client connector management
)
print(f"Token: {result.token}, Port: {result.port}")

# Add connector token  
connector_token = server.add_connector_token("connector_token", "reverse_token")

# Remove any token
success = server.remove_token("token_to_remove")
```

#### Running the Server

```python
# Asynchronous (recommended) - automatically waits for ready
async with server:
    print("Server is ready!")  # No need for async_wait_ready()
    # Server runs while in context

# Synchronous - requires manual wait
server.wait_ready()  # Blocks until ready
# Server runs in background
server.close()  # Clean shutdown

# Manual wait with timeout (only needed for synchronous usage)
server.wait_ready(timeout=30.0)  # 30 second timeout
await server.async_wait_ready(timeout="30s")  # Go duration string (rarely needed)
```

### Client Class

The `Client` class connects to WebSocket servers and provides SOCKS5 functionality.

```python
from linksocks import Client

# Create client with options
client = Client(
    token="your_token",          # Authentication token (required)
    ws_url="ws://localhost:8765", # WebSocket server URL
    reverse=False,               # Enable reverse proxy mode
    socks_host="127.0.0.1",      # SOCKS5 listen address (forward mode)
    socks_port=9870,             # SOCKS5 listen port (forward mode)
    socks_username="user",       # SOCKS5 auth username
    socks_password="pass",       # SOCKS5 auth password
    socks_wait_server=True,      # Wait for server before starting SOCKS5
    reconnect=True,              # Auto-reconnect on disconnect
    reconnect_delay=5.0,         # Reconnect delay (seconds)
    buffer_size=32768,           # Buffer size for data transfer
    channel_timeout=30.0,        # WebSocket channel timeout
    connect_timeout=10.0,        # Connection timeout
    threads=4,                   # Number of processing threads
    fast_open=False,             # Enable fast open optimization
    upstream_proxy="socks5://proxy:1080",  # Upstream proxy
    upstream_username="proxy_user",        # Upstream proxy username
    upstream_password="proxy_pass",        # Upstream proxy password
    no_env_proxy=False           # Ignore proxy environment variables
)
```

#### Running the Client

```python
# Asynchronous (recommended) - automatically waits for ready
async with client:
    print(f"Client ready! SOCKS5 port: {client.socks_port}")
    print(f"Connected: {client.is_connected}")
    # Client runs while in context

# Synchronous - requires manual wait
client.wait_ready()
print(f"Connected: {client.is_connected}")
client.close()  # Clean shutdown
```

#### Connector Management (Reverse Mode)

```python
# Add connector token (reverse mode only)
connector_token = client.add_connector("my_connector")  # or auto-generate
connector_token = await client.async_add_connector(None)  # async version
```

### Logging

```python
import logging
from linksocks import set_log_level

# Set global log level
set_log_level(logging.DEBUG)
set_log_level("INFO")  # String format

# Use custom logger
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)

server = Server(logger=logger)
client = Client("token", logger=logger)
```

## Advanced Examples

### Agent Proxy with Connector Management

```python
import asyncio
from linksocks import Server, Client

async def agent_proxy():
    # Server with connector autonomy enabled
    async with Server(ws_port=8765) as server:
        result = server.add_reverse_token(allow_manage_connector=True)
        print(f"🔑 Provider token: {result.token}")
        print(f"🌐 SOCKS5 proxy will be available on: 127.0.0.1:{result.port}")
        
        # Provider client (provides network access)
        async with Client(result.token, ws_url="ws://localhost:8765", reverse=True, no_env_proxy=True) as provider:
            print("✅ Agent proxy server and provider ready!")
            
            # Provider can manage its own connectors
            connector_token = await provider.async_add_connector("my_connector")
            print(f"🔑 Connector token: {connector_token}")
            
            # Now external connectors can use this token
            print(f"🔧 Start connector: linksocks connector -t {connector_token} -u ws://localhost:8765 -p 1180")
            
            await asyncio.sleep(3600)

asyncio.run(agent_proxy())
```

### Error Handling and Monitoring

```python
import asyncio
import logging
from linksocks import Client

async def robust_client():
    logger = logging.getLogger("robust_client")
    
    client = Client(
        "your_token",
        ws_url="ws://server:8765",
        reconnect=True,
        reconnect_delay=5.0,
        no_env_proxy=True,
        logger=logger
    )
    
    try:
        async with client:
            logger.info("✅ Client connected successfully")
            
            # Monitor connection status
            while True:
                if not client.is_connected:
                    logger.warning("⚠️  Connection lost, reconnecting...")
                    
                await asyncio.sleep(5)
                    
    except asyncio.TimeoutError:
        logger.error("❌ Connection timeout after 30 seconds")
    except Exception as e:
        logger.error(f"❌ Client error: {e}")
    finally:
        logger.info("🔄 Client shutting down")

asyncio.run(robust_client())
```

### HTTP API Integration

```python
import asyncio
import aiohttp
from linksocks import Server

async def api_server_example():
    # Start server with API enabled
    server = Server(ws_port=8765, api_key="secret_api_key")
    
    async with server:
        print("✅ Server with API ready!")
        
        # Use HTTP API to manage tokens
        async with aiohttp.ClientSession() as session:
            headers = {"X-API-Key": "secret_api_key"}
            
            # Add forward token via API
            async with session.post(
                "http://localhost:8765/api/token",
                headers=headers,
                json={"type": "forward", "token": "api_token"}
            ) as resp:
                result = await resp.json()
                print(f"📝 Added token via API: {result}")
            
            # Get server status
            async with session.get(
                "http://localhost:8765/api/status",
                headers=headers
            ) as resp:
                status = await resp.json()
                print(f"📊 Server status: {status}")
        
        await asyncio.sleep(3600)

asyncio.run(api_server_example())
```

## Type Hints

The package includes comprehensive type hints for better IDE support:

```python
from typing import Optional
from linksocks import Server, Client, ReverseTokenResult

def create_proxy_pair(token: str, port: Optional[int] = None) -> tuple[Server, Client]:
    server = Server(ws_port=8765)
    server.add_forward_token(token)
    
    client = Client(token, ws_url="ws://localhost:8765", socks_port=port or 9870, no_env_proxy=True)
    return server, client

# ReverseTokenResult is a dataclass
server = Server(ws_port=8765)
result: ReverseTokenResult = server.add_reverse_token()
print(f"Token: {result.token}, Port: {result.port}")
```

## Comparison with CLI Tool

| Feature | Python Bindings | Go CLI Tool |
|---------|-----------------|-------------|
| **Integration** | Library for Python apps | Standalone binary |
| **API Style** | Object-oriented, async/sync | Command-line flags |
| **Use Cases** | Embedded in applications | Quick setup, scripting |
| **Performance** | Same (uses Go backend) | Same |
| **Features** | Full feature parity | Full feature parity |

## Troubleshooting

### Common Issues

1. **Import Error**: Make sure Go 1.19+ is installed when building from source
2. **Connection Refused**: Check that server is running and ports are correct
3. **Authentication Failed**: Verify tokens match between server and client
4. **Port Already in Use**: Choose different ports or check for existing processes

### Debug Logging

```python
import logging
from linksocks import set_log_level

# Enable debug logging
set_log_level(logging.DEBUG)

# Or use environment variable
import os
os.environ["LINKSOCKS_LOG_LEVEL"] = "DEBUG"
```

### Performance Tuning

```python
# Increase buffer size for high-throughput scenarios
server = Server(buffer_size=65536)
client = Client("token", buffer_size=65536, threads=8)

# Enable fast open for lower latency
server = Server(fast_open=True)
client = Client("token", fast_open=True)
```

## Contributing

We welcome contributions! Please see the main [LinkSocks repository](https://github.com/linksocks/linksocks) for contribution guidelines.

## License

This project is licensed under the MIT License.

## Links

- 📚 [Full Documentation](https://linksocks.github.io/linksocks/)
- 🐛 [Issue Tracker](https://github.com/linksocks/linksocks/issues)
- 💬 [Discussions](https://github.com/linksocks/linksocks/discussions)
- 📦 [PyPI Package](https://pypi.org/project/linksocks/)
- 🐳 [Docker Hub](https://hub.docker.com/r/jackzzs/linksocks)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/linksocks/linksocks",
    "name": "linksocks",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "socks proxy websocket network tunneling firewall bypass load-balancing go bindings",
    "author": "jackzzs",
    "author_email": "jackzzs@outlook.com",
    "download_url": "https://files.pythonhosted.org/packages/a2/70/58a11fbf8267a2f39830520f2f232869de267751956ae45e41c8edff3cb1/linksocks-3.0.13.tar.gz",
    "platform": "any",
    "description": "# LinkSocks Python Bindings\n\n[![PyPI version](https://badge.fury.io/py/linksocks.svg)](https://badge.fury.io/py/linksocks)\n[![Python versions](https://img.shields.io/pypi/pyversions/linksocks.svg)](https://pypi.org/project/linksocks/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nPython bindings for LinkSocks - a SOCKS5 over WebSocket proxy tool.\n\n## Overview\n\nLinkSocks is a SOCKS proxy implementation over WebSocket protocol that allows you to securely expose SOCKS proxy services under Web Application Firewall (WAF) protection. This package provides Python bindings for the Go implementation.\n\n### Key Features\n\n- \ud83d\udd04 **Forward & Reverse Proxy**: Support both forward and reverse SOCKS5 proxy modes\n- \ud83c\udf10 **WebSocket Transport**: Works under WAF protection using standard WebSocket connections\n- \u2696\ufe0f **Load Balancing**: Round-robin load balancing for reverse proxy with multiple clients\n- \ud83d\udd10 **Authentication**: SOCKS5 proxy authentication and secure token-based WebSocket authentication\n- \ud83c\udf0d **Protocol Support**: Full IPv6 over SOCKS5 and UDP over SOCKS5 support\n- \ud83d\udc0d **Pythonic API**: Both synchronous and asynchronous APIs with context manager support\n\n## Installation\n\n### Using pip (Recommended)\n\n```bash\npip install linksocks\n```\n\n### Development Installation\n\n```bash\ngit clone https://github.com/linksocks/linksocks.git\ncd linksocks/_bindings/python\npip install -e .\n```\n\n### Requirements\n\n- Python 3.8 or later\n- Go 1.19 or later (for building from source)\n\n## Quick Start\n\n### Forward Proxy Example\n\n```python\nimport asyncio\nfrom linksocks import Server, Client\n\nasync def main():\n    # Create server and client with async context managers\n    async with Server(ws_port=8765) as server:\n        # Add forward token asynchronously\n        token = await server.async_add_forward_token()\n        \n        async with Client(token, ws_url=\"ws://localhost:8765\", socks_port=9870, no_env_proxy=True) as client:\n            print(\"\u2705 Forward proxy ready!\")\n            print(\"\ud83c\udf10 SOCKS5 proxy: 127.0.0.1:9870\")\n            print(\"\ud83d\udd27 Test: curl --socks5 127.0.0.1:9870 http://httpbin.org/ip\")\n            \n            # Keep running\n            await asyncio.sleep(3600)\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n### Reverse Proxy Example\n\n```python\nimport asyncio\nfrom linksocks import Server, Client\n\nasync def main():\n    # Create server and client with async context managers\n    async with Server(ws_port=8765) as server:\n        # Add reverse token (port is auto-allocated)\n        result = server.add_reverse_token()\n        print(f\"\ud83d\udd11 Reverse token: {result.token}\")\n        print(f\"\ud83c\udf10 SOCKS5 proxy will be available on: 127.0.0.1:{result.port}\")\n        \n        # Create client in reverse mode\n        async with Client(result.token, ws_url=\"ws://localhost:8765\", reverse=True, no_env_proxy=True) as client:\n            print(\"\u2705 Reverse proxy ready!\")\n            print(f\"\ud83d\udd27 Test: curl --socks5 127.0.0.1:{result.port} http://httpbin.org/ip\")\n            \n            # Keep running\n            await asyncio.sleep(3600)\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n## API Reference\n\n### Server Class\n\nThe `Server` class manages WebSocket connections and provides SOCKS5 proxy functionality.\n\n```python\nfrom linksocks import Server\n\n# Create server with options\nserver = Server(\n    ws_host=\"0.0.0.0\",           # WebSocket listen address\n    ws_port=8765,                # WebSocket listen port  \n    socks_host=\"127.0.0.1\",      # SOCKS5 listen address (reverse mode)\n    buffer_size=32768,           # Buffer size for data transfer\n    api_key=\"your_api_key\",      # Enable HTTP API\n    channel_timeout=30.0,        # WebSocket channel timeout (seconds)\n    connect_timeout=10.0,        # Connection timeout (seconds)\n    fast_open=False,             # Enable fast open optimization\n    upstream_proxy=\"socks5://proxy:1080\",  # Upstream proxy\n    upstream_username=\"user\",    # Upstream proxy username\n    upstream_password=\"pass\"     # Upstream proxy password\n)\n```\n\n#### Token Management\n\n```python\n# Add forward proxy token (synchronous)\ntoken = server.add_forward_token(\"custom_token\")  # or auto-generate with None\n\n# Add forward proxy token (asynchronous - recommended)\ntoken = await server.async_add_forward_token(\"custom_token\")\n\n# Add reverse proxy token\nresult = server.add_reverse_token(\n    token=\"custom_token\",        # optional, auto-generated if None\n    port=9870,                   # optional, auto-allocated if None\n    username=\"socks_user\",       # optional, SOCKS5 auth username\n    password=\"socks_pass\",       # optional, SOCKS5 auth password\n    allow_manage_connector=True  # optional, allow client connector management\n)\nprint(f\"Token: {result.token}, Port: {result.port}\")\n\n# Add connector token  \nconnector_token = server.add_connector_token(\"connector_token\", \"reverse_token\")\n\n# Remove any token\nsuccess = server.remove_token(\"token_to_remove\")\n```\n\n#### Running the Server\n\n```python\n# Asynchronous (recommended) - automatically waits for ready\nasync with server:\n    print(\"Server is ready!\")  # No need for async_wait_ready()\n    # Server runs while in context\n\n# Synchronous - requires manual wait\nserver.wait_ready()  # Blocks until ready\n# Server runs in background\nserver.close()  # Clean shutdown\n\n# Manual wait with timeout (only needed for synchronous usage)\nserver.wait_ready(timeout=30.0)  # 30 second timeout\nawait server.async_wait_ready(timeout=\"30s\")  # Go duration string (rarely needed)\n```\n\n### Client Class\n\nThe `Client` class connects to WebSocket servers and provides SOCKS5 functionality.\n\n```python\nfrom linksocks import Client\n\n# Create client with options\nclient = Client(\n    token=\"your_token\",          # Authentication token (required)\n    ws_url=\"ws://localhost:8765\", # WebSocket server URL\n    reverse=False,               # Enable reverse proxy mode\n    socks_host=\"127.0.0.1\",      # SOCKS5 listen address (forward mode)\n    socks_port=9870,             # SOCKS5 listen port (forward mode)\n    socks_username=\"user\",       # SOCKS5 auth username\n    socks_password=\"pass\",       # SOCKS5 auth password\n    socks_wait_server=True,      # Wait for server before starting SOCKS5\n    reconnect=True,              # Auto-reconnect on disconnect\n    reconnect_delay=5.0,         # Reconnect delay (seconds)\n    buffer_size=32768,           # Buffer size for data transfer\n    channel_timeout=30.0,        # WebSocket channel timeout\n    connect_timeout=10.0,        # Connection timeout\n    threads=4,                   # Number of processing threads\n    fast_open=False,             # Enable fast open optimization\n    upstream_proxy=\"socks5://proxy:1080\",  # Upstream proxy\n    upstream_username=\"proxy_user\",        # Upstream proxy username\n    upstream_password=\"proxy_pass\",        # Upstream proxy password\n    no_env_proxy=False           # Ignore proxy environment variables\n)\n```\n\n#### Running the Client\n\n```python\n# Asynchronous (recommended) - automatically waits for ready\nasync with client:\n    print(f\"Client ready! SOCKS5 port: {client.socks_port}\")\n    print(f\"Connected: {client.is_connected}\")\n    # Client runs while in context\n\n# Synchronous - requires manual wait\nclient.wait_ready()\nprint(f\"Connected: {client.is_connected}\")\nclient.close()  # Clean shutdown\n```\n\n#### Connector Management (Reverse Mode)\n\n```python\n# Add connector token (reverse mode only)\nconnector_token = client.add_connector(\"my_connector\")  # or auto-generate\nconnector_token = await client.async_add_connector(None)  # async version\n```\n\n### Logging\n\n```python\nimport logging\nfrom linksocks import set_log_level\n\n# Set global log level\nset_log_level(logging.DEBUG)\nset_log_level(\"INFO\")  # String format\n\n# Use custom logger\nlogger = logging.getLogger(\"my_app\")\nlogger.setLevel(logging.DEBUG)\nhandler = logging.StreamHandler()\nhandler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))\nlogger.addHandler(handler)\n\nserver = Server(logger=logger)\nclient = Client(\"token\", logger=logger)\n```\n\n## Advanced Examples\n\n### Agent Proxy with Connector Management\n\n```python\nimport asyncio\nfrom linksocks import Server, Client\n\nasync def agent_proxy():\n    # Server with connector autonomy enabled\n    async with Server(ws_port=8765) as server:\n        result = server.add_reverse_token(allow_manage_connector=True)\n        print(f\"\ud83d\udd11 Provider token: {result.token}\")\n        print(f\"\ud83c\udf10 SOCKS5 proxy will be available on: 127.0.0.1:{result.port}\")\n        \n        # Provider client (provides network access)\n        async with Client(result.token, ws_url=\"ws://localhost:8765\", reverse=True, no_env_proxy=True) as provider:\n            print(\"\u2705 Agent proxy server and provider ready!\")\n            \n            # Provider can manage its own connectors\n            connector_token = await provider.async_add_connector(\"my_connector\")\n            print(f\"\ud83d\udd11 Connector token: {connector_token}\")\n            \n            # Now external connectors can use this token\n            print(f\"\ud83d\udd27 Start connector: linksocks connector -t {connector_token} -u ws://localhost:8765 -p 1180\")\n            \n            await asyncio.sleep(3600)\n\nasyncio.run(agent_proxy())\n```\n\n### Error Handling and Monitoring\n\n```python\nimport asyncio\nimport logging\nfrom linksocks import Client\n\nasync def robust_client():\n    logger = logging.getLogger(\"robust_client\")\n    \n    client = Client(\n        \"your_token\",\n        ws_url=\"ws://server:8765\",\n        reconnect=True,\n        reconnect_delay=5.0,\n        no_env_proxy=True,\n        logger=logger\n    )\n    \n    try:\n        async with client:\n            logger.info(\"\u2705 Client connected successfully\")\n            \n            # Monitor connection status\n            while True:\n                if not client.is_connected:\n                    logger.warning(\"\u26a0\ufe0f  Connection lost, reconnecting...\")\n                    \n                await asyncio.sleep(5)\n                    \n    except asyncio.TimeoutError:\n        logger.error(\"\u274c Connection timeout after 30 seconds\")\n    except Exception as e:\n        logger.error(f\"\u274c Client error: {e}\")\n    finally:\n        logger.info(\"\ud83d\udd04 Client shutting down\")\n\nasyncio.run(robust_client())\n```\n\n### HTTP API Integration\n\n```python\nimport asyncio\nimport aiohttp\nfrom linksocks import Server\n\nasync def api_server_example():\n    # Start server with API enabled\n    server = Server(ws_port=8765, api_key=\"secret_api_key\")\n    \n    async with server:\n        print(\"\u2705 Server with API ready!\")\n        \n        # Use HTTP API to manage tokens\n        async with aiohttp.ClientSession() as session:\n            headers = {\"X-API-Key\": \"secret_api_key\"}\n            \n            # Add forward token via API\n            async with session.post(\n                \"http://localhost:8765/api/token\",\n                headers=headers,\n                json={\"type\": \"forward\", \"token\": \"api_token\"}\n            ) as resp:\n                result = await resp.json()\n                print(f\"\ud83d\udcdd Added token via API: {result}\")\n            \n            # Get server status\n            async with session.get(\n                \"http://localhost:8765/api/status\",\n                headers=headers\n            ) as resp:\n                status = await resp.json()\n                print(f\"\ud83d\udcca Server status: {status}\")\n        \n        await asyncio.sleep(3600)\n\nasyncio.run(api_server_example())\n```\n\n## Type Hints\n\nThe package includes comprehensive type hints for better IDE support:\n\n```python\nfrom typing import Optional\nfrom linksocks import Server, Client, ReverseTokenResult\n\ndef create_proxy_pair(token: str, port: Optional[int] = None) -> tuple[Server, Client]:\n    server = Server(ws_port=8765)\n    server.add_forward_token(token)\n    \n    client = Client(token, ws_url=\"ws://localhost:8765\", socks_port=port or 9870, no_env_proxy=True)\n    return server, client\n\n# ReverseTokenResult is a dataclass\nserver = Server(ws_port=8765)\nresult: ReverseTokenResult = server.add_reverse_token()\nprint(f\"Token: {result.token}, Port: {result.port}\")\n```\n\n## Comparison with CLI Tool\n\n| Feature | Python Bindings | Go CLI Tool |\n|---------|-----------------|-------------|\n| **Integration** | Library for Python apps | Standalone binary |\n| **API Style** | Object-oriented, async/sync | Command-line flags |\n| **Use Cases** | Embedded in applications | Quick setup, scripting |\n| **Performance** | Same (uses Go backend) | Same |\n| **Features** | Full feature parity | Full feature parity |\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Import Error**: Make sure Go 1.19+ is installed when building from source\n2. **Connection Refused**: Check that server is running and ports are correct\n3. **Authentication Failed**: Verify tokens match between server and client\n4. **Port Already in Use**: Choose different ports or check for existing processes\n\n### Debug Logging\n\n```python\nimport logging\nfrom linksocks import set_log_level\n\n# Enable debug logging\nset_log_level(logging.DEBUG)\n\n# Or use environment variable\nimport os\nos.environ[\"LINKSOCKS_LOG_LEVEL\"] = \"DEBUG\"\n```\n\n### Performance Tuning\n\n```python\n# Increase buffer size for high-throughput scenarios\nserver = Server(buffer_size=65536)\nclient = Client(\"token\", buffer_size=65536, threads=8)\n\n# Enable fast open for lower latency\nserver = Server(fast_open=True)\nclient = Client(\"token\", fast_open=True)\n```\n\n## Contributing\n\nWe welcome contributions! Please see the main [LinkSocks repository](https://github.com/linksocks/linksocks) for contribution guidelines.\n\n## License\n\nThis project is licensed under the MIT License.\n\n## Links\n\n- \ud83d\udcda [Full Documentation](https://linksocks.github.io/linksocks/)\n- \ud83d\udc1b [Issue Tracker](https://github.com/linksocks/linksocks/issues)\n- \ud83d\udcac [Discussions](https://github.com/linksocks/linksocks/discussions)\n- \ud83d\udce6 [PyPI Package](https://pypi.org/project/linksocks/)\n- \ud83d\udc33 [Docker Hub](https://hub.docker.com/r/jackzzs/linksocks)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python bindings for LinkSocks - SOCKS proxy over WebSocket",
    "version": "3.0.13",
    "project_urls": {
        "Bug Reports": "https://github.com/linksocks/linksocks/issues",
        "Changelog": "https://github.com/linksocks/linksocks/releases",
        "Documentation": "https://github.com/linksocks/linksocks#readme",
        "Homepage": "https://github.com/linksocks/linksocks",
        "Source": "https://github.com/linksocks/linksocks"
    },
    "split_keywords": [
        "socks",
        "proxy",
        "websocket",
        "network",
        "tunneling",
        "firewall",
        "bypass",
        "load-balancing",
        "go",
        "bindings"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2979becb6798cfe7e2d97f0793dae09659dbf9e12b93aac361f70a51d35a57f5",
                "md5": "783f7aae8b370a2a5e69cef245e2af20",
                "sha256": "51041c8612c577e79c0ad125a301f21c0a6f7cb3d1d6a6395486b86fe2d1c41d"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp310-cp310-macosx_13_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "783f7aae8b370a2a5e69cef245e2af20",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 3789520,
            "upload_time": "2025-08-19T19:48:08",
            "upload_time_iso_8601": "2025-08-19T19:48:08.059007Z",
            "url": "https://files.pythonhosted.org/packages/29/79/becb6798cfe7e2d97f0793dae09659dbf9e12b93aac361f70a51d35a57f5/linksocks-3.0.13-cp310-cp310-macosx_13_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "90423ccf6c13853d8dcf4f78cb4a6d11d8d59198a7c99f2aa2b8eb8ed6269014",
                "md5": "f88784209fc24bb749f2ebb435523510",
                "sha256": "5c3fe74853941449100db80c87b922f418fad7155c86c2c044fd5ecdcbdc6e1b"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp310-cp310-macosx_14_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "f88784209fc24bb749f2ebb435523510",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 3567926,
            "upload_time": "2025-08-19T19:48:10",
            "upload_time_iso_8601": "2025-08-19T19:48:10.042512Z",
            "url": "https://files.pythonhosted.org/packages/90/42/3ccf6c13853d8dcf4f78cb4a6d11d8d59198a7c99f2aa2b8eb8ed6269014/linksocks-3.0.13-cp310-cp310-macosx_14_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4410bf41b6e9ebdc13ae2106edbfeb2477a1d29faa5e206ddd206ab026a3e36e",
                "md5": "dbe66fb0ad2a9fff990ca89a092ec661",
                "sha256": "26fdd1c6925ab7facd9cf7fa3bef737dff03e937a2628517eb869803f7c357b1"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dbe66fb0ad2a9fff990ca89a092ec661",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 6820695,
            "upload_time": "2025-08-19T19:48:11",
            "upload_time_iso_8601": "2025-08-19T19:48:11.443834Z",
            "url": "https://files.pythonhosted.org/packages/44/10/bf41b6e9ebdc13ae2106edbfeb2477a1d29faa5e206ddd206ab026a3e36e/linksocks-3.0.13-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e04736bb8cb6a45f3e4f75d5de14f2495abbb6e1e8afe2e73b2c4d28582c5265",
                "md5": "1a2cdb44e6bcce359113e7a5bcbfc739",
                "sha256": "7805bc8c8b56d57ea842e9274eb1b455c6b0d2496b4489ce9c493d7edfab8f14"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "1a2cdb44e6bcce359113e7a5bcbfc739",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 7666729,
            "upload_time": "2025-08-19T19:48:13",
            "upload_time_iso_8601": "2025-08-19T19:48:13.001412Z",
            "url": "https://files.pythonhosted.org/packages/e0/47/36bb8cb6a45f3e4f75d5de14f2495abbb6e1e8afe2e73b2c4d28582c5265/linksocks-3.0.13-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2c99d0367893011d4b3fe87e91eca637bb627c4dc8343cacd355bb3f5ab59b06",
                "md5": "c0bd1980b910b1a071b8218bbca5faed",
                "sha256": "4536faaae1eefda97d1ad478b61ba4bf3a44fc6e9f314058768daca1aada777e"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp311-cp311-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "c0bd1980b910b1a071b8218bbca5faed",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 3791092,
            "upload_time": "2025-08-19T19:48:14",
            "upload_time_iso_8601": "2025-08-19T19:48:14.561411Z",
            "url": "https://files.pythonhosted.org/packages/2c/99/d0367893011d4b3fe87e91eca637bb627c4dc8343cacd355bb3f5ab59b06/linksocks-3.0.13-cp311-cp311-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3c1cf5e2b35cbe3322d01e5b80aad55f65a4531a11473e1ca0a4b0c89ecb2fdd",
                "md5": "ef7681b37c95427d24497d850022d983",
                "sha256": "ace65d8167e487012a313979df0cbbc2e053442eb748dde03c647d60610d7d3f"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp311-cp311-macosx_14_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "ef7681b37c95427d24497d850022d983",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 3571161,
            "upload_time": "2025-08-19T19:48:15",
            "upload_time_iso_8601": "2025-08-19T19:48:15.941330Z",
            "url": "https://files.pythonhosted.org/packages/3c/1c/f5e2b35cbe3322d01e5b80aad55f65a4531a11473e1ca0a4b0c89ecb2fdd/linksocks-3.0.13-cp311-cp311-macosx_14_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "94d1459ddd6dacd7ecb9cc84d9dee9bdeba43be59702d33c0889cdbf70f5d715",
                "md5": "e9efa0c1481ad7810403673c5e86bfca",
                "sha256": "e8e12d94257dba18bb1ce4eb027c26be70f477f2d9be9ef97f16aa9b1f951914"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e9efa0c1481ad7810403673c5e86bfca",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 6822824,
            "upload_time": "2025-08-19T19:48:17",
            "upload_time_iso_8601": "2025-08-19T19:48:17.883675Z",
            "url": "https://files.pythonhosted.org/packages/94/d1/459ddd6dacd7ecb9cc84d9dee9bdeba43be59702d33c0889cdbf70f5d715/linksocks-3.0.13-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "55524155e9af6291fdc10c3cfa7923cf094613a00dfdd88b3ac65e0bcecaccd9",
                "md5": "3a7130e93d689cced38b0a868d183d02",
                "sha256": "bae2b79d1d4a68864af8a626a21c534165c22fda1839b3b448639e56f6da0b56"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3a7130e93d689cced38b0a868d183d02",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 7667612,
            "upload_time": "2025-08-19T19:48:19",
            "upload_time_iso_8601": "2025-08-19T19:48:19.408177Z",
            "url": "https://files.pythonhosted.org/packages/55/52/4155e9af6291fdc10c3cfa7923cf094613a00dfdd88b3ac65e0bcecaccd9/linksocks-3.0.13-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0bb2c810ec19891b3894c2a85f3201d2c111c719c9654f67452ed782c4c7a4bb",
                "md5": "5c47d3e523483c166f27e3dc69bcc975",
                "sha256": "44e744fccf07bfce5eaeb61993831b2b5c54dfb2384420173ba86b201ea481b9"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp312-cp312-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "5c47d3e523483c166f27e3dc69bcc975",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 3790770,
            "upload_time": "2025-08-19T19:48:21",
            "upload_time_iso_8601": "2025-08-19T19:48:21.264103Z",
            "url": "https://files.pythonhosted.org/packages/0b/b2/c810ec19891b3894c2a85f3201d2c111c719c9654f67452ed782c4c7a4bb/linksocks-3.0.13-cp312-cp312-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f024b1f0dcdbe5be4fae6d34703b1d68bbe2f76d9228ebaee1e5c728d269a197",
                "md5": "f8c426e2fb2bd909bc7c5ccdef8602b8",
                "sha256": "99d9d09e64fad62252a768f5bb083cc7ab9733b0c587071a1e2f1adb3e2015df"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp312-cp312-macosx_14_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "f8c426e2fb2bd909bc7c5ccdef8602b8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 3569901,
            "upload_time": "2025-08-19T19:48:22",
            "upload_time_iso_8601": "2025-08-19T19:48:22.998236Z",
            "url": "https://files.pythonhosted.org/packages/f0/24/b1f0dcdbe5be4fae6d34703b1d68bbe2f76d9228ebaee1e5c728d269a197/linksocks-3.0.13-cp312-cp312-macosx_14_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5217262f1130e71ef12d421e639df2aad7eb4ad6123e769fb32a7485e93fbb1c",
                "md5": "92a22e6d090bd414aeb598f634101340",
                "sha256": "b1cf9923fce40e36c79f99e0f9f5b54e3676ca96b6c7ff6697083de4d50aeb4c"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "92a22e6d090bd414aeb598f634101340",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 6822647,
            "upload_time": "2025-08-19T19:48:24",
            "upload_time_iso_8601": "2025-08-19T19:48:24.470801Z",
            "url": "https://files.pythonhosted.org/packages/52/17/262f1130e71ef12d421e639df2aad7eb4ad6123e769fb32a7485e93fbb1c/linksocks-3.0.13-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3bc8b36d6083beb6ddb7dfaf2d00b57e9b3db850e19b3aff6d0207be47c3f746",
                "md5": "696768b4ae7421a40e6d5ee81927fc0d",
                "sha256": "39e5e320e712d6bc321d88537b9efdd8801e970fa20075ffffffeba8a0402977"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "696768b4ae7421a40e6d5ee81927fc0d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 7667439,
            "upload_time": "2025-08-19T19:48:26",
            "upload_time_iso_8601": "2025-08-19T19:48:26.170989Z",
            "url": "https://files.pythonhosted.org/packages/3b/c8/b36d6083beb6ddb7dfaf2d00b57e9b3db850e19b3aff6d0207be47c3f746/linksocks-3.0.13-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "59faed8af6b202f11dcb5d868363c6e34337d5ba9f408a0897f3da80f902677b",
                "md5": "62735a4328d776b4bc2c4da7f91d95a3",
                "sha256": "55312d1a331c150b128bdcc8a51cffd8937007ee7514edf9590f2b498f407875"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp313-cp313-macosx_13_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "62735a4328d776b4bc2c4da7f91d95a3",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 3790111,
            "upload_time": "2025-08-19T19:48:27",
            "upload_time_iso_8601": "2025-08-19T19:48:27.644158Z",
            "url": "https://files.pythonhosted.org/packages/59/fa/ed8af6b202f11dcb5d868363c6e34337d5ba9f408a0897f3da80f902677b/linksocks-3.0.13-cp313-cp313-macosx_13_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "880058c15333ecd6a449c3545893e741970f611eaf87a709589b55ff5f4abceb",
                "md5": "6de7ee4fdde522adfb407c2713e66eef",
                "sha256": "d303537d4ca6dc4809efbefb54fd4c81c9971ee9e21d3f60864d6aceafb64d80"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp313-cp313-macosx_14_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "6de7ee4fdde522adfb407c2713e66eef",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 3569260,
            "upload_time": "2025-08-19T19:48:29",
            "upload_time_iso_8601": "2025-08-19T19:48:29.502820Z",
            "url": "https://files.pythonhosted.org/packages/88/00/58c15333ecd6a449c3545893e741970f611eaf87a709589b55ff5f4abceb/linksocks-3.0.13-cp313-cp313-macosx_14_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "def9f3a1945db1cd20f28e9899e4eb0e73484f27b085113a11c07289b8d42ab3",
                "md5": "124b4a2efc543ae156ab482d87a866f0",
                "sha256": "0e615e682247b3bb2507d92c31bb9e393927108fb19c69da1eeca21dfcb0f28d"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "124b4a2efc543ae156ab482d87a866f0",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 6820386,
            "upload_time": "2025-08-19T19:48:30",
            "upload_time_iso_8601": "2025-08-19T19:48:30.921645Z",
            "url": "https://files.pythonhosted.org/packages/de/f9/f3a1945db1cd20f28e9899e4eb0e73484f27b085113a11c07289b8d42ab3/linksocks-3.0.13-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "15c9420956beb37ef160eb832c064e9c71575c33f40854f2a51cfda647cd6319",
                "md5": "a7b2f24202d94bb38ea09b3bfa193bc2",
                "sha256": "4dbe2c4c418d557680d7a5ac7bd0369c07965d4fb81a76dcdff0af1f27bf4820"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp39-cp39-macosx_13_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a7b2f24202d94bb38ea09b3bfa193bc2",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 3788849,
            "upload_time": "2025-08-19T19:48:32",
            "upload_time_iso_8601": "2025-08-19T19:48:32.510602Z",
            "url": "https://files.pythonhosted.org/packages/15/c9/420956beb37ef160eb832c064e9c71575c33f40854f2a51cfda647cd6319/linksocks-3.0.13-cp39-cp39-macosx_13_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "490f11a559454725561d3d1a454e18bf41714772af64f3c472e7af8f1e6524bf",
                "md5": "ecd1f4be3b12a49dd3502f69365c47e7",
                "sha256": "0c2741249c7ac359265103b807950b05ce06c2b2a6b414213d9c5f7f1b2a9df3"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp39-cp39-macosx_14_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "ecd1f4be3b12a49dd3502f69365c47e7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 3568485,
            "upload_time": "2025-08-19T19:48:34",
            "upload_time_iso_8601": "2025-08-19T19:48:34.484156Z",
            "url": "https://files.pythonhosted.org/packages/49/0f/11a559454725561d3d1a454e18bf41714772af64f3c472e7af8f1e6524bf/linksocks-3.0.13-cp39-cp39-macosx_14_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f9dad9bc1283c0250560750c7a5c1aab1f6b30c81d794929cb3d7f9489aae770",
                "md5": "6833460f44323d69733e0708a9246a77",
                "sha256": "3b2fcd456f405cf4c71a337cd5d42513558c9970592ff27d25b43743ed7eb90e"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6833460f44323d69733e0708a9246a77",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 6820489,
            "upload_time": "2025-08-19T19:48:36",
            "upload_time_iso_8601": "2025-08-19T19:48:36.353569Z",
            "url": "https://files.pythonhosted.org/packages/f9/da/d9bc1283c0250560750c7a5c1aab1f6b30c81d794929cb3d7f9489aae770/linksocks-3.0.13-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1c81fd192bdaa7418be477df3a2c2c2e55b58f6b2c6fbf229bd5ee650b6029ee",
                "md5": "0debe9730253a92a2c74566ab9f608a8",
                "sha256": "876be3a85c07f2f6af49857cfb7eb1252921f3150ad7606c8fd0d9360ffaa192"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0debe9730253a92a2c74566ab9f608a8",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 7665283,
            "upload_time": "2025-08-19T19:48:38",
            "upload_time_iso_8601": "2025-08-19T19:48:38.266396Z",
            "url": "https://files.pythonhosted.org/packages/1c/81/fd192bdaa7418be477df3a2c2c2e55b58f6b2c6fbf229bd5ee650b6029ee/linksocks-3.0.13-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a27058a11fbf8267a2f39830520f2f232869de267751956ae45e41c8edff3cb1",
                "md5": "20167a398a1012138f425aa4ac4bd1d9",
                "sha256": "f6f09047f6e90ab5d06ed51afb75a173040329369ee63fb71586ba1477ee77e5"
            },
            "downloads": -1,
            "filename": "linksocks-3.0.13.tar.gz",
            "has_sig": false,
            "md5_digest": "20167a398a1012138f425aa4ac4bd1d9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 88174,
            "upload_time": "2025-08-19T19:48:39",
            "upload_time_iso_8601": "2025-08-19T19:48:39.682923Z",
            "url": "https://files.pythonhosted.org/packages/a2/70/58a11fbf8267a2f39830520f2f232869de267751956ae45e41c8edff3cb1/linksocks-3.0.13.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-19 19:48:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "linksocks",
    "github_project": "linksocks",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "linksocks"
}
        
Elapsed time: 0.46106s