2014-07-22 2 views
2

언어에 대해 별도의 웹 사이트를 사용해야하는 사용자 지정 스크래퍼를 사용합니다 (아키텍처 제한 사항). site1.co.uk, site1.es, site1.de 등과 마찬가지로MITMProxy : 스마트 URL 교체

과 같이 URL로 구분 된 여러 언어의 웹 사이트를 구문 분석해야합니다. 예를 들어 site2.com/en, site2.com/de, site2와 같이 URL로 구분 된 웹 사이트를 구문 분석해야합니다. co.kr/es 등등.

나는 MITMProxy에 대해 생각 :

class MyMaster(flow.FlowMaster): 

    def handle_request(self, r): 
    url = r.get_url() 

    # replace URLs 
    if 'blabla' in url: 
     r.set_url(url.replace('something', 'another')) 

그러나 대상 호스트가 생성 단순히 URL을 받아이를 다시 쓰는 작은 스크립트를 작성했습니다

en.site2.com/* --> site2.com/en 
de.site2.com/* --> site2.com/de 
... 

: 나는 모든 요청이 방법을 리디렉션 수 301 웹 서버의 응답으로 리디렉션 - '페이지가 여기에 옮겨졌습니다'및 site2.com/en에 대한 링크

URL 재 작성으로 작업했을 때 작동했는데, 즉 site2.com/en-> site2.com/de. 그러나 다른 호스트 (정확하게 말하면 하위 도메인과 루트 도메인)에서는 작동하지 않습니다.

나는 위에서 handle_request 방법에 호스트 헤더를 교체하려고 :
for key in r.headers.keys(): 
     if key.lower() == 'host': 
      r.headers[key] = ['site2.com'] 

도 나는 추천자를 교체하려고 - 그 모두가 도움이되지 않았다.

마침내 하위 도메인의 요청을 기본 도메인으로 스푸핑 할 수 있습니까? HTTP (s) 클라이언트 경고가 생성되면 실제 브라우저가 아닌 스크래퍼 (및 경고가 해제 될 수 있음)에 필요하므로 괜찮습니다.

감사합니다.

답변

0

응답의 내용을 바꾸고 몇 개의 필드로 헤더를 수정해야합니다. 리디렉션 된 URL에 대한 새 연결을 열고 응답을 작성하십시오.

def handle_request(self, flow): 
    newUrl = <new-url> 
    retryCount = 3 
    newResponse = None 
    while True: 
    try: 
     newResponse = requests.get(newUrl) # import requests 
    except: 
     if retryCount == 0: 
     print 'Cannot reach new url ' + newUrl 
     traceback.print_exc() # import traceback 
     return 

     retryCount -= 1 
     continue 
    break 

    responseHeaders = Headers() # from netlib.http import Headers 

    if 'Date' in newResponse.headers: 
    responseHeaders['Date'] = str(newResponse.headers['Date']) 
    if 'Connection' in newResponse.headers: 
    responseHeaders['Connection'] = str(newResponse.headers['Connection']) 
    if 'Content-Type' in newResponse.headers: 
    responseHeaders['Content-Type'] = str(newResponse.headers['Content-Type']) 
    if 'Content-Length' in newResponse.headers: 
    responseHeaders['Content-Length'] = str(newResponse.headers['Content-Length']) 
    if 'Content-Encoding' in newResponse.headers: 
    responseHeaders['Content-Encoding'] = str(inetResponse.headers['Content-Encoding']) 

    response = HTTPResponse( # from libmproxy.models import HTTPResponse 
    http_version='HTTP/1.1', 
    status_code=200, 
    reason='OK', 
    headers=responseHeaders, 
    content=newResponse.content) 

    flow.reply(response)