Форум сайта python.su
собственно как сделать веб-клиента, который бы лазил через прокси по тру-твистедовски?
курение гугля просветления не принесло
Офлайн
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from twisted.internet import reactor
from twisted.python import log
from twisted.web.http import HTTPFactory
from twisted.web.proxy import Proxy
if __name__ == '__main__':
fileObserver = log.FileLogObserver(sys.stdout)
fileObserver.timeFormat = '%H:%M:%S'
log.startLoggingWithObserver(fileObserver.emit)
factory = HTTPFactory()
factory.protocol = Proxy
reactor.listenTCP(8080, factory)
reactor.run()
Офлайн
А, ты же клиента просил :-).
Похоже в Twisted нет для этого решения. Почитай протокол HTTP, сделаю свою фабрику (или как то иначе) для работы с прокси. По идее это тот же клиент + несколько своеобразных заголовков. Я с этой частью протокола не знаком, поэтому помочь не могу.
..bw
Отредактировано (Июль 24, 2008 08:36:53)
Офлайн
вот и я тоже удивился, когда обнаружил что клиента для прокси в твистеде найти немогу…….
Офлайн
:)
Фрагмент творчества…
from urllib import urlencode
from StringIO import StringIO
from twisted.web2 import stream as stream_mod, http_headers
from twisted.web2.client.http import HTTPClientProtocol, ClientRequest
from twisted.internet import reactor, protocol, defer
def err(reason, defered):
if not defered.called:
defered.errback(reason)
def geturl_proxy(host, path, proxy_host, proxy_port, **kwargs):
d = protocol.ClientCreator(reactor, HTTPClientProtocol).connectTCP(proxy_host, proxy_port)
path = 'http://%s%s' % (host, path)
ret = defer.Deferred()
def gotResp(resp, defered):
def done(n, res, defered):
defered.callback(res.getvalue())
res = StringIO()
stream_mod.readStream(resp.stream, res.write).addCallback(done, res, defered).addErrback(err, defered)
def sendReq(proto):
q = '?'+urlencode(kwargs) if kwargs else ''
headers = http_headers.Headers({'Host': host})
proto.submitRequest(ClientRequest("GET", path+q, headers, None)).addCallback(gotResp, ret).addErrback(err, ret)
d.addCallback(sendReq).addErrback(err, ret)
return ret
if __name__=="__main__":
def f(*args):
for arg in args: print arg
reactor.stop()
geturl_proxy('ya.ru', '/', 'proxy.zzz', 3128).addBoth(f)
reactor.run()
Офлайн
только что столкнулся с такой же задачей. но оказалось все просто: нужно делать reactor.connectTCP на прокси, а всё остальное - стандартно.
пример:
hcf = HTTPClientFactory('http://mts.ru', method='GET') # нужно считать mts.ru
hcf.deferred.addCallbacks(on_suc, on_err)
proxy_host, proxy_port = ‘118.98.195.42’, 3128 # я лазил через этот прокси
reactor.connectTCP(proxy_host, proxy_port, hcf) # коннект к прокси !
Офлайн
если будут проблемы с CoDeen-проксями - пишите ;-)
Офлайн
Со Squid 2.6 такое не работает. В GET (или другом методе) требуется передавать не только путь, а полный адрес. Squid, видимо, игнорирует заголовок Host. Еще возникнет проблема при редиректе, так как у тебя не будет возможности сделать connectTCP.
p.s. Накалякал вот тут, может кому пригодится: http://blog.handsdriver.net/2008/10/twisted.html
..bw
Отредактировано (Окт. 10, 2008 10:32:59)
Офлайн
+1. как только появится время - протестим в боевых условиях =)
Офлайн
Доложи о результатах, доработаю для наследников :-).
..bw
Офлайн