模拟登录重庆理工大学数字化校园
同理登录豆瓣,重理工数字化校园登录过程也较简单,所以不多解释
前期工作同样是在浏览器登录后通过工具获取提交的那些数据表单,然后在源代码中找到这些数据项,并通过正则表达式将他们提取出来,在写程序过程同样遇到了几个问题:
1、cookie的获取失败,因为自己获取cookie时的逻辑或者是对库方法的不熟悉导致的
2、ip代理的实效导致url error无法访问到地址
将问题解决掉啦,这就很舒服,下面直接上源码
# login_i_cqut.py
# coding: utf-8
# 登录重庆理工大学数字化校园
import urlparse
import urllib
import urllib2
import cookielib
import re
import webbrowser
class CQUT:
def __init__(self, username, password):
self.loginUrl = 'http://i.cqut.edu.cn/zfca/login'
self.username = username
self.password = password
self.cookies = cookielib.CookieJar()
self.headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Host': 'i.cqut.edu.cn',
'Referer': 'http://i.cqut.edu.cn/zfca/login',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': '221'
}
self.postData = {
'useValidateCode': '',
'isremenberme': '',
'ip': '',
'username': self.username,
'password': self.password,
'losetime': '30',
'lt': '',
'_eventId': 'submit',
'submit1': ''
# j_captcha_response 验证码
}
# 登录主程序
def login(self):
self.EnableCookieAndProxy() # 使用代理和cookie
useValidateCode, isremenberme, ip, yzmUrl, lt = self.getData() # 获取表单提交数据
self.postData['useValidateCode'] = useValidateCode
self.postData['isremenberme'] = isremenberme
self.postData['ip'] = ip
self.postData['lt'] = lt
# 如果需要输入验证码
if yzmUrl:
webbrowser.open_new_tab(yzmUrl) # 打开验证码图片
# 手动输入验证码
yzm = raw_input("请输入浏览器显示的验证码: ")
self.postData['j_captcha_response'] = yzm
data = urllib.urlencode(self.postData)
print data
result = urllib2.urlopen(self.loginUrl, data)
print result.read().decode('gbk')
# 使用代理和添加cookie
def EnableCookieAndProxy(self):
# 添加cookie
cookieSupport = urllib2.HTTPCookieProcessor(self.cookies)
# 添加代理
proxySupport = urllib2.ProxyHandler({'http': '124.88.67.54:80'}) # 使用代理
opener = urllib2.build_opener(proxySupport, cookieSupport, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 构建对应的opener
def getData(self):
print self.loginUrl
page = urllib2.urlopen(self.loginUrl).read().decode('gbk')
print "first cookie:"
for i in self.cookies:
print i.name, '=', i.value
print page
pattern = re.compile('<input.*?id="useValidateCode".*?value="(.*?)".*?<input.*?id="isremenberme".*?value="(.*?)".*?<input.*?id="ip".*?value="(.*?)".*?<div.*?id="yzm" style="(.*?)">.*?<input.*?id="j_captcha_response".*?<img.*?src="(.*?)".*?>.*?<input type="hidden" name="lt" value="(.*?)"', re.S)
# 1 useValidateCode 2 isremenberme 3 ip 4 判断有误验证码 5 验证码链接 6 lt
res = re.search(pattern, page)
# res.group(4) 判断是否有验证码 res.group(5) 验证码链接, res.group(6) lt
if "display" in res.group(4): # 如果没有验证码
yzmUrl = None
# 验证码链接补充完整
else:
yzmUrl = urlparse.urljoin(self.loginUrl, res.group(5))
print yzmUrl, "lt:", res.group(6).strip()
return res.group(1).strip(), res.group(2).strip(), res.group(3).strip(), yzmUrl, res.group(6).strip()
#测试代码
cqut = CQUT("这是学号", "这是密码")
cqut.login()