# LinkSocks Python Bindings
[](https://badge.fury.io/py/linksocks)
[](https://pypi.org/project/linksocks/)
[](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[](https://badge.fury.io/py/linksocks)\n[](https://pypi.org/project/linksocks/)\n[](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"
}