def proc_event(req): event = req['Event'] if event == 'subscribe': log.info('proc_event|%s|subscribe' , req['FromUserName']) resp = {} resp['ToUserName'] = req['FromUserName'] resp['FromUserName'] = req['ToUserName'] resp['CreateTime'] = int(time.time()) resp['MsgType'] = 'text' resp['Content'] = '欢迎使用\n'+HELP return Dict2XMLTagText().toxml(resp) elif event == 'unsubscribe': log.info('proc_event|%s|unsubscribe' , req['FromUserName']) else: log.warning('proc_event|nuknown event %s|%s' , event ,req['FromUserName']) return event
def _init_session(self): url = "http://www.simsimi.com/talk.htm?lc=ch" self.session = requests.Session() self.session.headers.update(Headers) #get cooket r = self.session.get(url ) #, timeout = 3) keys = r.cookies.keys() if 'AWSELB' in keys and 'JSESSIONID' in keys: self.session.cookies.update( r.cookies ) self.session.cookies['sagree'] = 'true' self.session.cookies['selected_nc'] = 'ch' log.info('SimSimi _init_session succ...') else: log.warning('SimSimi _init_session fail... try again') time.sleep(0.1) self.session = None self._init_session()
def chat(self, msg = ''): #only for utf-8 msg = msg.strip() if msg: #最多循环5次 for i in range(5): rsp = self._get_resp(msg) if rsp: return rsp log.warning('SimSimi.chat _get_resp failed') #重新初始化 log.warning('SimSimi.chat re init session...') self._init_session() rsp = self._get_resp(msg) if rsp: return rsp else: log.error('SimSimi.chat _get_resp failed return default') return hehe else: return 'empty msg...'
def _get_resp(self , msg): try: r = self.session.get( self.chat_url % msg )#, timeout=3.0) if not r.text.lstrip().startswith('{'): log.error('SimSimi._get_resp resp[%s] is not json ' , r.text) return None resp = r.json() if resp.has_key('id'): rsp_msg = resp['response'].encode('utf-8') #SimSimi is tired, I only can speak 200 time a day. Please visit again tomorrow. See ya~ if rsp_msg.startswith('SimSimi'): self._init_session() return None elif self._check_msg(rsp_msg) == False: log.warning('SimSimi._get_resp invalid msg = %s' , rsp_msg) return hehe else: return rsp_msg else: return hehe except Exception , e: log.error('SimSimi._get_resp exception ' , exc_info=True)
def stmts_for_param(type, varname, stack=[]): """ Yields input variables for type t's fields, down to primitives """ type = type.get_canonical() decls = [] inits = [] shift_argv = 'shift_argi()' log.debug(f'variable {varname} type {type.spelling} (kind {type.kind})') if not (type.kind == TypeKind.FUNCTIONPROTO or (type.kind == TypeKind.POINTER and type.get_pointee().kind == TypeKind.FUNCTIONPROTO)): decls.append(f'{type.spelling} {varname.replace(".", "_")};') if type.kind == TypeKind.ELABORATED or type.kind == TypeKind.RECORD: td = type.get_declaration() children = list(td.get_children()) inits.append(f'// assign fields for {varname}') if any(children): for child in children: child_varname = f'{varname}.{child.spelling}' if child.kind == CursorKind.UNION_DECL: pass elif child.type.get_declaration( ).kind == CursorKind.UNION_DECL: inits.append( f'// TODO union {child_varname} = <{", ".join(c.spelling for c in child.type.get_declaration().get_children())}>;' ) elif child.type.kind == TypeKind.POINTER: if child.type.spelling in ( s.spelling for s in stack ) or child.type.get_pointee() == type: inits.append( f'// TODO recursive {child_varname} = <{type.spelling}>;' ) else: if child.type.get_pointee().kind == TypeKind.CHAR_S: inits.append(f'{child_varname} = {shift_argv};') elif child.type.spelling in (s.spelling for s in stack): pass else: valname = f'{child.spelling.replace(".", "_")}_v' yield from stmts_for_param( child.type.get_pointee(), valname, stack=stack + [child.type]) inits.append(f'{child_varname} = &{valname};') else: child_inits = zip(*stmts_for_param(child.type, f'{child_varname}', stack=stack + [child.type])) yield from (([], c) for l in child_inits for c in l) else: log.warning( f'no fields found for type {type.spelling} (kind {type.kind})') elif type.kind == TypeKind.POINTER: if type.get_pointee().kind == TypeKind.CHAR_S: inits.append(f'{varname} = {shift_argv};') elif type.get_pointee().kind == TypeKind.FUNCTIONPROTO: inits.append(f'// TODO functionptr {varname} = <{type.spelling}>;') else: valname = f'{varname}_v' yield from stmts_for_param(type.get_pointee(), valname, stack=stack + [type]) if type.get_pointee().kind != TypeKind.FUNCTIONPROTO: inits.append(f'{varname} = &{valname};') elif type.kind == TypeKind.INT or \ type.kind == TypeKind.SHORT or \ type.kind == TypeKind.LONG or \ type.kind == TypeKind.LONGLONG or \ type.kind == TypeKind.INT128 or \ type.kind == TypeKind.ENUM: inits.append(f'{varname} = atoi({shift_argv});') elif type.kind == TypeKind.UINT or \ type.kind == TypeKind.ULONG or \ type.kind == TypeKind.ULONGLONG or \ type.kind == TypeKind.UINT128: inits.append(f'{varname} = strtoul({shift_argv}, NULL, 10);') elif type.kind == TypeKind.DOUBLE or type.kind == TypeKind.LONGDOUBLE: inits.append(f'{varname} = strtod({shift_argv}, NULL);') elif type.kind == TypeKind.FLOAT: inits.append(f'{varname} = atof({shift_argv});') elif type.kind == TypeKind.CHAR_S: inits.append(f'{varname} = {shift_argv}[0];') elif type.kind == TypeKind.FUNCTIONPROTO: pass else: inits.append(f'// TODO unhandled {varname} = <{type.spelling}>;') yield decls, inits