Пример #1
0
 def to_curl(self):
     method = self.method.upper()
     if self.cookies:
         try:
             cookies = SmartCookie(self.cookies)
         except Exception:
             pass
         else:
             # The Cookie header is already yanked out of the headers dict
             # inside `to_python` so we can just safely re-set it.
             self.headers['Cookie'] = ';'.join(
                 c.output(attrs=[], header='')
                 for c in cookies.values()).strip()
     bits = []
     if method != 'GET':
         bits.append('-X' + method)
         data = self.data
         if isinstance(data, dict):
             data = urlencode(format_body(data))
         if isinstance(data, basestring):
             bits.append('--data ' + quote(data))
     bits.append(quote(self.full_url))
     for header in self.headers.iteritems():
         bits.append('-H ' + quote('%s: %s' % header))
     if 'gzip' in self.headers.get('Accept-Encoding', ''):
         bits.append('--compressed')
     return 'curl ' + ' '.join(bits)
Пример #2
0
	def fromRawString(raw):
		try:
			sc = SmartCookie(raw)
			for key, cookie in sc.items():
				try:
					return Cookie(key, cookie['domain'], cookie['path'], raw, cookie['expires'], True)
				except:
					return None
		except CookieError as e:
			print e
			return None
Пример #3
0
 def fromRawString(raw):
     try:
         sc = SmartCookie(raw)
         for key, cookie in sc.items():
             try:
                 return Cookie(key, cookie['domain'], cookie['path'], raw,
                               cookie['expires'], True)
             except:
                 return None
     except CookieError as e:
         print e
         return None
Пример #4
0
Файл: api.py Проект: cadim/pyqq
	def _prelogin(self):
		url = 'http://ptlogin2.qq.com/login'
		params = {
			'u':self.id,
			'p':self.encodepwd,
			'verifycode':self.verify,
			'u1':'http://web2.qq.com/loginproxy.html?strong=true',
			'remember_uin':1,
			'aid':1003903,
			'h':1,
			'ptredirect':0,
			'ptlang':2052,
			'from_ui':1,
			'pttype':1,
			'dumy':'',
			'fp':'loginerroralert',
	    }
		self.cookies['verifysession'] = self.verify
		Headers['Cookie']=self.cookies.output()
		resp,content = Get(url,params=params,headers=Headers)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CB.match(content)
		if int(match.group('one')) == 0:
			return True
		else:
			return False
Пример #5
0
 def to_curl(self):
     method = self.method.upper()
     if self.cookies:
         try:
             cookies = SmartCookie(self.cookies)
         except Exception:
             pass
         else:
             # The Cookie header is already yanked out of the headers dict
             # inside `to_python` so we can just safely re-set it.
             self.headers['Cookie'] = ';'.join(c.output(attrs=[], header='') for c in cookies.values()).strip()
     bits = []
     if method != 'GET':
         bits.append('-X' + method)
         data = self.data
         if isinstance(data, dict):
             data = urlencode(format_body(data))
         if isinstance(data, basestring):
             bits.append('--data ' + quote(data))
     bits.append(quote(self.full_url))
     for header in self.headers.iteritems():
         bits.append('-H ' + quote('%s: %s' % header))
     if 'gzip' in self.headers.get('Accept-Encoding', ''):
         bits.append('--compressed')
     return 'curl ' + ' '.join(bits)
Пример #6
0
    def _prelogin(self):
		url = 'http://ptlogin2.qq.com/login'
		params = {
			'u':self.id,
			'p':self.encodepwd,
			'verifycode':self.verify,
			'u1':'http://web2.qq.com/loginproxy.html?strong=true',
			'remember_uin':1,
			'aid':1003903,
			'h':1,
			'ptredirect':0,
			'ptlang':2052,
			'from_ui':1,
			'pttype':1,
			'dumy':'',
			'fp':'loginerroralert',
	    }
		self.cookies['verifysession'] = self.verify
		Headers['Cookie']=self.cookies.output()
		resp,content = Get(url,params=params,headers=Headers)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CB.match(content)
		if int(match.group('one')) == 0:
			return True
		else:
			return False
