Skip to content

Instantly share code, notes, and snippets.

@vipwp
Created October 28, 2013 20:43
Show Gist options
  • Select an option

  • Save vipwp/7204299 to your computer and use it in GitHub Desktop.

Select an option

Save vipwp/7204299 to your computer and use it in GitHub Desktop.

Revisions

  1. vipwp created this gist Oct 28, 2013.
    216 changes: 216 additions & 0 deletions wpa_qq
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,216 @@
    #!/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)