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)
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
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 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)
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 _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 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 _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
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()
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)
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')