一个蟒蛇袜客户端模块。See https://github.com/anrov/pysocks for more information.

PySocks的Python项目详细描述


短袜

pysocks允许您通过socks和http代理服务器发送流量。它是一个现代化的分支,具有bug修复和额外功能。

作为插座模块的替代品。通过调用socket_object.set_proxy(),无缝地为任何socket对象配置socks代理

状态更新

我再也没有时间积极地做这个项目了。我很乐意接受深思熟虑的请求,并继续在这里和pypi上更新以响应prs,但除了版本冲突之外,我不会对自己进行任何更改。如果有人想把这个项目从我手里拿开,请给我发电子邮件或是制造一个问题。谢谢,


功能

  • 适用于Python2.7和3.4+的SOCKS代理客户端
  • TCP和UDP都受支持
  • 包括但不受支持或推荐的http代理客户端(您应该使用urllib2或requests自己的http代理接口)
  • 包含urllib2处理程序。pip install/setup.py install将自动安装sockshandler模块。

安装

pip install PySocks

或者下载tarball/git克隆和…

python setup.py install

它们将同时安装sockssockshandler模块。

或者,在您的项目中只包含socks.py


警告:pysocks/socksipy仅支持使用连接隧道的http代理。某些http代理可能无法使用此库。如果您希望使用http(而不是socks)代理,建议您改用http客户端的本地代理支持(proxiesdict表示requests,或urllib2.proxyhandler表示urllib2)。


用法

socks.socksocket

import socks

s = socks.socksocket() # Same API as socket.socket in the standard lib

s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default
# Or
s.set_proxy(socks.SOCKS4, "localhost", 4444)
# Or
s.set_proxy(socks.HTTP, "5.5.5.5", 8888)

# Can be treated identical to a regular socket object
s.connect(("www.somesite.com", 80))
s.sendall("GET / HTTP/1.1 ...")
print s.recv(4096)

MonkeyPatching

要使用单个默认代理修补整个标准库:

import urllib2
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "localhost")
socket.socket = socks.socksocket

urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy

请注意,MonkeyPatching可能不适用于所有标准模块或所有第三方模块,通常不建议使用。monkeypatching在python中通常是一种反模式。

urllib2处理程序

带有sockshandlerurllib2处理程序的示例用例。注意,您必须同时导入sockssocks handler,因为处理程序是它自己的模块,独立于pysocks。模块包含在PYPI包中。

import urllib2
import socks
from sockshandler import SocksiPyHandler

opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050))
print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy

原始Socksipy自述文件附在下面,经过修改以反映API更改。


短袜

一个python socks模块。

(c)2006年,丹·海姆。保留所有权利。

有关详细信息,请参见许可证文件。

什么是袜子代理?< /P>

SOCKS代理是TCP级别的代理服务器。换句话说,它的作用是 一条隧道,在不改变它的情况下,把所有通过它的交通都传送出去。 socks代理可以使用任何 使用TCP。

什么是袜子?< /P>

这个python模块允许您通过socks创建tcp连接 没有任何特别努力的代理。 它还支持通过socks5代理中继udp数据包。

代理兼容性