Пример #7
0
Файл: api.py Проект: cadim/pyqq
	def _check(self):
		url = 'http://ptlogin2.qq.com/check'
		params = {
		    'uin':self.id,
			'appid':1003903
		}
		resp, content = Get(url,params = params,headers=Headers)  
		logging.info('check:%s',content)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CheckVC.match(content)
		self.verify = match.group('content')
		return int(match.group('status')),self.verify
Пример #8
0
    def _check(self):
		url = 'http://ptlogin2.qq.com/check'
		params = {
		    'uin':self.id,
			'appid':1003903
		}
		resp, content = Get(url,params = params,headers=Headers)  
		logging.info('check:%s',content)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CheckVC.match(content)
		self.verify = match.group('content')
		return int(match.group('status')),self.verify
Пример #9
0
Файл: api.py Проект: cadim/pyqq
	def _channel_poll2(self):
	    url = 'http://d.web2.qq.com/channel/poll2'  
	    params ={
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,
	        't':int(time.time()),
	        'vfwebqq':self.vfwebqq
	    }  
	    Headers['Cookie'] = getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies=Cookie(resp.get('set-cookie','')) 
	    print resp
	    print content
Пример #10
0
    def _channel_poll2(self):
	    url = 'http://d.web2.qq.com/channel/poll2'  
	    params ={
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,
	        't':int(time.time()),
	        'vfwebqq':self.vfwebqq
	    }  
	    Headers['Cookie'] = getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies=Cookie(resp.get('set-cookie','')) 
	    print resp
	    print content
Пример #11
0
	def getCookies(self): 
		"""	req.getCookies()-> dict

			returns  a dictionary of cookies. 
		"""
		if self.cookies is None:
			cookies = self.getEnviron(self.impl.getCookieKey(), '')
			if cookies:
				from Cookie import SmartCookie
				self.cookies = SmartCookie()
				self.cookies.load(cookies)
			else:
				self.cookies = {}
		return self.cookies
Пример #12
0
    def _channel_poll(self):
	    url = 'http://web2-b.qq.com/channel/poll'  
	    params = {
	        'clientid':self.clientid, 
	        'psessionid':self.psessionid,
	        't':int(time.time())
	    } 
	    Headers['Cookie']=getcookiestr(self.cookies) 
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies = Cookie(resp.get('set-cookie','')) 
	    content_dict= json.loads(content)   
	    if resp['status'] == '200' and content_dict['retcode'] == 0:
	        return content_dict['result']
	    else:
	        logging.error('resp:%s,content:%s',str(resp),content)
	        return None 
