Ejemplo n.º 1
0
    def __init__(self, account, password):
        # post paramenters
        self.account = account
        self.password = password

        #request header
        self.connect = ConnectHttp()
        self.headers = self.connect.headers
        self.captcha = Captcha(self.connect)
Ejemplo n.º 2
0
class QQLogin(object):

    '''login parameters'''
    params = {}

    connect = None

    def __init__(self, account, password):
        # post paramenters
        self.account = account
        self.password = password

        #request header
        self.connect = ConnectHttp()
        self.headers = self.connect.headers
        self.captcha = Captcha(self.connect)
        

    def login(self):
        self._initPage()

        loginStatus = self._login()
        if loginStatus[0] == '0' and loginStatus[1] == '0':
            self._login2()
        elif loginStatus[0] == '4' and loginStatus[1] == '3':
            # 验证码
            self._initPage()
            loginStatus = self._login()
        return self
 

    def _initPage(self):
        params = {'target':'self',
                'style':5,
                'miao_css':'m_webqq',
                'appid':1003903,
                'enable_qlogin':0,
                'no_verifyimg':1,
                's_url':'http://w.qq.com//loginproxy.html',
                'f_url':'loginerroralert',
                'strong_login':1,
                'login_state':10,
                't':'20120221001'}
        req = urllib2.Request('http://ui.ptlogin2.qq.com/cgi-bin/login?'+urllib.urlencode(params),None, self.headers)
        req.get_method = lambda: 'GET'
        operate = self.connect.open_url(req)
        inputs = InputLister()
        inputs.feed(''.join(operate.readlines()))
        logging.debug(inputs.items)
        self.params = inputs.items
        pass

    def _login(self):
        self.params.update({'u':self.account})
        #md5(md5_3(P.p.value) + K)
        if self.params.has_key('verifycode'):
            self.params.update( { 'p': qmd5.qqmd5(self.password, self.params['verifycode']) })
        else:
            vc = self.captcha.getVerifyCode(self.account)
            if vc[0] == '0':
                self.params.update({ 'verifycode':vc[1] }) 
                self.params.update({ 'p': qmd5.qqmd5(self.password, vc[1]) })
            elif vc[0] == '1':
                #当首次访问显示验证码地时候
                vcode = self.captcha.getImgVerifyCode(self.account)
                self.params.update({ 'verifycode':vcode }) 
                self.params.update({ 'p': qmd5.qqmd5(self.password, vcode) })
                pass
        import random
        qqActionLog = '%d-%d-%d' % (random.randint(2,9), random.randint(3,7), random.randint(2731,374463))
        self.params.update({'action': qqActionLog}) 
        self.params.update({'dumy':''}) 
        logging.debug(self.params)

        queryString = urllib.urlencode(self.params)
        logging.debug(queryString)

        req = urllib2.Request('http://ptlogin2.qq.com/login?'+queryString, None, self.headers);
        req.get_method = lambda: 'GET'
        operate = self.connect.open_url(req)
        exec_rt = ''.join(operate.readlines()).decode("utf-8").encode("utf-8")
        #ptuiCB('0','0','http://w.qq.com//loginproxy.html','0','登录成功!')
        logging.info(exec_rt)
        return eval('self._'+exec_rt.replace(';',''))

    def _ptuiCB(self, signal1, signal2, url, signal3, msg):
        return signal1,signal2,signal3

    def _login2(self):
        cookie = self.connect.getCookie('ptwebqq')
        logging.debug("ptwebqq: "+cookie)
        r='{"status":"online", "ptwebqq":"%s", "passwd_sig":"", "clientid":"17239126", "psessionid":null}' % cookie
        params = {'r':r,
                'clientid':17239126,
                }
        req = urllib2.Request('http://d.web2.qq.com/channel/login2',
                urllib.urlencode(params)+"&psessionid=null",
                self.headers)
        operate = self.connect.open_url(req)
        logging.debug(operate)
        resp = eval(''.join(operate))
        if resp['retcode'] == 0:
            self.connect.ticket.update(resp['result'])
            return 0
        else:
            return -1