初学Python,练练手,写的不咋地。。。。。。
只有登录功能,没有获取好友、聊天等等其他功能
# -*- coding: GBK -*-
import httplib2,urllib
import os,sys,re,hashlib
class QQ(object):
#appid = "1003903"
appid = "8000203"
def __init__(self,uin,pwd):
'''
uin:QQ号
pwd:QQ密码
'''
self.uin = uin
self.pwd = pwd
self.http = httplib2.Http()
self.loginStatus = False
self.loginMsg = u"未登录"
def __initVerifyCode(self):
'''
初始化验证码
'''
checkUrl = "http://check.ptlogin2.qq.com/check?uin="+self.uin+"&appid="+self.appid+"&r=0.6315117976338621"
headers = {"Cookie":"chkuin="+self.uin}
response,content = self.http.request(checkUrl,headers=headers)
pm = re.search(r"ptvfsession=(\w+?);",response["set-cookie"])
if pm and pm.group(1):
self.ptvfsession = pm.group(1)
#print content
m = re.search(r"'(\d)','(.+)','(.+)'", content)
self.verifyCode1 = m.group(2)
self.verifyCode2 = m.group(3)
if m.group(1)=="0":
print u"免验证码!"
else:
print u"需要输入验证码!"
imgUrl = "http://captcha.qq.com/getimage?aid="+self.appid+"&r=0.3268821237981411&uin="+self.uin
response,content = self.http.request(imgUrl)
#print response["set-cookie"]
mt = re.search(r"verifysession=(\w+?);",response["set-cookie"])
if mt and mt.group(1):
self.verifysession = mt.group(1)
with open("code.jpg","wb") as img:
img.write(content)
promotStr = "验证码下载完毕("+os.path.split(os.path.realpath(sys.argv[0]))[0]+os.sep+"code.jpg),请输入:"
self.verifyCode1 = raw_input(promotStr)
else:
print u"获取验证码出错!"
def __encodePwd(self):
'''
对密码加密
'''
def hex_md5hash(myStr):
return hashlib.md5(myStr).hexdigest().upper()
def hexchar2bin(uin):
uin_final = ''
uin = uin.split('\\x')
for i in uin[1:]:
uin_final += chr(int(i, 16))
return uin_final
password_1 = hashlib.md5(self.pwd).digest()
password_2 = hex_md5hash(password_1 + hexchar2bin(self.verifyCode2))
password_final = hex_md5hash(password_2 + self.verifyCode1.upper())
self.pwdEncoded = password_final
def __postLogin(self):
'''
提交登录请求
'''
data = {"u":self.uin}
data["p"] = self.pwdEncoded
data["verifycode"] = self.verifyCode1
data["webqq_type"] = "10"
data["remember_uin"] = "1"
data["login2qq"] = "1"
data["aid"] = self.appid
data["h"] = "1"
data["u1"] = "http://imgcache.qq.com/club/portal_new/redirect.html?jump_url="
data["ptredirect"] = "0"
data["ptlang"] = "2052"
data["from_ui"] = "1"
data["pttype"] = "1"
data["t"] = "1"
data["g"] = "1"
body = urllib.urlencode(data)
loginUrl = "http://ptlogin2.qq.com/login?"+body
headers = {"Cookie":"chkuin="+self.uin+"; confirmuin="+self.uin}
try:
headers["Cookie"] += "; verifysession="+self.verifysession
except AttributeError:
pass
try:
headers["Cookie"] += "; ptvfsession="+self.ptvfsession
except AttributeError:
pass
#headers["Referer"] = "http://ui.ptlogin2.qq.com/cgi-bin/login?link_target=blank&target=self&appid=8000203&f_url=loginerroralert&s_url=http%3A//imgcache.qq.com/club/portal_new/redirect.html%3Fjump_url%3D"
response,content = self.http.request(loginUrl,headers=headers)
#print content
m = re.search(r"'(\d)','(.+)','(.+)','(.+)','(.+)', '(.+)'", content)
if m:
if m.group(1)!="0": #登录失败
self.loginMsg = m.group(5)
else: #登录成功
self.loginStatus = True
self.loginMsg = m.group(5)
self.cookie = response["set-cookie"]
else: #登录失败,不知道为什么,Fiddler拦截出来的失败结果和上面的格式一样的,程序却不是,只能暂时这样判断
m = re.search(r"(.+?)",content,re.DOTALL)
self.loginMsg = m.group(1).strip()
def login(self):
self.__initVerifyCode()
self.__encodePwd()
self.__postLogin()
if __name__ == "__main__":
qqApp = QQ("2222222", "11111111") #QQ号,QQ密码
qqApp.login()
print qqApp.loginMsg.decode("UTF-8").encode("GBK")
#sys.exit(0)