Пример #13
0
Файл: api.py Проект: cadim/pyqq
class QQ(object):
    
	def __init__(self,id,passwd):
		self.id = id
		self.passwd = passwd
		self.msg_count = 1
		self.clientid = get_clientid()  
		self.logined = False
	
	@property
	def encodepwd(self):
		return pwd_encode(self.passwd,self.verify)
	
	

	def _check(self):
		url = 'http://ptlogin2.qq.com/check'
		params = {
		    'uin':self.id,
			'appid':1003903
		}
		resp, content = Get(url,params = params,headers=Headers)  
		logging.info('check:%s',content)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CheckVC.match(content)
		self.verify = match.group('content')
		return int(match.group('status')),self.verify
		
	def _prelogin(self):
		url = 'http://ptlogin2.qq.com/login'
		params = {
			'u':self.id,
			'p':self.encodepwd,
			'verifycode':self.verify,
			'u1':'http://web2.qq.com/loginproxy.html?strong=true',
			'remember_uin':1,
			'aid':1003903,
			'h':1,
			'ptredirect':0,
			'ptlang':2052,
			'from_ui':1,
			'pttype':1,
			'dumy':'',
			'fp':'loginerroralert',
	    }
		self.cookies['verifysession'] = self.verify
		Headers['Cookie']=self.cookies.output()
		resp,content = Get(url,params=params,headers=Headers)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CB.match(content)
		if int(match.group('one')) == 0:
			return True
		else:
			return False
			
	def _channel_login(self):
		url = 'http://web2-b.qq.com/channel/login'
		self.cookies['notifyNewApp'] = 1
		self.cookies['pgv_pvid'] = 1935756508
		self.cookies['pgv_flv'] = '10.1 r103'
		self.cookies['pgv_info'] = 'pgvReferrer=&ssid=s471232060'
		Headers['Cookie']=getcookiestr(self.cookies)
		Headers['Content-Type']='application/x-www-form-urlencoded'
		Headers['Proxy-Connection'] = 'keep-alive'
		Headers['Referer'] = 'http://web2-b.qq.com/proxy.html?v=20101025002'
		Headers['Origin'] = 'http://web2-b.qq.com'
		Headers['Accept-Encoding'] = 'gzip,deflate,sdch'
		
		body =r"r=%7B%22status%22%3A%22%22%2C%22ptwebqq%22%3A%22"+self.cookies['ptwebqq'].value+r"%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22"+self.clientid+r"%22%7D"
		resp,content = Post(url,body=body,headers=Headers)
		#self.cookies = Cookie(resp.get('set-cookie',''))
		login_data = json.loads(content)    
		if login_data['retcode'] == 0:
		    self.psessionid = login_data['result']['psessionid']
		    self.vfwebqq = login_data['result']['vfwebqq']   
		    return True 
		else:          
		    return False 
		    
	def login(self): 
	    self._check()
	    self._prelogin()
	    self._channel_login() 
	    self.logined = True 
	    time.sleep(1)      
	
	def logout(self): 
	    logging.info('not implement')
	
	def status(self):
	    logging.info('not implement')
	    return {}
	    
	    
	def send(self,to,msg):
	    return self._sendmsg(to,msg) 
	    
	def invite(self,to,msg):
	    self._add_need_verify(to,msg)
	
	def poll(self,state_callback=None,message_callback=None):   
	    '''  
	    buddies_status_changed json:
	    {'poll_type': 'buddies_status_change', 'value': {'status': 'online', 'client_type': 1, 'uin': 50662227}}
	    '''
	    content =  self._channel_poll()  
	    if content:          
	        for item in content: 
	            type = item['poll_type']
	            if type == 'buddies_status_change' and state_callback:
	                value = item['value']
	                status = value['status']
	                uid = value['uin']
	                state_callback(uid,status)  
	            elif type == 'group_message' and message_callback:  
	                qid = item['value']['group_code']
	                uid = item['value']['send_uin'] 
	                msgs = []
	                for row in item['value']['content']:    
	                    if isinstance(row,str) or isinstance(row,unicode):
	                        msgs.append(row) 
	                msg = u' '.join(msgs) 
	                message_callback(qid,uid,msg)
	            else:
	                logging.debug('unkonwn type <%s>',type) 
   
	 

	                
 
	 
	    
	    	    
		    
		
	def _sendmsg(self,to,msg):
		url = 'http://web2-b.qq.com/channel/send_msg'
		send = {}
		send['to']=to
		send['face']=0
		content = []
		content.append(msg)
		msg_config = []
		msg_config.append('font')
		msg_config.append({"name":"\xe5\xae\x8b\xe4\xbd\x93",
		                   "size":"10",
						   "style":[0,0,0],
						   "color":"000000"})
		content.append(msg_config)
		
		send['content']=json.dumps(content)
		send['msg_id'] = get_msgid(self.msg_count)
		send['clientid'] = self.clientid
		send['psessionid'] = self.psessionid
		r = urllib.quote(json.dumps(send))
		body = r'r=%s' % r
		Headers['Cookie']=getcookiestr(self.cookies)
		resp,content = Post(url,body=body,headers=Headers)
		content_dict= json.loads(content)
		if resp['status'] == '200' and content_dict['retcode'] == 0:
		    logging.info('send msg to %d successs!',to)
		    return True                               
		else:
		    logging.error('send msg to %d failure!',to)
		    logging.error('resp:%s content:%s',str(resp),str(content))
		    return False
                                 

		
	
	def _add_need_verify(self,toid,message):
	    url = 'http://web2-b.qq.com/api/add_need_verify'   
	    Headers['Cookie']=getcookiestr(self.cookies)  
	    params  = {
	        'tuin':toid,
	        'myallow':1,
	        'groupid':0,
	        'msg':message,
	        'vfwebqq':self.vfwebqq,
	    }     
	    body = 'r='+json.dumps(params)
	    resp, content = Post(url,body =body,headers=Headers) 
	    
	    
	def _channel_poll(self):
	    url = 'http://web2-b.qq.com/channel/poll'  
	    params = {
	        'clientid':self.clientid, 
	        'psessionid':self.psessionid,
	        't':int(time.time())
	    } 
	    Headers['Cookie']=getcookiestr(self.cookies) 
	    resp,content = Get(url,params=params,headers=Headers) 
	    
	    self.cookies = Cookie(resp.get('set-cookie','')) 
	    content_dict= json.loads(content)   
	    if resp['status'] == '200' and content_dict['retcode'] == 0:
	        return content_dict['result']
	    else:
	        logging.error('resp:%s,content:%s',str(resp),content)
	        return None 
	
	def _channel_poll2(self):
	    url = 'http://d.web2.qq.com/channel/poll2'  
	    params ={
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,
	        't':int(time.time()),
	        'vfwebqq':self.vfwebqq
	    }  
	    Headers['Cookie'] = getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies=Cookie(resp.get('set-cookie','')) 
	    print resp
	    print content
	
	def _get_single_info2(self):
	    pass
  
	    
	      
		
	def _get_user_friends(self):
		url = 'http://web2-b.qq.com/api/get_user_friends'
		params={
		    'h':'hello',
		    'vfwebqq':self.vfwebqq
		}                         
		body = 'r='+json.dumps(params) 
		Headers['Cookie']=getcookiestr(self.cookies) 
		resp,content = Post(url,body=body,headers=Headers) 
		content_dict= json.loads(content)
		if resp['status'] == '200' and content_dict['retcode'] == 0:
		    return content_dict['result']
		else:
		    logging.error('resp:%s,content:%s',str(resp),content) 
		    return None
	
	def _get_online_buddies(self):
	    url = 'http://web2-b.qq.com/channel/get_online_buddies'
	    params = {
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,  
	        't':int(time.time())  
	    }      
	    Headers['Cookie']=getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    content_dict= json.loads(content) 
	    if resp['status'] == '200' and content_dict['retcode'] == 0:   
	        return content_dict['result']
	    else:
	        logging.error('resp:%s,content:%s',str(resp),content)
	        return None 
	    
		
	def get_all_friends(self):
	    return self._get_user_friends()   
	    
	def get_online_friends(self):
	    return self._get_online_buddies()
