Posted in Python onFebruary 15, 2016
这是我最初学习时自己做的一个python模拟登录webqq的实例代码,具体代码如下
import hashlib from urllib import request,parse from http import cookiejar import re,random,time import threading as th import json.encoder as json_encode import json.decoder as json_decode class QQ: """ Login QQ """ __headers ={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.9 Safari/534.30',\ 'Referer':'http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fwebqq.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20110909003'\ } __cookiepath = 'C:\\Users\\dingyangfan\\Desktop\php\\tt.txt' __qq = None __pswd = None __verifycode = None __clientid = 21628014 __http = {} __psessionid = '' __ptwebqq = '' __vfwebqq = '' __skey = '' __poll2 = None __get_msg_tip = None __rc = 0 __send_num = 31330000 def __init__(self): self.httpproess() self.__Login() pass def __preprocess(self,password,verifycode): """ QQ密码加密部份 """ return hashlib.md5( (self.__md5_3((password).encode('utf-8')) + (verifycode).upper()).encode('utf-8')).hexdigest().upper() pass def __md5_3(self,str): """ QQ密码md5_3部份 """ return hashlib.md5(hashlib.md5(hashlib.md5(str).digest()).digest()).hexdigest().upper() pass def httpproess(self): """ 初始化模拟进程 """ self.__http['cj'] = cookiejar.MozillaCookieJar(self.__cookiepath) self.__http['opener'] = request.build_opener(request.HTTPCookieProcessor(self.__http['cj'])) return self.__http pass def __request(self,url,method='GET',data={},savecookie=False): """ 请求url """ if (method).upper() == 'POST': data = parse.urlencode(data).encode('utf-8') self.__http['req'] = request.Request(url,data,self.__headers) else: self.__http['req'] = request.Request(url=url,headers=self.__headers) fp = self.__http['opener'].open(self.__http['req']) try: str = fp.read().decode('utf-8') except UnicodeDecodeError: str = fp.read() if savecookie == True: self.__http['cj'].save(ignore_discard=True,ignore_expires=True) fp.close() return str pass def __getcookies(self,name): fp = open(self.__cookiepath) fp.seek(130) for read in fp.readlines(): str = read.split(name) if len(str) == 2: fp.close() return str[1].strip() fp.close() return None pass def __getverifycode(self): """ @url:http://ptlogin2.qq.com/check?uin=644826377&appid=1003903&r=0.56373973749578 """ urlv = 'http://ptlogin2.qq.com/check?uin='+ ('%s' % self.__qq)+'&appid=1003903&r='+ ('%s' % random.Random().random()) str = self.__request(url = urlv, savecookie=True) str = re.findall(r'\d|(?<=\')[a-zA-Z0-9\!]{4}',str) return str pass def __request_login(self): """ @url:http://ptlogin2.qq.com/login @params:{u:644826377 p:73DA5C1145E0F82247F60B3A17B89E6A verifycode:!S10 webqq_type:10 remember_uin:1 login2qq:1 aid:1003903 u1:http://webqq.qq.com/loginproxy.html?login2qq=1&webqq_type=10 h:1 ptredirect:0 ptlang:2052 from_ui:1 pttype:1 dumy: fp:loginerroralert action:1-24-62651 mibao_css:m_webqq} """ urlv = 'http://ptlogin2.qq.com/login?u='+('%s' % self.__qq) +'&' + 'p=' + ('%s' % self.__pswd) + '&verifycode='+ ('%s' % self.__verifycode[1]) +'&remember_uin=1&aid=1003903' + "&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Fstrong%3Dtrue" + '&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert' str = self.__request(url = urlv,savecookie=True) if str.find('登录成功') != -1: #执行二次登录 self.__ptwebqq = self.__getcookies('ptwebqq') self.__skey = self.__getcookies('skey') self.__request_post() elif str.find('不正确') != -1: print('你输入的帐号或者密码不正确,请重新输入。') else: print('登录失败') pass def __request_post(self): ''' http://d.web2.qq.com/channel/login2 r:{"status":"online","ptwebqq":"95b148b95af9be7677757b3a629e3904f52f153d0b714c527f81f8d9e385867a","passwd_sig":"", "clientid":"21628014","psessionid":null} clientid:21628014 psessionid:null ''' self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'}) a = {'status':'online','ptwebqq':self.__getcookies('ptwebqq'),'passwd_sig':'','clientid':self.__clientid,'psessionid':'null'} array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':'null'} url = 'http://d.web2.qq.com/channel/login2' str = self.__request(url,'POST',array) str = json_decode.JSONDecoder().decode(str) self.__psessionid = str['result']['psessionid'] self.__vfwebqq = str['result']['vfwebqq'] self.__get_friend_info2() self.__get_user_friends2() self.__get_group_name_list_mask2() self.__poll2_() self.__get_msg_tip_() pass def __poll2_(self): """ 不知道干嘛的,一分钟连接一次,属于长连接,接收消息 @url:http://d.web2.qq.com/channel/poll2 r:{"clientid":"9467930","psessionid":"8368046764001e636f6e6e7365727665725f77656271714031302e3132382e36362e31313500003058000000c0026e040009456f266d0000000a407169446b464737436b6d00000028f8d256743e5c191cb40a2217845fab12fda62acd2e6145ae196976d7a8b3bb11a64d3c9565868322","key":0,"ids":[]} clientid:9467930 psessionid:8368046764001e636f6e6e7365727665725f77656271714031302e3132382e36362e31313500003058000000c0026e040009456f266d0000000a407169446b464737436b6d00000028f8d256743e5c191cb40a2217845fab12fda62acd2e6145ae196976d7a8b3bb11a64d3c9565868322 """ self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'}) urlv = 'http://d.web2.qq.com/channel/poll2' a = {'clientid':self.__clientid,'psessionid':self.__psessionid,'key':0,'ids':[]} array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid} self.__poll2 = self.__request(url = urlv,method='POST',data = array) str = json_decode.JSONDecoder().decode(self.__poll2) print(str) if str['retcode'] == 0: if str['result'][0]['poll_type'] == 'message': self.__message(str['result'][0]['value']['from_uin']) elif str['result'][0]['poll_type'] == 'group_message': self.__group_message(str['result'][0]['value']['from_uin']) pass t1 = th.Timer(1,self.__poll2_) t1.start() pass def __get_msg_tip_(self): """ #也不知道是什么,反正一直请求 @url:http://webqq.qq.com/web2/get_msg_tip?uin=&tp=1&id=0&retype=1&rc=64&lv=2&t=1315746772886 """ self.__headers.update({'Referer':'http://webqq.qq.com/'}) self.__rc += 1 num = 100 + self.__rc t = '%s' % '%d' % time.time() + '%s' % num urlv = 'http://webqq.qq.com/web2/get_msg_tip?uin=&tp=1&id=0&retype=1&rc='+'%s'% self.__rc +'&lv=3&t=' + t self.__get_msg_tip = self.__request(urlv) print(self.__get_msg_tip) t2 = th.Timer(60,self.__get_msg_tip_) t2.start() pass def __get_friend_info2(self): ''' @url:http://s.web2.qq.com/api/get_friend_info2?tuin=self.__qq&verifysession=&code=&vfwebqq=self.__vfwebqq ''' self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'}) url = 'http://s.web2.qq.com/api/get_friend_info2?tuin='+ self.__qq + '&verifysession=&code=&vfwebqq=' + self.__vfwebqq + '&t=%s' % '%d' % time.time() + '100' str = self.__request(url) print(str) pass def __get_user_friends2(self): ''' @url:http://s.web2.qq.com/api/get_user_friends2 ''' self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'}) url = 'http://s.web2.qq.com/api/get_user_friends2' a = {'h':'hello','vfwebqq':self.__vfwebqq} array = {'r':json_encode.JSONEncoder().encode(a)} str = self.__request(url,'POST',array) print(str) pass def __get_group_name_list_mask2(self): ''' @url:http://s.web2.qq.com/api/get_group_name_list_mask2 ''' self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'}) url = 'http://s.web2.qq.com/api/get_group_name_list_mask2' a = {'vfwebqq':self.__vfwebqq} array = {'r':json_encode.JSONEncoder().encode(a)} str = self.__request(url,'POST',array) print(str) pass def __send_message(self,uid,msg): ''' @url:http://d.web2.qq.com/channel/send_buddy_msg2 r:{"to":3023379661,"face":180,"content":"[\"哈哈\",\"\\n【提示:此用户正在使用WebQQ:http://webqq.qq.com/】\",[\"font\", {\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]","msg_id":31330001,"clientid":"76133590", "psessionid":"s"} clientid:76133590 psessionid:s Referer:http://d.web2.qq.com/proxy.html?v=20110331002&callback=2 {"retcode":0,"result":"ok"} ''' self.__send_num +=1 msg = "[\""+ msg +"\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]" self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'}); url = 'http://d.web2.qq.com/channel/send_buddy_msg2' a = {'to':uid,'face':180,'content':msg,'msg_id':self.__send_num,'clientid':self.__clientid,'psessionid':self.__psessionid} array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid} str = self.__request(url,'POST',array) print(str) pass def __message(self,uid): ''' {"retcode":0,"result":[{"poll_type":"message","value":{"msg_id":13013,"from_uin":3023379661,"to_uin":644826377,"msg_id2":503935,"msg_type":9,"reply_ip":176752345,"time":1316143960,"content":[["font",{"size":13,"color":"000000","style":[0,0,0],"name":"\u5B8B\u4F53"}],"\u4E0D\u662F\u5427\u3002"]}}]} ''' self.__send_message(uid,'我是机器人%s' % time.time()) pass def __send_group_message(self,gid,msg): ''' @url:http://d.web2.qq.com/channel/send_qun_msg2 r:{"group_uin":1132101900,"content":"[\"哈哈哈,测试\",\"\\n【提示:此用户正在使用WebQQ:http://webqq.qq.com/】\",[\"font\", {\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]","msg_id":31330002,"clientid":"76133590", "psessionid":"a"} clientid:76133590 psessionid:a Referer:http://d.web2.qq.com/proxy.html?v=20110331002&callback=2 {"retcode":0,"result":"ok"} ''' self.__send_num +=1 msg = "[\"" +msg + "\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]" self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'}); url = 'http://d.web2.qq.com/channel/send_qun_msg2' a = {'group_uin':gid,'content':msg,'msg_id':self.__send_num,'clientid':self.__clientid,'psessionid':self.__psessionid} array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid} str = self.__request(url,'POST',array) print(str) pass def __group_message(self,gid): ''' {"retcode":0,"result":[{"poll_type":"group_message","value":{"msg_id":8044,"from_uin":1132101900,"to_uin":644826377,"msg_id2":178306,"msg_type":43,"reply_ip":2886742214,"group_code":317106137,"send_uin":3023379661,"seq":10654,"time":1316143836,"info_seq":32946855,"content":[["font",{"size":13,"color":"000000","style":[0,0,0],"name":"\u5B8B\u4F53"}],"\u5DE5"]}}]} ''' self.__send_group_message(gid,'我是机器人%s' % time.time()) pass def __Login(self): """ qq登录 """ self.__qq = input('QQ号:') self.__pswd = input('QQ密码:') self.__qq = self.__qq.strip() self.__pswd = self.__pswd.strip() self.__verifycode = self.__getverifycode() self.__pswd = self.__preprocess( self.__pswd,#密码 \ '%s' % self.__verifycode[1] #验证码 \ ) self.__request_login() pass s = QQ()
以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。
Python3.2模拟实现webqq登录
- Author -
lijiao声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@