Python3.2模擬實(shí)現(xiàn)webqq登錄
這是我最初學(xué)習(xí)時(shí)自己做的一個(gè)python模擬登錄webqq的實(shí)例代碼,具體代碼如下
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):
"""
初始化模擬進(jìn)程
"""
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):
"""
請(qǐng)求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:
#執(zhí)行二次登錄
self.__ptwebqq = self.__getcookies('ptwebqq')
self.__skey = self.__getcookies('skey')
self.__request_post()
elif str.find('不正確') != -1:
print('你輸入的帳號(hào)或者密碼不正確,請(qǐng)重新輸入。')
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):
"""
不知道干嘛的,一分鐘連接一次,屬于長(zhǎng)連接,接收消息
@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):
"""
#也不知道是什么,反正一直請(qǐng)求
@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,'我是機(jī)器人%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":"[\"哈哈哈,測(cè)試\",\"\\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,'我是機(jī)器人%s' % time.time())
pass
def __Login(self):
"""
qq登錄
"""
self.__qq = input('QQ號(hào):')
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] #驗(yàn)證碼 \
)
self.__request_login()
pass
s = QQ()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python備份目錄及目錄下的全部?jī)?nèi)容的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython備份目錄及目錄下的全部?jī)?nèi)容的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
Python標(biāo)準(zhǔn)庫(kù)itertools的使用方法
本文匯總整理了Python標(biāo)準(zhǔn)庫(kù)itertools的使用方法,并提供簡(jiǎn)單應(yīng)用示例;如果還不能滿足你的要求,歡迎加入補(bǔ)充2020-01-01
如何在PyCharm中配置使用Anaconda環(huán)境
這篇文章主要介紹了如何在PyCharm中配置使用Anaconda環(huán)境,圖文講解寫的非常詳細(xì)簡(jiǎn)單易懂,還不會(huì)的小伙伴快來看看吧2023-03-03
Python利用selenium建立代理ip池訪問網(wǎng)站的全過程
selenium控制瀏覽器也是可以使用代理ip的,下面這篇文章主要給大家介紹了關(guān)于Python利用selenium建立代理ip池訪問網(wǎng)站的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python實(shí)現(xiàn)刪除list列表重復(fù)元素的方法總結(jié)
在Python編程中,我們經(jīng)常需要處理列表中的重復(fù)元素,這篇文章為大家介紹了五種高效的方法來刪除列表中的重復(fù)元素,希望對(duì)大家有所幫助2023-07-07
Python內(nèi)建類型float源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python內(nèi)建類型float源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
OpenCV4.1.0+VS2017環(huán)境配置的方法步驟
這篇文章主要介紹了OpenCV4.1.0+VS2017環(huán)境配置的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

