2012-08-13 111 views
0

我做了一些代码访问特定的站点,而不是用户。 这与自动登录程序非常相似。 我的程序收到用户的用户名和密码,并尝试访问带有数据和登录名的url,返回登录结果。python:不能使用urlopen!从urllib,urllib2,clientcookie urlopen ssl错误

这是代码。

from urllib import urlencode 
from urllib2 import Request 
from ClientCookie import urlopen, install_opener, build_opener 

httpheaders = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;)'} 
y_url1 = 'http://www.xxx.kr/papp.jsp' 
y_url2 = 'https://im.xxx.kr/sso/auth' 

def check_valid_user(user_id, user_pw): 
    values = {'ssousername': user_id, 'password': user_pw} 
    data = urlencode(values) 
    req = Request(y_url1, data, httpheaders) 
    response = urlopen(req) 
    the_page = response.read() 
    token = the_page.split('"site2pstoretoken"')[1].split('"')[1] 
    values = {'ssousername': user_id, 'password': user_pw, 'site2pstoretoken' : token} 
    data = urlencode(values) 
    req = Request(y_url2, data, httpheaders) 
    response = urlopen(req) 
    the_page = response.read() 
    install_opener(build_opener()) 
    if the_page.find('Cyber') == -1: 
     return False 
    else: 
     return True 

当我在我的Windows桌面上运行该程序时,它运行良好。

但是,当我在我的Ubuntu的Apache服务器上运行这个程序,它不工作。 (Ubuntu的11.04,蟒蛇2.7.1)

我打开Django的蟒蛇外壳,并尝试调试一行行 蟒蛇manage.py壳

response = urlopen(req) 

在这一点上,错误引发。

>>>response = urlopen(req) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/ClientCookie/_urllib2_support.py", line 824, in urlopen 
    return _opener.open(url, data) 
    File "/usr/lib/python2.7/urllib2.py", line 397, in open 
response = meth(req, response) 
    File "/usr/lib/python2.7/dist-packages/ClientCookie/_urllib2_support.py", line 626, in http_response 
"http", request, response, code, msg, hdrs) 
    File "/usr/lib/python2.7/urllib2.py", line 429, in error 
result = self._call_chain(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 369, in _call_chain 
result = func(*args) 
    File "/usr/lib/python2.7/dist-packages/ClientCookie/_urllib2_support.py", line 154, in http_error_302 
return self.parent.open(new) 
    File "/usr/lib/python2.7/urllib2.py", line 391, in open 
response = self._open(req, data) 
    File "/usr/lib/python2.7/urllib2.py", line 409, in _open 
'_open', req) 
    File "/usr/lib/python2.7/urllib2.py", line 369, in _call_chain 
result = func(*args) 
    File "/usr/lib/python2.7/dist-packages/ClientCookie/_urllib2_support.py", line 724, in https_open 
return self.do_open(httplib.HTTPSConnection, req) 
    File "/usr/lib/python2.7/dist-packages/ClientCookie/_urllib2_support.py", line 694, in do_open 
raise URLError(err) 
URLError: <urlopen error [Errno 1] _ssl.c:499: error:14077417:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert illegal parameter> 

什么问题?请帮我.....

回答

1

退房这个bug报告urllib bug

看起来有点像下面可能会解决它。

import ssl 
https_sslv3_handler = urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_SSLv3)) 
opener = urllib.request.build_opener(https_sslv3_handler) 
urllib.request.install_opener(opener) 
+0

我做了定制HTTPSHandler和使用install_opener。 SSL错误消失。但urlopen引发AttributeError:'NoneType'对象没有'sendall'属性....... – 2012-08-14 11:41:36

1

我会用requests代替urllib。语法是更干净:

r = requests.get('https://your-url', auth=('user', 'pass')) 

,你还可以添加标题:

headers = {'content-type': 'application/json'} 
r = requests.get('https://your-url', auth=('user', 'pass'), headers=headers) 
+0

我只是尝试使用请求模块,但它也引发了SSL错误...我认为这一点是错误引发只有在Ubuntu服务器。在我的台式电脑上运行良好。 – 2012-08-13 23:52:28

相关问题