2017-02-03 1 views
1

このTwisted HTTP Clientの例でリモートピアIPにアクセスするにはどうすればよいですか?インターネット上で検索した後Twisted HTTP ClientアクセスピアIP(サーバ)

from sys import argv 
from pprint import pformat 

from twisted.internet.task import react 
from twisted.web.client import Agent, readBody 
from twisted.web.http_headers import Headers 


def cbRequest(response): 
    #print 'Response version:', response.version 
    #print 'Response code:', response.code 
    #print 'Response phrase:', response.phrase 
    #print 'Response headers:' 
    #print pformat(list(response.headers.getAllRawHeaders())) 
    poweredby = response.headers.getRawHeaders("X-Powered-By") 
    server = response.headers.getRawHeaders("Server") 


    print poweredby 
    print server 

    d = readBody(response) 
    d.addCallback(cbBody) 
    return d 

def cbBody(body): 
    print 'Response body:' 
    #print body 

def main(reactor, url=b"http://www.example.com/"): 
    agent = Agent(reactor) 
    d = agent.request(
     'GET', url, 
     Headers({'User-Agent': ['Twisted Web Client Example']}), 
     None) 
    d.addCallback(cbRequest) 



    return d 

react(main, argv[1:]) 

及びSO、私はそれから読み取ることができることを見出した:(ツイストドキュメントから)

は、この例での作業

self.xmlstream.transport.getHandle().getpeername() 

又は

self.transport.getPeer() 

しかし、 "self"というクラスがどのクラスを参照しているのか、そしてそのコードをどこに配置するのかはわかりません。

助けが必要ですか?ヒント?アイデア?

おかげで、

+1

リモートサーバーは確かに "www.example.com"です(これはネームリゾルバでIPアドレスに解決できます)。あなたはもう少し何をしようとしているのか説明できますか? –

+0

接続が既に行われているので、より効率的になり、ホスト名の解決をスキップしてIPピア名を取得できます。大量のウェブサイトをクロールしたい二度とやりたくない。私はこのようなurllib2(peer = response.fp._sock.fp._sock.getpeername())でそれをしましたが、ツイストされたモジュールでそれを行う方法を知らないです –

+0

あなたは何のためにアドレスを使用する予定ですか?あなたがチケットを申請した場合に含めるべき良い情報)? –

答えて

2

あなたが抽象化のいくつかの層を介しハックとプライベート属性をタッチする必要がありますが、アドレスを取得することが可能である:

理想的
from __future__ import print_function 
from twisted.web.client import Agent 
from twisted.internet.task import react 
from twisted.internet.protocol import Protocol 
from twisted.internet.defer import Deferred 

class ReadAddress(Protocol): 
    def __init__(self): 
     self.result = Deferred() 

    def connectionMade(self): 
     self.result.callback(self.transport._producer.getPeer()) 

def readAddress(response): 
    p = ReadAddress() 
    response.deliverBody(p) 
    return p.result 

@react 
def main(reactor): 
    a = Agent(reactor) 
    d = a.request(b"GET", b"http://www.google.com/") 
    d.addCallback(readAddress) 
    d.addCallback(print) 
    return d 

、単純(公衆が存在することになります!)インタフェースを使用して、このような情報を取得します。あなたがTwistedトラッカーで機能要求を提出できるなら、それは優れています。

+0

SUPER !!!ありがとうございました!!!私はプログラミングで高度なわけではないので、機能要求でうまく説明できるかどうかはわかりません。私はhttps://twistedmatrix.comとhttps://github.com/twisted/twistedを見ましたが、トラッカーでチケットを開く方法は見当たりません。私がそれを開くことができる場所を知っていますか?あなたが望むならば、それを自由に開くこともできます。 –

+0

チケットはtwistedmatrix.comで開かれます。ログインボタン(右上)を使用して_with_ githubにログインするとチケットが開かれます。 :) –

+1

チケットを開設しました。https://twistedmatrix.com/trac/ticket/9030 –

関連する問題