Пример #14
0
class ServiceRequest(RequestIO):
	""" Bridge class for a http service Request """
	inputs = None
	inputSeq = None
	inputDict = None
	cookies = None
	environ = None
	_session = None
	
	def __init__(self, implClass, req=None):
		RequestIO.__init__(self)
		self.impl = implClass()
		self.impl.setup(self, req)
		self.response=""
		self.status = self.getStatusCode(200)



	def __call__(self): 
		return self

	def pso(self):
		" returns proxy to pso object "
		return self

	def getOutStream(self):
		return self.impl.getOutStream()

	def getInStream(self):
		return self.impl.getInStream()

	def setup(self, serviceHandler, reqHandler): pass

	def close(self):
		RequestIO.close(self)
		if self._session is not None:
			self._session.save(self)
		
	#
	# basics
	#

	def getStatusCode(self, code):
		self.impl.getStatusCode(code)

	

	#
	#  environ
	#
	def getEnviron(self,  key=None, default = None): 
		"""	if key is not given returns a dict of 	
			the server environment.
			Otherwise returns the entry for key.
			If no entry is found returns None or default if given. 
		"""
		if self.environ is None:
			self.environ = self.impl.getEnviron(self)
		if key is None:
			return self.environ
		return self.environ.get(key, default)
	
	def setEnviron(self, key, value):
		self.getEnviron()[key] = value
	#
	#
	#



	#
	#
	# Session handling
	#	
	def getSession(self, sessionImplClass = CookieFileImpl, **parameters): 
		""" 	returns the current session. The session implentation
		    	class may be passed to sessionImplClass, which if None
			defaults to CookieFileImpl. The method can be passed keyword
			arguments which will be treated as HTTP directives
		"""
		if sessionImplClass:
			for k,v in parameters.items():
				self.setEnviron(k, v)
			self._session = Session(self, sessionImplClass())
			if self._session.isNew():
			    self.setSession(self._session)
		return self._session

        def setSession(self, session):
		self.impl.setSession(self, session)
	session = {} #property(getSession,setSession)

	

	#
	# Cookie handling
	#

	def getCookieKey(self):
		return self.impl.getCookieKey()
		
	def getCookies(self): 
		"""	req.getCookies()-> dict

			returns  a dictionary of cookies. 
		"""
		if self.cookies is None:
			cookies = self.getEnviron(self.impl.getCookieKey(), '')
			if cookies:
				from Cookie import SmartCookie
				self.cookies = SmartCookie()
				self.cookies.load(cookies)
			else:
				self.cookies = {}
		return self.cookies

		
	def getCookie(self, key, default=None): 
		"""	returns the cookie requested by 
			key otherwise returns default,
			if default is not given returns None.
		"""
		return self.getCookies().get(key, default)

	def setCookie(self, key, value, **attrs):
		"""	sets cookie, key, to value.
			Also will set any attributes given.
			e.g. request.setCookie("login",name, comment="user id") 
		"""
		cookiefmt = "%s=%s;"
		cookie = cookiefmt % (key, value)
		for k,v in attrs.items():
			cookie += cookiefmt % (k, v)
		self.addHeaderOut('set-cookie', cookie)

	def send_http_header(self, content_type='text/html'):
		"""	send to stdout the content headers. Each on a seperate line.
			contenttype has not been set it will default to 'text/html'. 
			Then send an extra newline
		"""
		#print
		if not self.getHeadersOut().has_key('content-type'):
			if not self.getHeadersOut().has_key('location'):
				if not self.getHeadersOut().has_key('status'):
					self.getHeadersOut()['content-type'] =  content_type
		self.impl.syncHeadersOut(self.getHeadersOut())
		self.headersSent()
		self.impl.send_http_header(self)
		self.flush()


	#
	# Control
	#

	def redirect(self, url, permanent=0):
		"""
			force an imediate redirect to given url.
		"""
		
		self.impl.redirect(self, url, permanent)

	def setStatus(self, status):
		"""
			set the HTTP return status. 
			This normally defaults to 200.
		"""
		self.setHeaderOut('status', status)

	def sendStatus(self, status):
		"""
			set the HTTP return status. 
			This normally defaults to 200.
		"""
		self.setStatus(status)
		self.impl.sendStatus(status)

	#
	# Input
	#
	def hasInput(self, key):
		"""req.hasInput(key) -> 1 | 0
		tests if a field in a form was filled.
		"""
		return self.getInputs().has_key(key)

	def hasInputs(self, *keys):
		return [key for key in keys if key in self.getInputs().keys()]
			
			

	def getInputs(self, key=None):
		"""req.getInput(key) -> FiledStorage| List of Fields
		if key is given will return a list of fields values for that key.
		if there are no values an empty list is returned.
		if no key is given returns the cgi.FieldStorage object.
		"""
		if not self.inputs:
			self.inputs = self.impl.getInputs(self)
		if not key:
			return self.inputs
		if hasattr(self.inputs, 'getlist'):
			return self.inputs.getlist(key)
		else:
			if self.inputs.has_key(key):	
				value =  self.inputs.getvalue(key)
				if value and type(value) is type([]):
					return value 
				else:
					return [value] 
			return []
			

	def getInputSeq(self):
		if not self.inputSeq:
			self.inputSeq=[]
			for key in self.getInputs().keys():
				values = self.getInputs(key)
				for value in values:
					self.inputSeq.append((key, value))
		return self.inputSeq
	def getInputDict(self):
		if not self.inputDict:
			self.inputDict={}
			for key in self.getInputs().keys():
				self.inputDict[key] = self.getInputs(key)
		return self.inputDict
			
	def getInput(self, key, default=None, index=None):
		"""req.getInput(key) -> String | default
			returns the given form field value as a String.
			If there are multiple values under the same key, 
			it will return the first in the list, unless index is given.
			If no value is found will return "", unless default is given.
		"""
		if not index:
			index =0
		try:
			return 	self.getInputs(key)[index]
		except:
		#	import traceback
		#	traceback.print_exc()
			return default
		
	def getFile(self, key, default=None):
		"""req.getFile(fieldname)-> Field
		returns an uploaded file. The filed has the usual cgi.Field members plus
		filename -  the given file name
		file -  the actual file uploaded
		tempname - is None until keep() is called.
		the methods:
		keep() - The file object is a temporay file 
			that will be deleted when the cgi terminates. keep asigns the file a 
			a temp file name.
		save(name) -  This method can be used to save the tempfile under the given name.
		"""
		if self.hasInput(key):
			file = self.getInputs()[key]
			if file.filename:
				file.__class__.tempname= None
				file.__class__.keep= keep
				file.__class__.save= save
				return file
		return default

	#
	# Utilities
	#
	_url = None
	def getUrl(self):
		if self._url is None:
			self._url= Url("http://%(HTTP_HOST)s%(REQUEST_URI)s" % self.getEnviron())
		return self._url

	#url = property(getUrl)

	def uriParts(self):
		if not Url:
			raise 'under mod_python urlparse has problems'
		url  = "http://%(HTTP_HOST)s%(REQUEST_URI)s" % self.getEnviron() 
		parts = list(urlparse(url))
		info_path = self.getEnviron('PATH_INFO','')
		path=parts[2]
		if info_path: 
			path,dummy = path.split(info_path)
		indx = path.rfind('/')
		if indx > -1:
			script = path[indx:]
			path = path[:indx]
		else:
			script = path
			path=''
		parts[2] = path
		parts.insert(3, script)
		parts.insert(4,  info_path)
		return parts


	def buildUri(self, parts, clean, **kws):
		query={}
		i = 0
		for key in ('scheme', 'netloc', 'path', 'script','pathinfo', 'param', 'fragment'):
			if kws.has_key(key):
				parts[i] = kws[key]
				del kws[key]
			i += 1

		if clean:
			 parts[6] =''
		qs = parts[6]
		if qs:
			if type((qs)) ==type(''):
			# now for QS key, values:
			#
				querySeq = parts[6].split('&')
				querySeq= map(lambda x: x.split('='), querySeq)
				for k,v in querySeq:
					if query.has_key(k):
						query[k].append(v)
					else:
						query[k] = [v]
		querySeq=[]
		query.update(kws)
		if query:
			for key,values in query.items():
				if type(values) == type([]):
					for value in values:
						querySeq.append((key, value))
				else:	
					querySeq.append((key, values))
			query = urlencode(querySeq, doseq=1)
		else:
			query = parts[6]
		if parts[4]:
			parts[2]= "%s%s%s"  %  tuple(parts[2:5])
		else:
			parts[2]= "%s%s"  %  tuple(parts[2:4])

		del parts[3:5]
		parts[4]= query
		return urlunparse(parts)
		
	def serviceUri(self, clean=1, **kws):
		parts = list(self.uriParts())
		url =  self.buildUri(parts, clean, **kws)
		return url

	def baseUri(self):
		parts = list(self.uriParts())
		return "%s://%s%s/" % tuple(parts[:3])
		
	def pageUri(self, page): 
		return self.baseUri() + page


	def log(self, *args):
		args = map(str, args)
		post = "\n%s: %s" % ( time.ctime(), ' '.join(args))
		try:
			sys.stderr.write(post)
		except:
			import traceback
			traceback.print_exc(file=self.stderr)
