序
上篇分析了模拟登陆的流程,以及HTTP请求和回应,下面我们开始编码实现。
编码
准备
安装requests, pip install requests
使用requests请求比使用urllib方便了很多,下面简单封装了一个http请求函数fetch:
'''
默认为GET,如果赋值data后则为POST方式
'''
def fetch(self, url, data=None, **kw):
if data is None:
func = self.session.get
else:
kw['data'] = data
func = self.session.post
return func(url, **kw)
使用QQ登录
self.jkqqurl='http://passport.jikexueyuan.com/connect/qq'
response = self.fetch(self.jkqqurl)
self.state = re.findall('&state=(.*?)\&', response.url)[0] #(.*?), 括号为返回匹配值,即=后面的
self.client_id = re.findall('&client_id=(.*?)\&', response.url)[0]
因为下面向腾讯请求认证需要学院返回的这两个参数:STATE, CLIENTID, 这里记录下来。
请求登录页面
通过上步请求后,虽然学院发起了向腾讯认证服务器的请求,但是因为没有登录会被重新定向至登录授权页面,
这里我们手动请求一次封装在IFrame中的登录页面:
self.xloginurl='http://xui.ptlogin2.qq.com/cgi-bin/xlogin'
g = self.fetch(self.xloginurl, params = {
'appid': self.appid,
'style': 23,
'login_text': '授权并登录',
'hide_title_bar': 1,
'target': 'self',
's_url': self.loginjumpurl,
'pt_3rd_aid': 101119675,
'pt_feedback_link': self.feedbackurl,
}).text
这步操作理论上会产生一些登录请求的会话信息,还是尽量模拟浏览器操作,后面再作精简。
登录校验
分析来看,腾讯根据登录请求类型来产生校验码图片或文字型校验码(如果不需要校验码图片),看代码:
self.checkurl2='http://check.ptlogin2.qq.com/check'
g = self.fetch(self.checkurl2, params = {
'regmaster': '',
'pt_tea': 1,
'pt_vcode': 1,
'uin