def onclick(message, session): _name, action_id = message.key.split(',') action_id = int(action_id) if _name: action = request.env()[_name].sudo().browse(action_id) ret = action.get_wx_reply() if is_string(ret): return create_reply(ret, message=message) elif isinstance(ret, list): return create_reply(ret, message=message) elif type(ret)==dict: media = ret media_type = media['media_type'] media_id = media['media_id'] from werobot.replies import ImageReply, VoiceReply, VideoReply, ArticlesReply if media_type=='image': return ImageReply(message=message, media_id=media_id).render() elif media_type=='voice': return VoiceReply(message=message, media_id=media_id).render() elif media_type=='video': return VideoReply(message=message, media_id=media_id).render() elif media_type=='news': from .. import client entry = client.wxenv(request.env) entry.wxclient.send_news_message(message.source, media_id)
def handler(): if not self.check_signature( request.args.get('timestamp', ''), request.args.get('nonce', ''), request.args.get('signature', '') ): return 'Invalid Request.' if request.method == 'GET': return request.args('echostr') body = request.data message = parse_user_msg(body) # get_reply() return the reply object for given message reply = self.get_reply(message) if not reply: return '' # flask将视图函数的返回值自动转为一个响应对像. 如果返回值是一个字符串 # 它将被转换为以该字符串为主体的, 状态码为200, MIME类型是 text/html的响应对像. # flask 把返回值转为响应对像的逻辑如下: # 1. 如果返回值是一个合法的响应对像, 它会从视图直接返回 # 2. 如果返回的是一个字符串, 响应对像会用字符串数据和默认参数创建 # 3. 如果返回的是一个元组, 且元组中的元素可以提供额外的信息. # 这样的元组必须是 (response, status, headers) 形式, 且至少包含一个元素. # status值会覆盖状态代码, headers可以是一个列表或者字典, 做为额外的消息标头值 # 4. 如果上述条件均不满足, flask假设返回值是一个合法的WSGI应用程序, # 并转换为一个请求对像 # 如果想在视图中操纵上述步骤结果的响应对像, 可以使用make_response()函数 response = make_response(create_reply(reply, message=message)) response.headers['content_type'] = 'application/xml' return response
def create_reply(self, ret_msg, message): if type(ret_msg) == dict: if ret_msg.get('media_type') == 'news': self.wxclient.send_news_message(message.source, ret_msg['media_id']) return None else: return create_reply(ret_msg, message=message)
def onclick(message, session): _name, action_id = message.key.split(',') action_id = int(action_id) if _name: action = request.env()[_name].sudo().browse(action_id) ret = action.get_wx_reply() if is_string(ret): return create_reply(ret, message=message) elif isinstance(ret, list): return create_reply(ret, message=message) else: media = ret media_type = media.media_type from werobot.replies import ImageReply, VoiceReply, VideoReply, ArticlesReply if media_type=='image': return ImageReply(message=message, media_id=media.media_id).render() elif media_type=='voice': return VoiceReply(message=message, media_id=media.media_id).render() elif media_type=='video': return VideoReply(message=message, media_id=media.media_id).render()
def handle(t): if not self.check_signature(request.query.timestamp, request.query.nonce, request.query.signature): return abort(403) body = request.body.read() message = parse_user_msg(body) logging.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return "" response.content_type = "application/xml" return create_reply(reply, message=message)
def POST(self): method = getattr(self.request, self.request.method) if not self.debug and not self.request.GET.get('debug'): logger.debug('timestamp: %s, nonce: %s, signature: %s' % ( self.request.GET.get('timestamp'), self.request.GET.get('nonce'), self.request.GET.get('signature'), )) if not self.check_signature( self.request.GET.get('timestamp'), self.request.GET.get('nonce'), self.request.GET.get('signature'), ): logger.error('Can not handle request POST (please check signature)') return False # 403 Error else: logger.debug('Check signature pass(POST)') body = self.request.read().decode('utf-8') try: message = parse_user_msg(body) except Exception as e: logger.error('Can not parse body: %s' % body) else: logger.debug('parse body success') logging.info("Receive message %s" % message.MsgId) # Find a user from database, if not exists pull user information form weixin #sql = u'select id from wordp_user where openid = "%s"' % message.FromUserName #cur = db.query(sql) #result=cur.fetchone() #logger.debug('get user info from database %s' % str(result)) # !!! Because we can not get user information from weixin server if we # not use TEST WEIXIN PUBLIC ACCOUNT.. so we should let user send # it's name manually, oops #if not result: # #logger.debug('Can not find user info in database, request it from weixin server!') # self.get_user_info(message.FromUserName) #cursor.execute('INSERT INTO wordp_task (uid, status, param1, add_time) VALUES()' reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return _('Can not get the reply from messages handler. This is a \ debug message.') self.response['Content-Type'] = 'application/xml' return create_reply(reply, message=message)
def handle(self, **kwargs): if not robot.check_signature(request.params.get("timestamp"), request.params.get("nonce"), request.params.get("signature")): return abort(403) body = request.httprequest.data message = parse_user_msg(body) robot.logger.info("Receive message %s" % message) reply = robot.get_reply(message) if not reply: robot.logger.warning("No handler responded message %s" % message) return '' #response.content_type = 'application/xml' return create_reply(reply, message=message)
def handle(self, **kwargs): if not robot.check_signature( request.params.get("timestamp"), request.params.get("nonce"), request.params.get("signature") ): return abort(403) body = request.httprequest.data message = parse_user_msg(body) robot.logger.info("Receive message %s" % message) reply = robot.get_reply(message) if not reply: robot.logger.warning("No handler responded message %s" % message) return "" # response.content_type = 'application/xml' return create_reply(reply, message=message)
def POST(self): method = getattr(self.request, self.request.method) if not self.debug and not self.request.GET.get('debug'): logger.debug('timestamp: %s, nonce: %s, signature: %s' % ( self.request.GET.get('timestamp'), self.request.GET.get('nonce'), self.request.GET.get('signature'), )) if not self.check_signature( self.request.GET.get('timestamp'), self.request.GET.get('nonce'), self.request.GET.get('signature'), ): logger.error( 'Can not handle request POST (please check signature)') return False # 403 Error else: logger.debug('Check signature pass(POST)') body = self.request.read().decode('utf-8') try: message = parse_user_msg(body) except Exception as e: logger.error('Can not parse body: %s' % body) else: logger.debug('parse body success') logging.info("Receive message %s" % message.MsgId) # Find a user from database, if not exists pull user information form weixin #sql = u'select id from wordp_user where openid = "%s"' % message.FromUserName #cur = db.query(sql) #result=cur.fetchone() #logger.debug('get user info from database %s' % str(result)) # !!! Because we can not get user information from weixin server if we # not use TEST WEIXIN PUBLIC ACCOUNT.. so we should let user send # it's name manually, oops #if not result: # #logger.debug('Can not find user info in database, request it from weixin server!') # self.get_user_info(message.FromUserName) #cursor.execute('INSERT INTO wordp_task (uid, status, param1, add_time) VALUES()' reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return _('Can not get the reply from messages handler. This is a \ debug message.') self.response['Content-Type'] = 'application/xml' return create_reply(reply, message=message)
def handle(t): if not self.check_signature(request.query.timestamp, request.query.nonce, request.query.signature): return abort(403) body = request.body.read() message = parse_user_msg(body) logging.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return '' response.content_type = 'application/xml' return create_reply(reply, message=message)
def handler(): if not self.check_signature(request.args.get('timestamp', ''), request.args.get('nonce', ''), request.args.get('signature', '')): return 'Invalid Request.' if request.method == 'GET': return request.args['echostr'] body = request.data message = parse_user_msg(body) reply = self.get_reply(message) if not reply: return '' response = make_response(create_reply(reply, message=message)) response.headers['content_type'] = 'application/xml' return response
def handle(self, request): if not settings.TESTING and not self.check_signature( request.GET.get('timestamp'), request.GET.get('nonce'), request.GET.get('signature') ): raise PermissionDenied body = smart_str(request.body) message = parse_user_msg(body) self.logger.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: errMsg = "No proper handler responded message %s" %(message.type) self.logger.warning(errMsg) return HttpResponse(errMsg) return HttpResponse(create_reply(reply, message=message), content_type="application/xml")
def handle(): if not self.check_signature( request.params.get("timestamp"), request.params.get("nonce"), request.params.get("signature") ): return abort(403) body = request.body.read() message = parse_user_msg(body) logging.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return '' response.content_type = 'application/xml' return create_reply(reply, message=message)
def handler(): if not self.check_signature( request.args.get('timestamp', ''), request.args.get('nonce', ''), request.args.get('signature', '') ): return 'Invalid Request.' if request.method == 'GET': return request.args['echostr'] body = request.data message = parse_user_msg(body) reply = self.get_reply(message) if not reply: return '' response = make_response(create_reply(reply, message=message)) response.headers['content_type'] = 'application/xml' return response
def handle(t): wxcpt=WXBizMsgCrypt(self.config["TOKEN"], self.config["ENCODING_AES_KEY"], self.config["CORP_ID"]) ret,sMsg=wxcpt.DecryptMsg( request.body.read(), request.query.msg_signature, request.query.timestamp, request.query.nonce) if( ret!=0 ): return abort(403) message = parse_user_msg(sMsg) logging.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return '' response.content_type = 'application/xml' ret,sEncryptMsg=wxcpt.EncryptMsg(create_reply(reply, message=message), request.query.nonce) if( ret!=0 ): return abort(403) return sEncryptMsg
def werobot_view(request): timestamp = request.GET.get("timestamp", "") nonce = request.GET.get("nonce", "") signature = request.GET.get("signature", "") if not robot.check_signature( timestamp=timestamp, nonce=nonce, signature=signature ): return HttpResponseForbidden() if request.method == "GET": return HttpResponse(request.GET.get("echostr", "")) elif request.method == "POST": body = request.body message = parse_user_msg(body) reply = robot.get_reply(message) return HttpResponse( create_reply(reply, message=message), content_type="application/xml;charset=utf-8" ) return HttpResponseNotAllowed(['GET', 'POST'])
def handle(t): wxcpt = WXBizMsgCrypt(self.config["TOKEN"], self.config["ENCODING_AES_KEY"], self.config["CORP_ID"]) ret, sMsg = wxcpt.DecryptMsg(request.body.read(), request.query.msg_signature, request.query.timestamp, request.query.nonce) if (ret != 0): return abort(403) message = parse_user_msg(sMsg) logging.info("Receive message %s" % message) reply = self.get_reply(message) if not reply: self.logger.warning("No handler responded message %s" % message) return '' response.content_type = 'application/xml' ret, sEncryptMsg = wxcpt.EncryptMsg( create_reply(reply, message=message), request.query.nonce) if (ret != 0): return abort(403) return sEncryptMsg
def input_handle(message, session): from .. import client entry = client.wxenv(request.env) client = entry serviceid = message.target openid = message.source mtype = message.type _logger.info('>>> wx msg: %s'%message.__dict__) origin_content = '' attachment_ids = [] if mtype=='image': pic_url = message.img media_id = message.__dict__.get('MediaId','') _logger.info(pic_url) _data = get_img_data(pic_url) _filename = datetime.datetime.now().strftime("%m%d%H%M%S") + os.path.basename(pic_url) attachment = request.env['ir.attachment'].sudo().create({ 'name': '__wx_image|%s'%media_id, 'datas': base64.encodestring(_data), 'datas_fname': _filename, 'res_model': 'mail.compose.message', 'res_id': int(0) }) attachment_ids.append(attachment.id) elif mtype in ['voice']: media_id = message.media_id media_format = message.format r = client.wxclient.download_media(media_id) _filename = '%s.%s'%(media_id,media_format) _data = r.content attachment = request.env['ir.attachment'].sudo().create({ 'name': '__wx_voice|%s'%message.media_id, 'datas': _data.encode('base64'), 'datas_fname': _filename, 'res_model': 'mail.compose.message', 'res_id': int(0) }) attachment_ids.append(attachment.id) elif mtype=='text': origin_content = message.content content = origin_content.lower() rs = request.env()['wx.autoreply'].sudo().search([]) for rc in rs: _key = rc.key.lower() if rc.type==1: if content==_key: ret_msg = rc.action.get_wx_reply() return create_reply(ret_msg, message=message) elif rc.type==2: if _key in content: ret_msg = rc.action.get_wx_reply() return create_reply(ret_msg, message=message) elif rc.type==3: try: flag = re.compile(_key).match(content) except:flag=False if flag: ret_msg = rc.action.get_wx_reply() return create_reply(ret_msg, message=message) #客服对话 uuid = client.OPENID_UUID.get(openid, None) ret_msg = '' cr, uid, context, db = request.cr, request.uid or openerp.SUPERUSER_ID, request.context, request.db if not uuid: rs = request.env['wx.user'].sudo().search( [('openid', '=', openid)] ) if not rs.exists(): info = client.wxclient.get_user_info(openid) info['group_id'] = '' wx_user = request.env['wx.user'].sudo().create(info) else: wx_user = rs[0] anonymous_name = wx_user.nickname channel = request.env.ref('oejia_wx.channel_wx') channel_id = channel.id session_info, ret_msg = request.env["im_livechat.channel"].create_mail_channel(channel_id, anonymous_name, content) if session_info: uuid = session_info['uuid'] client.OPENID_UUID[openid] = uuid client.UUID_OPENID[uuid] = openid wx_user.write({'last_uuid': uuid}) request.env['wx.user.uuid'].sudo().create({'openid': openid, 'uuid': uuid}) if uuid: message_type = "message" message_content = origin_content request_uid = request.session.uid or openerp.SUPERUSER_ID author_id = False # message_post accept 'False' author_id, but not 'None' if request.session.uid: author_id = request.env['res.users'].sudo().browse(request.session.uid).partner_id.id mail_channel = request.env["mail.channel"].sudo(request_uid).search([('uuid', '=', uuid)], limit=1) msg = mail_channel.sudo(request_uid).with_context(mail_create_nosubscribe=True).message_post(author_id=author_id, email_from=mail_channel.anonymous_name, body=message_content, message_type='comment', subtype='mail.mt_comment', content_subtype='plaintext',attachment_ids=attachment_ids) if ret_msg: return create_reply(ret_msg, message=message)