2013-07-30 1 views
0

Avant de poser ma question, un peu de contexte est nécessaire. Je suis en train d'émettre HTTP GET et POST demandes à un site Web, avec les mises en garde suivantes:Quelle est la différence entre HttpClientFactory et Agent?

  • Redirects devraient
  • Les cookies sont nécessaires
  • Les demandes doivent passer par un proxy SOCKS (V4A)

jusqu'à présent, je me sers twisted.web.client.Agent et il est sous-classes (par exemple BrowserLikeRedirectAgent), mais malheureusement, il semble que SOCKS procurations ne sont pas encore pris en charge (et ProxyAgent est un non-aller parce que ce c lass est pour les proxies HTTP).

je suis tombé sur twisted-socks, qui semble me permettre de faire ce que je veux, mais je remarqué qu'il utilise HttpClientFactory au lieu de l'agent, d'où ma question: quelle est la différence entre HttpClientFactory et Agent et quand dois-je utiliser chaque un?

Voici un exemple de code utilisant des chaussettes torsadées. J'ai deux questions supplémentaires:

  1. Comment puis-je utiliser des cookies dans cet exemple? J'ai essayé passer un dict et une instance cookielib.CookieJar-cookies kwarg de HttpClientFactory, mais cela génère une erreur (quelque chose sur une chaîne étant attendue ... comment diable puis-je envoyer des cookies comme une chaîne?)

  2. Cela peut-il code être refactorisé pour utiliser Agent? Ce serait idéal, car j'ai déjà une base de code raisonnablement grande qui est écrite avec Agent à l'esprit.

`` `

import sys 
from urlparse import urlparse 
from twisted.internet import reactor, endpoints 
from socksclient import SOCKSv4ClientProtocol, SOCKSWrapper 
from twisted.web import client 

class mything: 
    def __init__(self): 
     self.npages = 0 
     self.timestamps = {} 

    def wrappercb(self, proxy): 
     print "connected to proxy", proxy 

    def clientcb(self, content): 
     print "ok, got: %s" % content[:120] 
     print "timetamps " + repr(self.timestamps) 
     self.npages -= 1 
     if self.npages == 0: 
      reactor.stop() 

    def sockswrapper(self, proxy, url): 
     dest = urlparse(url) 
     assert dest.port is not None, 'Must specify port number.' 
     endpoint = endpoints.TCP4ClientEndpoint(reactor, dest.hostname, dest.port) 
     return SOCKSWrapper(reactor, proxy[1], proxy[2], endpoint, self.timestamps) 

def main(): 
    thing = mything() 

    # Mandatory first argument is a URL to fetch over Tor (or whatever 
    # SOCKS proxy that is running on localhost:9050). 
    url = sys.argv[1] 
    proxy = (None, 'localhost', 9050, True, None, None) 

    f = client.HTTPClientFactory(url) 
    f.deferred.addCallback(thing.clientcb) 
    sw = thing.sockswrapper(proxy, url) 
    d = sw.connect(f) 
    d.addCallback(thing.wrappercb) 
    thing.npages += 1 

    reactor.run() 

if '__main__' == __name__: 
    main() 

` ``

Répondre

Questions connexes