1

私はこのコードを実行しています ( http://blog.somethingaboutcode.com/?p=155から):

from twisted.internet import reactor
from twisted.web import http
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient
from ImageFile import Parser
from StringIO import StringIO

class InterceptingProxyClient(ProxyClient):
    def __init__(self, *args, **kwargs):
        ProxyClient.__init__(self, *args, **kwargs)
        self.image_parser = None

    def handleHeader(self, key, value):
        if key == "Content-Type" and value in ["image/jpeg", "image/gif", "image/png"]:
            self.image_parser = Parser()
        if key == "Content-Length" and self.image_parser:
            pass
        else:
            ProxyClient.handleHeader(self, key, value)

    def handleEndHeaders(self):
        if self.image_parser:
            pass #Need to calculate and send Content-Length first
        else:
            ProxyClient.handleEndHeaders(self)

    def handleResponsePart(self, buffer):
        print buffer
        if self.image_parser:
            self.image_parser.feed(buffer)
        else:
            ProxyClient.handleResponsePart(self, buffer)

    def handleResponseEnd(self):
        if self.image_parser:
            image = self.image_parser.close()
            try:
                format = image.format
                image = image.rotate(180)
                s = StringIO()
                image.save(s, format)
                buffer = s.getvalue()
            except:
                buffer = ""
            ProxyClient.handleHeader(self, "Content-Length", len(buffer))
            ProxyClient.handleEndHeaders(self)
            ProxyClient.handleResponsePart(self, buffer)
        ProxyClient.handleResponseEnd(self)

class InterceptingProxyClientFactory(ProxyClientFactory):
    protocol = InterceptingProxyClient

class InterceptingProxyRequest(ProxyRequest):
    protocols = {'http': InterceptingProxyClientFactory}
    ports = {"http" : 80}

class InterceptingProxy(Proxy):
    requestFactory = InterceptingProxyRequest

factory = http.HTTPFactory()
factory.protocol = InterceptingProxy

reactor.listenTCP(8000, factory)
reactor.run()

これを取得して 127.0.0.1:8000 に移動すると、次のようになります。

Traceback (most recent call last):
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py",
line 84, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py",
line 69, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p
y", line 59, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p
y", line 37, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\selectr
eactor.py", line 146, in _doReadOrWrite
    why = getattr(selectable, method)()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\tcp.py"
, line 460, in doRead
    return self.protocol.dataReceived(data)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\protocols\basic.
py", line 251, in dataReceived
    why = self.lineReceived(line)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 1573, in lineReceived
    self.allContentReceived()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 1641, in allContentReceived
    req.requestReceived(command, path, version)
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li
ne 807, in requestReceived
    self.process()
  File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\proxy.py", l
ine 147, in process
    port = self.ports[protocol]
exceptions.KeyError: ''

localhost:8000 でプロキシを使用するように firefox、chrome、または Opera をセットアップするたびに、プロキシへの接続が確立されません (プロキシへの接続ではないため、どのページにも接続できなくなりました)。


それでも失敗し、ログを記録すると、localhost:8000 でプロキシを使用するように firefox を設定し、Web ブラウザから直接プロキシにアクセスしないと (firefox のアドレス バーに localhost:8000 と入力するなど)、この出力が得られます。

2010-08-04 12:31:18-0400 [-] Log opened.
2010-08-04 12:31:29-0400 [-] twisted.web.http.HTTPFactory starting on 8000
2010-08-04 12:31:29-0400 [-] Starting factory <twisted.web.http.HTTPFactory inst
ance at 0x010B3EE0>
2010-08-04 12:33:55-0400 [-] Received SIGINT, shutting down.
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] (Port 8000 Closed)
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] Stopping factory <twiste
d.web.http.HTTPFactory instance at 0x010B3EE0>
2010-08-04 12:33:55-0400 [-] Main loop terminated.

ただし、プロキシに直接アクセスすると、キーエラーが発生します。

また、スニッフィングについてはできません。Wireshark は localhost トラフィックを盗聴していないようで、fiddler 2 を使用すると、自分自身をプロキシとして設定し (したがって、プロキシ サーバーを使用しなくなります)、動作します (fiddler 2 のプロキシを使用するため)。

4

1 に答える 1

1

KeyError直接接続したときに表示される例外は、プロキシへのリクエストに相対URLではなく絶対URLを含める必要があるという事実が原因です。ブラウザがプロキシと通信していることを認識していない場合、ブラウザはのようなURLを要求します/foo/bar。プロキシと通信していることがわかっている場合は、代わりにのようなものを要求しますhttp://example.com/foo/bar。このhttp://example.com/部分は重要です。これは、プロキシが何を実行して取得するかを知る唯一の方法だからです。

Firefox、Chrome、Operaのいずれも、設定するとプロキシに接続されない理由については、説明が少し難しいです。サポートされている他の種類のプロキシではなく、「HTTPプロキシ」を構成していることを確認してください。これを再確認したら、Wiresharkなどのツールを使用して、ネットワーク層で何が起こっているかを詳しく調べることができます。

プロキシへの接続が実際に行われている可能性がありますが、他の問題が発生しているため、接続を完了できません。この場合、ロギングを有効にしないと、プロキシが出力を確認するだけでは接続を受信して​​いることを認識できない場合があります。ロギングを有効にするには、次のことを試してください。

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
于 2010-08-04T13:37:50.243 に答える