Пример #15
0
class QQ(object):
    
    events = {  
        'status_change':None,
        'receive_group_message':None,
        'receive_message':None,        
    }
    
    def __init__(self,id,passwd):
		self.id = id
		self.passwd = passwd
		self.msg_count = 1
		self.clientid = get_clientid()  
		self.logined = False
	
    @property
    def encodepwd(self):
		return pwd_encode(self.passwd,self.verify)
	                                               
	
	

    def _check(self):
		url = 'http://ptlogin2.qq.com/check'
		params = {
		    'uin':self.id,
			'appid':1003903
		}
		resp, content = Get(url,params = params,headers=Headers)  
		logging.info('check:%s',content)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CheckVC.match(content)
		self.verify = match.group('content')
		return int(match.group('status')),self.verify
		
    def _prelogin(self):
		url = 'http://ptlogin2.qq.com/login'
		params = {
			'u':self.id,
			'p':self.encodepwd,
			'verifycode':self.verify,
			'u1':'http://web2.qq.com/loginproxy.html?strong=true',
			'remember_uin':1,
			'aid':1003903,
			'h':1,
			'ptredirect':0,
			'ptlang':2052,
			'from_ui':1,
			'pttype':1,
			'dumy':'',
			'fp':'loginerroralert',
	    }
		self.cookies['verifysession'] = self.verify
		Headers['Cookie']=self.cookies.output()
		resp,content = Get(url,params=params,headers=Headers)
		self.cookies = Cookie(resp.get('set-cookie',''))
		match = CB.match(content)
		if int(match.group('one')) == 0:
			return True
		else:
			return False
			
    def _channel_login(self):
		url = 'http://web2-b.qq.com/channel/login'
		self.cookies['notifyNewApp'] = 1
		self.cookies['pgv_pvid'] = 1935756508
		self.cookies['pgv_flv'] = '10.1 r103'
		self.cookies['pgv_info'] = 'pgvReferrer=&ssid=s471232060'
		Headers['Cookie']=getcookiestr(self.cookies)
		Headers['Content-Type']='application/x-www-form-urlencoded'
		Headers['Proxy-Connection'] = 'keep-alive'
		Headers['Referer'] = 'http://web2-b.qq.com/proxy.html?v=20101025002'
		Headers['Origin'] = 'http://web2-b.qq.com'
		Headers['Accept-Encoding'] = 'gzip,deflate,sdch'
		
		body =r"r=%7B%22status%22%3A%22%22%2C%22ptwebqq%22%3A%22"+self.cookies['ptwebqq'].value+r"%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22"+self.clientid+r"%22%7D"
		resp,content = Post(url,body=body,headers=Headers)
		#self.cookies = Cookie(resp.get('set-cookie',''))
		login_data = json.loads(content)    
		if login_data['retcode'] == 0:
		    self.psessionid = login_data['result']['psessionid']
		    self.vfwebqq = login_data['result']['vfwebqq']   
		    return True 
		else:          
		    return False 
		    
    def login(self): 
	    self._check()
	    self._prelogin()
	    self._channel_login() 
	    self.logined = True 
	    time.sleep(1)      
	
    def logout(self): 
	    logging.info('not implement')
	
    def status(self):
	    logging.info('not implement')
	    return {}
	    
	    
    def send(self,to,msg):
	    return self._sendmsg(to,msg) 
	    
    def invite(self,to,msg):
	    self._add_need_verify(to,msg)
	
    def poll(self):
        if not self.logined:   
            raise Exception('qq must be logined') 
        else:
            pass 
	    '''  
	    buddies_status_changed json:
	    {'poll_type': 'buddies_status_change', 'value': {'status': 'online', 'client_type': 1, 'uin': 50662227}}
	    '''  

	    content =  self._channel_poll()  
	    if content:      
	        for item in content: 
	            type = item['poll_type']
	            if type == 'buddies_status_change' and self.events.has_key('status_change'):
	                value = item['value']
	                status = value['status']
	                uid = value['uin']
	                self.events['status_change'](uid,status)
	            elif type == 'group_message' and self.events.has_key('receive_group_message'):  
	                qid = item['value']['group_code']
	                uid = item['value']['send_uin'] 
	                msgs = []
	                for row in item['value']['content']:    
	                    if isinstance(row,str) or isinstance(row,unicode):
	                        msgs.append(row) 
	                msg = u' '.join(msgs) 
	                self.events['receive_group_message'](qid,uid,msg)
	            elif type == 'message' and self.events.has_key('receive_message'):
	                uid = item['value']['from_uin']
	                message=item['value']['raw_content']
	                self.events['receive_message'](uid,message)
	            else:
	                logging.debug('unkonwn type <%s>',type) 
   
	 

	                
 
	 
	    
	    	    
		    
		
    def _sendmsg(self,to,msg):
		url = 'http://web2-b.qq.com/channel/send_msg'
		send = {}
		send['to']=to
		send['face']=0
		content = []
		content.append(msg)
		msg_config = []
		msg_config.append('font')
		msg_config.append({"name":"\xe5\xae\x8b\xe4\xbd\x93",
		                   "size":"10",
						   "style":[0,0,0],
						   "color":"000000"})
		content.append(msg_config)
		
		send['content']=json.dumps(content)
		send['msg_id'] = get_msgid(self.msg_count)
		send['clientid'] = self.clientid
		send['psessionid'] = self.psessionid
		r = urllib.quote(json.dumps(send))
		body = r'r=%s' % r
		Headers['Cookie']=getcookiestr(self.cookies)
		resp,content = Post(url,body=body,headers=Headers)
		content_dict= json.loads(content)
		if resp['status'] == '200' and content_dict['retcode'] == 0:
		    logging.info('send msg to %d successs!',to)
		    return True                               
		else:
		    logging.error('send msg to %d failure!',to)
		    logging.error('resp:%s content:%s',str(resp),str(content))
		    return False
                                 

		
	
    def _add_need_verify(self,toid,message):
	    url = 'http://web2-b.qq.com/api/add_need_verify'   
	    Headers['Cookie']=getcookiestr(self.cookies)  
	    params  = {
	        'tuin':toid,
	        'myallow':1,
	        'groupid':0,
	        'msg':message,
	        'vfwebqq':self.vfwebqq,
	    }     
	    body = 'r='+json.dumps(params)
	    resp, content = Post(url,body =body,headers=Headers) 
	    
	    
    def _channel_poll(self):
	    url = 'http://web2-b.qq.com/channel/poll'  
	    params = {
	        'clientid':self.clientid, 
	        'psessionid':self.psessionid,
	        't':int(time.time())
	    } 
	    Headers['Cookie']=getcookiestr(self.cookies) 
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies = Cookie(resp.get('set-cookie','')) 
	    content_dict= json.loads(content)   
	    if resp['status'] == '200' and content_dict['retcode'] == 0:
	        return content_dict['result']
	    else:
	        logging.error('resp:%s,content:%s',str(resp),content)
	        return None 
	
    def _channel_poll2(self):
	    url = 'http://d.web2.qq.com/channel/poll2'  
	    params ={
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,
	        't':int(time.time()),
	        'vfwebqq':self.vfwebqq
	    }  
	    Headers['Cookie'] = getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    self.cookies=Cookie(resp.get('set-cookie','')) 
	    print resp
	    print content
	
    def _get_single_info2(self):
	    pass
  
	    
	      
		
    def _get_user_friends(self):
		url = 'http://web2-b.qq.com/api/get_user_friends'
		params={
		    'h':'hello',
		    'vfwebqq':self.vfwebqq
		}                         
		body = 'r='+json.dumps(params) 
		Headers['Cookie']=getcookiestr(self.cookies) 
		resp,content = Post(url,body=body,headers=Headers) 
		content_dict= json.loads(content)
		if resp['status'] == '200' and content_dict['retcode'] == 0:
		    return content_dict['result']
		else:
		    logging.error('resp:%s,content:%s',str(resp),content) 
		    return None
	
    def _get_online_buddies(self):
	    url = 'http://web2-b.qq.com/channel/get_online_buddies'
	    params = {
	        'clientid':self.clientid,
	        'psessionid':self.psessionid,  
	        't':int(time.time())  
	    }      
	    Headers['Cookie']=getcookiestr(self.cookies)
	    resp,content = Get(url,params=params,headers=Headers) 
	    content_dict= json.loads(content) 
	    if resp['status'] == '200' and content_dict['retcode'] == 0:   
	        return content_dict['result']
	    else:
	        logging.error('resp:%s,content:%s',str(resp),content)
	        return None 
	    
		
    def get_all_friends(self):
	    return self._get_user_friends()   
	    
    def get_online_friends(self):
	    return self._get_online_buddies() 
	    
    def register(self,event,callback):
	    if self.events.has_key(event):
	        self.events[event]=callback
	    else:
	        raise Exception('no such event')