Skip to content

Instantly share code, notes, and snippets.

@vipwp
Created October 28, 2013 20:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vipwp/7204299 to your computer and use it in GitHub Desktop.
Save vipwp/7204299 to your computer and use it in GitHub Desktop.
python wpa QQ
#!/usr/bin/env python
#coding:utf-8
"""
Author: --<>
Purpose:
Created: 2013-10-26
"""
import urllib
import urllib2
import re
import time
import random
import cookielib
import hashlib
UA = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31'
class QQ_WEB_CHAT():
START_URL = 'http://wpa.qq.com/msgrd?v=3&uin=%s&site=&menu=yes'
REG_STR_SIGS = 'tencent://message.*?sigT=(.*?)&sigU=(\w*)'
APP_ID = '716027604'
URL_VERIFY_IMG = 'http://captcha.qq.com/getimage?uin=%s&aid=%s&'
def __init__(self, qq, pwd):
self.cookies = cookielib.MozillaCookieJar('cookies.txt')
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
self.opener.addheaders = [
('Connection', 'keep-alive'),
('User-Agent', UA),
]
self.qq = qq
self.pwd = pwd
self.uu = None
def get_sigs(self, toqq = '162128428'):
self.tuin = toqq
url = QQ_WEB_CHAT.START_URL % toqq
ret = self.opener.open(url)
data = ret.read()
mat = re.search(QQ_WEB_CHAT.REG_STR_SIGS, data)
if mat:
self.sigT = mat.group(1)
self.sigU = mat.group(2)
return self.sigT, self.sigU
def hexchar2bin(self,uin):
uin_final = ''
uin = uin.split('\\x')
for i in uin[1:]:
uin_final +=chr(int(i, 16))
return uin_final
def get_password(self, verifyCode1, verifyCode2):
password_1 = hashlib.md5(self.pwd).digest()
password_2 = hashlib.md5(password_1 + self.hexchar2bin(verifyCode2)).hexdigest().upper()
password_final = hashlib.md5(password_2 + verifyCode1.upper()).hexdigest().upper()
return password_final
def dealVerifyImg(self, uin, ref=''):
if not uin:
return False, ''
try:
imgURL = QQ_WEB_CHAT.URL_VERIFY_IMG % (uin, QQ_WEB_CHAT.APP_ID) + str(random.random())[:-3]
req = urllib2.Request(imgURL, headers={'Referer':ref})
ret=self.opener.open(req)
imgData = ret.read()
if self.uu:
code = self.uu.getByCodeTypeAndBytes(imgData)
if code:
return True, code
else:
raise Exception('uu get verifycode error')
else:
import Image
import cStringIO
img = Image.open(cStringIO.StringIO(imgData))
img.show()
verifycode = raw_input('Input the verifyCode:')
return True,verifycode
except Exception as e:
return False, str(e)
def login(self):
url = 'http://connect.qq.com/widget/wpa/login.html?tuin=%s&sigT=%s&sigU=%s' \
% (self.tuin, self.sigT, self.sigU)
ret = self.opener.open(url)
query_string = {
'appid':'716027604',
'style':'12',
'dummy':'1',
's_url':url,
}
url2 = 'http://ui.ptlogin2.qq.com/cgi-bin/login' + '?' + urllib.urlencode(query_string)
ret = self.opener.open(url2)
data = ret.read()
self.login_sig = re.search('login_sig:"(.*?)"', data).group(1)
form_data = {
'regmaster':'',
'uin':self.qq,
'appid':'716027604',
'js_ver': '10050',
'js_type': '1',
'login_sig':self.login_sig,
#u1 http://connect.qq.com/widget/wpa/chat.html?tuin=3386212&sigT=9c5c205eb06f6b19d82214aaa8495fe988a437209eef070596582e9cdee661f8d35d25a09f318088b5136786b85f3566&sigU=1cd7626bf3b591cba38cc45b28320aa945e71722ff7bb16bad39030f450abbc33281c5fa4561a931
"u1":url,
'r':str(random.random()),
}
check_url = 'http://check.ptlogin2.qq.com/check' + '?' + urllib.urlencode(form_data)
req = urllib2.Request(check_url, headers={
'Referer':url2,
})
ret = self.opener.open(req)
data = ret.read()
print data
content = data.split(',')
verifyCode1 = content[1][1:-1]
verifyCode2 = content[2].split("'")[1]
if len(verifyCode1) != 4:
time.sleep(2)
verify_code = self.dealVerifyImg(self.qq, check_url)[1]
else:
verify_code = verifyCode1
form_data = {
'u': self.qq,
'p':self.get_password(verifyCode1, verifyCode2),
'verifycode': verify_code,
'aid':QQ_WEB_CHAT.APP_ID,
'u1': url2,
'h':'1',
'ptredirect':'1',
'ptlang':'2052',
'from_ui':'1',
'dumy':'',
'low_login_enable':'0',
'regmaster':'',
'fp':'loginerroralert',
'action':'2-22-%s' % int(time.time() * 1000),
'mibao_css':'',
't':'1',
'g':'1',
#'js_ver':'10050',
#'js_type':'1',
'login_sig': self.login_sig,
'pt_rsa':'0',
}
login_url = 'http://ptlogin2.qq.com/login' + '?' + urllib.urlencode(form_data)
req = urllib2.Request(login_url, headers={
'Referer':check_url,
})
ret = self.opener.open(req)
data = ret.read()
print data.decode('u8')
def send_msg(self, tqq, msg):
form_data = {
'pkg_num':'1',
'index':'0',
#'msg_0':'[{"t":0,"text":"sss"},{"t":0,"text":"hello mesg"}]',
'msg_0':'[{"t":0,"text":"%s"}]' % msg,
'sigt':self.sigT,
'sigui':self.sigU,
'tuin':tqq,
'clientid':str(int(time.time())),
}
req = urllib2.Request(
'https://d.connect.qq.com/webim/user/send',
data=data_encode(form_data),
headers={
'Origin': 'https://d.connect.qq.com',
'Referer': 'https://d.connect.qq.com/proxy/sslproxy.html',
}
)
ret = self.opener.open(req)
data = ret.read().decode('u8')
print data
def data_encode(dic):
save = '@,'
return '&'.join(['%s=%s' % (urllib.quote(k, save), urllib.quote(dic[k], save)) for k in dic])
if __name__ == '__main__':
#tuin = '3386212'
#start_url = 'http://wpa.qq.com/msgrd?v=3&uin=%s&site=&menu=yes' % tuin
#reg_str = 'tencent://message.*?sigT=(.*?)&sigU=(\w*)'
#ret = urllib.urlopen(start_url).read()
#print re.search(reg_str, ret).groups()
qq = QQ_WEB_CHAT('2804679709', 'uu888888')
qq.get_sigs(toqq='3386212')
qq.login()
l = ['2069867481', '3386212', '2981159426']
for q in l:
qq.send_msg(q, '你好, 我是测试等等罅隙')
time.sleep(2)
while(True):
msg = str(raw_input('>>>'))
qq.send_msg('2812291947', msg)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment