Example #1
0
 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)
Example #2
0
        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
Example #3
0
 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)
Example #4
0
 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()
Example #5
0
        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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)
Example #9
0
    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)
Example #10
0
        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)
Example #11
0
        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
Example #12
0
    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")
Example #13
0
        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)
Example #14
0
        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
Example #15
0
        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
Example #16
0
 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'])
Example #17
0
        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
Example #18
0
    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)