Skip to main content
https://travis-ci.org/ultrafunkamsterdam/aiosocks2.svg?branch=master https://coveralls.io/repos/github/ultrafunkamsterdam/aiosocks2/badge.svg?branch=master https://badge.fury.io/py/aiosocks2.svg

Dependencies

python 3.5+ aiohttp 2.3.2+

Features

  • Fixed original library to use in 2021 onwards

  • SOCKS4, SOCKS4a and SOCKS5 version

  • ProxyConnector for aiohttp

  • SOCKS “CONNECT” command

TODO

  • UDP associate

  • TCP port binding

Installation

You can install it using Pip:

pip install aiosocks2

If you want the latest development version, you can install it from source:

git clone git@github.com:ultrafunkamsterdam/aiosocks2.git
cd aiosocks2
python setup.py install

Usage

direct usage

import asyncio
import aiosocks2


async def connect():
  socks5_addr = aiosocks2.Socks5Addr('127.0.0.1', 1080)
  socks4_addr = aiosocks2.Socks4Addr('127.0.0.1', 1080)

  socks5_auth = aiosocks2.Socks5Auth('login', 'pwd')
  socks4_auth = aiosocks2.Socks4Auth('ident')

  dst = ('github.com', 80)

  # socks5 connect
  transport, protocol = await aiosocks2.create_connection(
      lambda: Protocol, proxy=socks5_addr, proxy_auth=socks5_auth, dst=dst)

  # socks4 connect
  transport, protocol = await aiosocks2.create_connection(
      lambda: Protocol, proxy=socks4_addr, proxy_auth=socks4_auth, dst=dst)

  # socks4 without auth and local domain name resolving
  transport, protocol = await aiosocks2.create_connection(
      lambda: Protocol, proxy=socks4_addr, proxy_auth=None, dst=dst, remote_resolve=False)

  # use socks protocol
  transport, protocol = await aiosocks2.create_connection(
      None, proxy=socks4_addr, proxy_auth=None, dst=dst)

if __name__ == '__main__':
  loop = asyncio.get_event_loop()
  loop.run_until_complete(connect())
  loop.close()

A wrapper for create_connection() returning a (reader, writer) pair

# StreamReader, StreamWriter
reader, writer = await aiosocks2.open_connection(
    proxy=socks5_addr, proxy_auth=socks5_auth, dst=dst, remote_resolve=True)

data = await reader.read(10)
writer.write('data')

error handling

SocksError is a base class for:
  • NoAcceptableAuthMethods

  • LoginAuthenticationFailed

  • InvalidServerVersion

  • InvalidServerReply

try:
  transport, protocol = await aiosocks2.create_connection(
      lambda: Protocol, proxy=socks5_addr, proxy_auth=socks5_auth, dst=dst)
except aiosocks2.SocksConnectionError:
  # connection error
except aiosocks2.LoginAuthenticationFailed:
  # auth failed
except aiosocks2.NoAcceptableAuthMethods:
  # All offered SOCKS5 authentication methods were rejected
except (aiosocks2.InvalidServerVersion, aiosocks2.InvalidServerReply):
  # something wrong
except aiosocks2.SocksError:
  # something other

or

try:
  transport, protocol = await aiosocks2.create_connection(
      lambda: Protocol, proxy=socks5_addr, proxy_auth=socks5_auth, dst=dst)
except aiosocks2.SocksConnectionError:
    # connection error
except aiosocks2.SocksError:
    # socks error

aiohttp usage

import asyncio
import aiohttp
import aiosocks2
from aiosocks2.connector import ProxyConnector, ProxyClientRequest


async def load_github_main():
  auth5 = aiosocks2.Socks5Auth('proxyuser1', password='pwd')
  auth4 = aiosocks2.Socks4Auth('proxyuser1')
  ba = aiohttp.BasicAuth('login')

  # remote resolve
  conn = ProxyConnector(remote_resolve=True)

  # or locale resolve
  conn = ProxyConnector(remote_resolve=False)

  try:
    with aiohttp.ClientSession(connector=conn, request_class=ProxyClientRequest) as session:
      # socks5 proxy
      async with session.get('http://github.com/', proxy='socks5://127.0.0.1:1080',
                             proxy_auth=auth5) as resp:
        if resp.status == 200:
          print(await resp.text())

      # socks4 proxy
      async with session.get('http://github.com/', proxy='socks4://127.0.0.1:1081',
                             proxy_auth=auth4) as resp:
        if resp.status == 200:
          print(await resp.text())

      # http proxy
      async with session.get('http://github.com/', proxy='http://127.0.0.1:8080',
                             proxy_auth=ba) as resp:
        if resp.status == 200:
          print(await resp.text())
  except aiohttp.ClientProxyConnectionError:
    # connection problem
  except aiohttp.ClientConnectorError:
    # ssl error, certificate error, etc
  except aiosocks2.SocksError:
    # communication problem


if __name__ == '__main__':
  loop = asyncio.get_event_loop()
  loop.run_until_complete(load_github_main())
  loop.close()

Release files for aiosocks2 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aiosocks2 0.3.0
File Size Uploaded
aiosocks2-0.3.0.tar.gz 11.4 kB Details

Release files / aiosocks2-0.3.0.tar.gz

Download URL aiosocks2-0.3.0.tar.gz
Size 11.4 kB
Tags Source
SHA-256 checksum
How to use checksums
16e51721a9deb5950b990e8777cf647276ec735d955e13731667c3319a6afa76
BLAKE2b-256 checksum
How to use checksums
88d72288bfa31836be4e5157b2b524b28bb6d2d7ca73ce8b55d8b95dc3778d29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/3.10.0 pkginfo/1.7.1 requests/2.23.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.5

Release history Release notifications | RSS feed

This release

0.3.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page