2014-09-04 8 views
5

में एक HTTPS प्रॉक्सी का परीक्षण करें I बहुत सारे HTTPS प्रॉक्सी प्रबंधित करते हैं (यह प्रॉक्सी है जिसका स्वयं का SSL कनेक्शन है)। मैं अजगर में एक निदान उपकरण बना रहा हूं जो प्रत्येक प्रॉक्सी के माध्यम से किसी पृष्ठ से कनेक्ट करने का प्रयास करता है और मुझे ईमेल करता है अगर वह उनमें से किसी एक से कनेक्ट नहीं हो सकता है।पायथन

जिस तरह से मैंने इस बारे में जाने के लिए सेट किया है, वह प्रत्येक प्रॉक्सी से कनेक्ट करने के लिए urllib का उपयोग करना है और एक पृष्ठ वापस करना है जो नीचे दिए गए कोड के साथ "सफलता" कहना चाहिए।

def fetch(url): 
    connection = urllib.urlopen(
    url, 
    proxies={'http':"https://"+server+':443'} 
    ) 
    return connection.read() 


print fetch(testURL) 

यह पृष्ठ मैं चाहता हूँ को हासिल करेगा पूरी तरह से समस्या यह अभी भी पेज मैं भी चाहते हैं, तो प्रॉक्सी सर्वर जानकारी गलत है या प्रॉक्सी सर्वर निष्क्रिय है लायेगा है। तो या तो यह प्रॉक्सी सर्वर का कभी भी उपयोग नहीं करता है या यह कोशिश करता है और जब यह विफल रहता है तो इसके बिना कनेक्ट करता है।

मैं इसे कैसे ठीक कर सकता हूं?

संपादित करें: कोई भी यह नहीं जानता कि यह कैसे करें। मैं यह देखने के लिए कि क्या वे इसे बेहतर तरीके से संभाल सकते हैं, अन्य भाषाओं पुस्तकालयों के माध्यम से पढ़ना शुरू कर रहे हैं। क्या किसी को पता है कि गो जैसे किसी अन्य भाषा में यह आसान है?

संपादित करें: मैंने इसे नीचे एक टिप्पणी में लिखा है, लेकिन मुझे लगता है कि यह एक गलतफहमी हो सकती है। "प्रॉक्सी का अपना एसएसएल कनेक्शन है। इसलिए यदि मैं google.com पर जाता हूं, तो मैं पहले foo.com के साथ एक महत्वपूर्ण एक्सचेंज करता हूं और फिर गंतव्य पता बार.com या गंतव्य पता baz.com के साथ दूसरा गंतव्य गंतव्य ' टी को https होना चाहिए, प्रॉक्सी https है "

उत्तर

1

मुझे लगता है कि यह https अनुरोधों के लिए काम नहीं कर रहा है। क्या ये सही है? यदि हां तो उपर्युक्त कोड केवल http के लिए प्रॉक्सी परिभाषित करता है। https के लिए इसे जोड़ने का प्रयास करें:

proxies={'https':"https://"+server+':443'}

एक अन्य विकल्प urllib के बजाय requests अजगर मॉड्यूल का उपयोग करने के लिए है। http://docs.python-requests.org/en/latest/user/advanced/#proxies

+0

को

con.putrequest('GET', 'http://example.com/', skip_host=True) 

बदल जाती है। यह मदद नहीं की। इस परिदृश्य में अनुरोधों का लाभ क्या होगा? –

+0

ठीक है इसलिए मैंने इसे अपने पैकेट कैप्चर का उपयोग करके अपने पर्यावरण पर चलाया और यह दिखाता है कि urllib प्रॉक्सी से कनेक्ट अनुरोध नहीं भेज रहा है जो गलत है। मैं फिर https://docs.python.org/2/howto/urllib2.html पढ़ता हूं जो बताता है कि "वर्तमान में urllib2 प्रॉक्सी के माध्यम से https स्थानों को लाने का समर्थन नहीं करता है। हालांकि, यह urllib2 को विस्तारित करके दिखाया जा सकता है जैसा कि दिखाया गया है नुस्खा http://code.activestate.com/recipes/456195। मैंने पाइथन मॉड्यूल के अनुरोधों का सुझाव दिया क्योंकि यह उपयोग करने में आसान और आसान लगता है जो urllib का उपयोग करके इसे प्राप्त करने का प्रयास कर रहा है – Yuvika

0

पर एक नज़र डालें, टाइमआउट का उपयोग करने के बारे में कैसे? यदि प्रॉक्सी 30 सेकंड के भीतर कनेक्ट होने में विफल रहता है तो इसे कनेक्ट नहीं किया जाना चाहिए।

def fetch(url, server): 
proxy_handler = urllib2.ProxyHandler({'http':'https://'+server+':443'}) 
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler(debuglevel=0)) 
urllib2.install_opener(opener) 

try: 
    response = opener.open(url, timeout = 30) 
    return response.read() 
except: 
    print "Can't connect with proxy %s" % (server) 

print fetch(url,serverIp) 

आप debuglevel = 1 बदलने कनेक्शन विवरण

मैं वैश्विक प्रॉक्सी के लिए और 30 सेकंड मेरी इंटरनेट कनेक्शन के साथ इस का उपयोग को देखने के लिए कर सकते हैं अधिकतम समय समाप्त अगर मैं जुड़ा हुआ है या नहीं पता करने के लिए है। मेरे परीक्षणों में यदि कनेक्शन लंबा है तो 30 सेकंड हमेशा एक विफलता थी।

2

अधिकांश लोगों को https प्रॉक्सी कि CONNECT अनुरोध समझता है के रूप में प्रॉक्सी को समझते हैं। मेरा उदाहरण प्रत्यक्ष एसएसएल कनेक्शन बनाता है।

try: 
    import http.client as httplib # for python 3.2+ 
except ImportError: 
    import httplib # for python 2.7 


con = httplib.HTTPSConnection('proxy', 443) # create proxy connection 
# download http://example.com/ through proxy 
con.putrequest('GET', 'http://example.com/', skip_host=True) 
con.putheader('Host', 'example.com') 
con.endheaders() 
res = con.getresponse() 
print(res.read()) 

मुझे लगता है कि कोशिश की आपके प्रॉक्सी रिवर्स प्रॉक्सी तो

con.putrequest('GET', '/', skip_host=True)`