Python + Twisted + FtpClient + SOCKS

Я только начал использовать Twisted. Я хочу подключиться к FTP-серверу и выполнить некоторые основные операции (если возможно, используйте многопоточность). Я использую этопример.

Который делает работу довольно хорошо. Вопрос в том, как добавить использование SOCKS4 / 5 прокси в код? Кто-нибудь может привести рабочий пример? Я пробовал этоссылка на сайт тоже.

Но,

    # Copyright (c) Twisted Matrix Laboratories.
    # See LICENSE for details.


    """
    An example of using the FTP client
    """

    # Twisted imports
    from twisted.protocols.ftp import FTPClient, FTPFileListProtocol
    from twisted.internet.protocol import Protocol, ClientCreator
    from twisted.python import usage
    from twisted.internet import reactor, endpoints

    # Socks support test
    from socksclient import SOCKSv4ClientProtocol, SOCKSWrapper
    from twisted.web import client

    # Standard library imports
    import string
    import sys
    try:
        from cStringIO import StringIO
    except ImportError:
        from StringIO import StringIO


    class BufferingProtocol(Protocol):
        """Simple utility class that holds all data written to it in a buffer."""
        def __init__(self):
            self.buffer = StringIO()

        def dataReceived(self, data):
            self.buffer.write(data)

    # Define some callbacks

    def success(response):
        print 'Success!  Got response:'
        print '---'
        if response is None:
            print None
        else:
            print string.join(response, '\n')
        print '---'


    def fail(error):
        print 'Failed.  Error was:'
        print error

    def showFiles(result, fileListProtocol):
        print 'Processed file listing:'
        for file in fileListProtocol.files:
            print '    %s: %d bytes, %s' \
                  % (file['filename'], file['size'], file['date'])
        print 'Total: %d files' % (len(fileListProtocol.files))

    def showBuffer(result, bufferProtocol):
        print 'Got data:'
        print bufferProtocol.buffer.getvalue()


    class Options(usage.Options):
        optParameters = [['host', 'h', 'example.com'],
                         ['port', 'p', 21],
                         ['username', 'u', 'webmaster'],
                         ['password', None, 'justapass'],
                         ['passive', None, 0],
                         ['debug', 'd', 1],
                        ]

    # Socks support                    
    def wrappercb(proxy):
        print "connected to proxy", proxy
        pass

    def run():
        def sockswrapper(proxy, url):
            dest = client._parse(url) # scheme, host, port, path
            endpoint = endpoints.TCP4ClientEndpoint(reactor, dest[1], dest[2])
            return SOCKSWrapper(reactor, proxy[1], proxy[2], endpoint)

        # Get config
        config = Options()
        config.parseOptions()
        config.opts['port'] = int(config.opts['port'])
        config.opts['passive'] = int(config.opts['passive'])
        config.opts['debug'] = int(config.opts['debug'])

        # Create the client
        FTPClient.debug = config.opts['debug']
        creator = ClientCreator(reactor, FTPClient, config.opts['username'],
                                config.opts['password'], passive=config.opts['passive'])
        #creator.connectTCP(config.opts['host'], config.opts['port']).addCallback(connectionMade).addErrback(connectionFailed)

        # Socks support
        proxy = (None, '1.1.1.1', 1111, True, None, None)
        sw = sockswrapper(proxy, "ftp://example.com")
        d = sw.connect(creator)
        d.addCallback(wrappercb)

        reactor.run()

    def connectionFailed(f):
        print "Connection Failed:", f
        reactor.stop()

    def connectionMade(ftpClient):
        # Get the current working directory
        ftpClient.pwd().addCallbacks(success, fail)

        # Get a detailed listing of the current directory
        fileList = FTPFileListProtocol()
        d = ftpClient.list('.', fileList)
        d.addCallbacks(showFiles, fail, callbackArgs=(fileList,))

        # Change to the parent directory
        ftpClient.cdup().addCallbacks(success, fail)

        # Create a buffer
        proto = BufferingProtocol()

        # Get short listing of current directory, and quit when done
        d = ftpClient.nlst('.', proto)
        d.addCallbacks(showBuffer, fail, callbackArgs=(proto,))
        d.addCallback(lambda result: reactor.stop())


    # this only runs if the module was *not* imported
    if __name__ == '__main__':
        run()

Я знаю, что код неправильный. Мне нужно решение.

Ответы на вопрос(1)

Ваш ответ на вопрос