Socksipy与三种不同类型的代理兼容:

  1. Socks版本4(Socks4),包括Socks4a扩展。
  2. 袜子版本5(袜子5)。
  3. 支持使用connect方法进行隧道传输的http代理。
  4. < > >

    系统要求

    socksipy是用python编写的,可以在任何有python的平台上运行 解释器和TCP/IP支持。 这个模块已经用Python2.3测试过了,应该可以使用更高版本 也一样。

    安装

    只需将文件"socks.py"复制到python的lib/site packages目录, 你已经准备好出发了。[编者按:最好对pysocks使用python setup.py install

    用法

    第一级L用命令加载SOCKS模块:

    >>> import socks
    >>>
    

    socks模块提供一个名为socksocket的类,它是模块所有功能的基础。

    对象的初始化参数与普通套接字相同 对象以确保最大的兼容性,但是需要注意的是,socksocket仅在family为af_inet时才起作用,并且 类型为sock_streamsock_dgram。 通常,最好在没有参数的情况下初始化socksocket对象

    >>> s = socks.socksocket()
    >>>
    

    socksocket对象有一个非常类似于socket的接口(实际上 socksocket类是从socket派生的)还有一些额外的方法。 要选择要使用的代理服务器,请使用 语法为:

    set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]])
    

    参数说明:

    代理服务器类型-代理服务器的类型。这可能是三种可能性之一 选项:proxy_type_socks4proxy_type_socks5proxy_type_http对于socks4, socks5和http服务器。socks4socks5http都是别名。

    addr-代理服务器的IP地址或DNS名称。

    端口-代理服务器的端口。socks默认为1080,http默认为8080。

    rdns-这是一个布尔标志,用于修改有关dns解析的行为。 如果设置为true,则将在服务器上远程执行DNS解析。 如果设置为false,则将在本地执行dns解析。请注意 在socks4服务器实际使用协议扩展时,将其设置为true, 称为socks4a,可能不是所有服务器(socks5和http服务器)都支持它 始终支持DNS)。默认值为true。

    用户名-对于socks5服务器,这允许简单的用户名/密码身份验证 在服务器上。对于socks4服务器,此参数将作为用户标识发送。 如果正在使用http服务器,则忽略此参数。如果没有提供, 将不使用身份验证(服务器可能接受未经身份验证的请求)。

    password-此参数仅对socks5服务器有效,并指定 所提供用户名的相应密码。

    用法示例:

    >>> s.set_proxy(socks.SOCKS5, "socks.example.com") # uses default port 1080
    >>> s.set_proxy(socks.SOCKS4, "socks.test.com", 1081)
    

    调用set_proxy方法后,只需使用 通过代理建立连接的传统参数:

    pip install PySocks
    
    0

    连接需要更长的时间才能允许与代理服务器进行协商。 请注意,在不调用set_proxy的情况下调用connect将连接 没有代理(就像普通的套接字一样)。

    错误:连接过程中的任何错误都将触发异常。例外情况 可能由底层套接字层生成,也可能是自定义模块 例外情况,其详细信息如下:

    proxyerror-这是一个基本异常类。不是直接提出,而是 相反,此模块引发的所有其他异常类都是从它派生的。 这允许一种简单的方式捕获所有与代理相关的错误。它从ioerror

    所有proxyerror异常都有一个属性,该属性将包含 捕获到套接字。错误异常,或者如果没有异常,则为

    generalProxyerRor-当抛出时,它表示一个问题没有落下 进入另一个类别。

    • 发送的数据无效-此错误表示从 服务器。最常见的原因是指定为代理的服务器是 不是真正的socks4/socks5/http代理,或者指定的代理类型可能是错误的。

    • 连接意外关闭-代理服务器意外地关闭了连接。 这可能表示代理服务器遇到网络或软件问题。

    • 错误的代理类型-如果提供给 set_proxy函数不是socks4/socks5/http

    • 错误输入-如果使用错误输入调用connect()方法,则会引发此问题 参数。

    classsocks5autherror-这表示通过socks5服务器的连接 由于身份验证问题而失败。

    • 需要身份验证-如果使用socks5服务器 需要身份验证而不提供用户名/密码。

    • 所有提供的身份验证方法都被拒绝-如果代理 需要此模块不支持的特殊身份验证方法。

    • 用户名未知或密码无效-自我描述。

    classsocks5error-对于与 身份验证。 参数是一个包含代码的元组,如服务器所示, 以及 错误。根据RFC,可能的错误是:

    • 0x01-一般SOCKS服务器故障-如果由于任何原因,代理服务器无法 完成您的请求(内部服务器错误)。
    • 0x02-规则集不允许连接-如果您试图连接到的地址 在服务器上被列入黑名单或需要身份验证。
    • 0x03-无法访问网络-无法联系目标。网络上的路由器 已回复一个目标网络无法访问的错误。
    • 0x04-无法访问主机-无法联系目标。网络上的路由器 已答复一个目标主机无法访问的错误。
    • 0x05-连接被拒绝-目标服务器已主动拒绝连接 (请求的端口已关闭)。
    • 0x06-ttl expired-从代理到目标服务器的syn数据包的ttl值 已经过期。这通常意味着有网络问题导致数据包 在路由器到路由器的"乒乓球"中捕获。
    • 0x07-不支持命令-例如,如果服务器不支持udp。
    • 0x08-不支持地址类型-客户端提供的地址类型无效。 使用此模块时,不应出现此错误。

    classsocks4error-这将针对socks4错误引发。参数是元组 包含服务器给出的代码和错误描述。这个 根据规范,可能的错误是:

    • 0x5b-请求被拒绝或失败-将在任何 其次是另外两个原因。
    • 0x5c-请求被拒绝,因为SOCKS服务器无法连接到客户端上的IDENT- SOCKS服务器试图在您的计算机上查找标识,但失败。在这 案例您应该运行一个identid服务器和/或配置防火墙以允许传入 从远程服务器连接到本地端口113。
    • 0x5d-请求被拒绝,因为客户端程序和ident报告不同的用户id- socks服务器在您的计算机上执行了一个ident查找,并收到一个 与您提供的用户名不同。更改您的用户名(通过 设置代理方法的用户名参数)以匹配并重试。

    httperror-这将针对http错误引发。消息将包含 http状态代码和提供的错误消息。

    建立连接后,对象的行为类似于标准套接字。

    makefile()settimeout()的行为应该与常规套接字一样。 调用close()方法关闭连接。

    除了socksocket类之外,还有一个值得一提的函数是 设置默认代理函数。参数与set_proxy方法相同。 此函数将为新创建的socksocket对象设置默认代理设置, 其中,代理设置未通过set_proxy方法更改。 如果您希望强制第三方模块使用SOCKS代理,这非常有用, 重写套接字对象。 例如:

    pip install PySocks
    
    1

    问题

    请在https://github.com/anorov/pysocks" rel="nofollow">https://github.com/anorov/pysocks上打开一个github问题

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java CXF和授权   java在网站中部署使用swing创建的表单   java为什么getHeaderField()返回一个字符串,其中getHeaderFields()返回HttpUrlConnection中的Map<String,List<String>>   java如何检测恶意数据包?   webview中的java网页为空   java SWT图像资源,用于将我的所有图像存储在一个位置   java计算数组的最大长度,使平均值小于给定值   java“发件人电话号码无效”和美国号码   将Swing组件作为内容的自定义Java工具提示不会显示   在并发HashMap中重新灰化期间的java检索   Java 7和Tomcat 7.0.64 ClassFormatException:常量池中的字节标记无效   使用JUnit的java assertNull因NullPointerException失败   java内存中的文件是否与文件系统中的文件大小相同?   循环内实例化的类型的java注入依赖项