Example #1
0
 def post(self):
     msg = parse_message(request.data)
     # 是文本消息
     if msg.type == 'text':
         reply = TextReply(message=msg)
         reply.content = 'text reply'
         xml = reply.render()
         return xml
     # 事件类型消息
     elif msg.type == 'event':
         # 处理菜单点击事件
         if msg.event == 'click':
             # MenuClick是自定义类,处理菜单点击事件
             click = MenuClick(msg)
             return click.menu_click()
         # 其他类型的事件消息不处理
         else:
             reply = TextReply(message=msg)
             reply.content = 'event未知'
             xml = reply.render()
             return xml
     # 其他消息
     else:
         reply = TextReply(message=msg)
         reply.content = '未知操作'
         xml = reply.render()
         return xml
 def test(self, request, message, wechat):
     """
     发布中测试
     """
     logger = getLogger('django.request.test_ProcessServerEventView')
     logger.info(message)
     if message.get('MsgType').lower() == 'event':
         reply = TextReply()
         reply.target = message['FromUserName']
         reply.source = message['ToUserName']
         reply.content = message['Event'] + 'from_callback'
         xml_str = reply.render()
         headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']}
         return Response(xml_str, headers=headers)
     elif message.get('MsgType').lower() in consts.MESSAGE_TYPES:
         if message.get('Content') == 'TESTCOMPONENT_MSG_TYPE_TEXT':
             reply = TextReply()
             reply.target = message['FromUserName']
             reply.source = message['ToUserName']
             reply.content = 'TESTCOMPONENT_MSG_TYPE_TEXT_callback'
             xml_str = reply.render()
             headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']}
             return Response(xml_str, headers=headers)
         elif message.get('Content').startswith('QUERY_AUTH_CODE'):
             from datetime import timedelta
             now = datetime.utcnow() + timedelta(seconds=2)
             query_auth_code = message.get('Content').split(':')[1]
             process_wechat_query_auth_code_test.apply_async(
                 (message['FromUserName'], query_auth_code), eta=now)
             return Response('')
Example #3
0
 def test(self, request, message, wechat):
     """
     发布中测试
     """
     logger = getLogger('django.request.test_ProcessServerEventView')
     logger.info(message)
     if message.get('MsgType').lower() == 'event':
         reply = TextReply()
         reply.target = message['FromUserName']
         reply.source = message['ToUserName']
         reply.content = message['Event'] + 'from_callback'
         xml_str = reply.render()
         headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']}
         return Response(xml_str, headers=headers)
     elif message.get('MsgType').lower() in consts.MESSAGE_TYPES:
         if message.get('Content') == 'TESTCOMPONENT_MSG_TYPE_TEXT':
             reply = TextReply()
             reply.target = message['FromUserName']
             reply.source = message['ToUserName']
             reply.content = 'TESTCOMPONENT_MSG_TYPE_TEXT_callback'
             xml_str = reply.render()
             headers = {'CONTENT_TYPE': request.META['CONTENT_TYPE']}
             return Response(xml_str, headers=headers)
         elif message.get('Content').startswith('QUERY_AUTH_CODE'):
             from datetime import timedelta
             now = datetime.utcnow() + timedelta(seconds=2)
             query_auth_code = message.get('Content').split(':')[1]
             process_wechat_query_auth_code_test.apply_async(
                 (message['FromUserName'], query_auth_code), eta=now)
             return Response('')
Example #4
0
    def on_post(self, req, resp):
        xml = req.stream.read()
        msg = parse_message(xml)
        if msg.type == 'text':
            try:
                text = msg.content
                c = len(text)
                if c == 1 and '啊' not in text and '哼' not in text and '嗨' not in text:
                    poem_flag = 24
                    poem = self.pchat.gen_poem(text, poem_flag)
                    replyTxt = self.pchat.pretty_print_poem(poem_=poem)
                    tf.reset_default_graph()

                else:
                    eliza = ElizaChat()
                    replyTxt = eliza.analyze(text)
                    if replyTxt == "@$@":
                        replyTxt, score = self.retrieval.api(text)
                        replyTxt = replyTxt
                reply = TextReply(content=replyTxt, message=msg)
                xml = reply.render()
                resp.body = (xml)
                resp.status = falcon.HTTP_200
            except Exception as e:
                print(e)

        elif msg.type == 'image':
            reply = ImageReply(media_id=msg.media_id, message=msg)
            xml = reply.render()
            resp.body = (xml)
            resp.status = falcon.HTTP_200
Example #5
0
async def postWechat(request: Request,
                     user_agent: Optional[str] = Header(None)):
    headers = {'CONTENT_TYPE': 'text/html'}
    __data = await request.body()
    __msg = parse_message(__data)
    if __msg.type == 'text':
        __p = re.compile('doge')
        if __p.match(__msg.content) != None:
            __reply = TextReply(content=__topDoge.run(), message=__msg)
            __xml = __reply.render()
            #return __xml
            #return Response(content=__xml, headers=headers)

        #articles = [
        #    {
        #        'title': 'test',
        #        'description': 'test \n second line \n description',
        #        'image': 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png',
        #        'url': 'https://www.yahoo.co.jp'
        #    }
        #]

        #__reply = TextReply(content=__msg.content, message=__msg)
        #__reply = create_reply(articles, __msg)
        else:
            __reply = TextReply(
                content="I don't know what are you talking about.",
                message=__msg)
            __xml = __reply.render()
    else:
        __reply = TextReply(content="I don't know what are you talking about.",
                            message=__msg)
        __xml = __reply.render()

    return Response(content=__xml, headers=headers)
Example #6
0
def index():
    # print request.args
    # print json.dumps(request.args)
    if request.method == 'GET':
        data = request.args
        signature = data.get('signature')
        timestamp = data.get('timestamp')
        nonce = data.get('nonce')
        echostr = data.get('echostr')
        token = current_app.config.get('TOKEN')
        try:
            check_signature(token, signature, timestamp, nonce)
        except InvalidSignatureException:
            return 'invalid signature'
        return echostr
    else:
        xml = request.data
        print xml
        msg = parse_message(xml)
        if msg.type == 'text':
            print msg.content
            reply =  TextReply(message=msg)
            reply.content = u'reply 测试'
            xml_reply = reply.render()
            return xml_reply
        elif msg.type == 'image':
            reply = ImageReply(message=msg)
            reply.media_id = msg.media_id
            xml_reply = reply.render()
            return xml_reply
        elif msg.type == 'voice':
            # reply = VoiceReply(message=msg)
            # reply.media_id = msg.media_id
            reply = TextReply(message=msg)
            reply.content = msg.recognition
            xml_reply = reply.render()
            return xml_reply
        elif msg.type == 'video':
            reply = VideoReply(message=msg)
            reply.media_id = msg.media_id
            reply.title = u'你的video'
            reply.description = u'wo 爱倪呀'
            xml_reply = reply.render()
            return xml_reply
            pass
        elif msg.type == 'location':
            pass
        elif msg.type == 'link':
            pass
        elif msg.type == 'shortvideo':
            reply = VideoReply(message=msg)
            reply.media_id = msg.thumb_media_id
            reply.title = u'你的video'
            reply.description = u'wo 爱倪呀'
            xml_reply = reply.render()
            return xml_reply
        else:
            return ''
def serve(request):
    # GET 方式用于微信公众平台绑定验证
    if request.method == 'GET':
        signature = request.GET.get('signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echo_str = request.GET.get('echostr', '')
        try:
            check_signature(settings.Token, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = '错误的请求'
        response = HttpResponse(echo_str)
    else:

        msg = parse_message(request.body)
        msg_dict = msg.__dict__['_data']
        # print(msg.id, msg.source, msg.create_time, msg.type, msg.target, msg.time, msg.__dict__['_data']['Event'], '====')
        if msg.type == 'text':
            print(msg)
            # print(msg.source)
            # print(msg.target)
            # transResult = youdaoTranslate(msg.content)
            # transResult = googleTranslate(msg.content)
            transResult = getAns(msg.content)
            transResult = transResult if transResult != '' else '我好像不明白'
            reply = TextReply(content= transResult, messsage=msg)
            reply.source = msg.target
            reply.target = msg.source
            xml = reply.render()
            print(reply)
            # pass
        elif msg.type == 'event':
            if msg_dict['Event'] == 'subscribe':
                    # 关注后 将获取的用户的信息保存到数据库
                # wx_wechat.subscribe(getWxUserInfo(msg.source))
                print('subscribe')
            elif msg_dict['Event'] == 'unsubscribe':
                    # 取关后,将用户的关注状态更改为 未关注
                # wx_wechat.unsubscribe(msg.source)
                print('subscribe')
        elif msg.type == 'image':
            print(msg)
            faceResult = getResultFromUrl(msg.image)
            if faceResult['ret']!=0:
                reply = TextReply(content= '未检测到人脸', messsage=msg)
            else:
                content = numTranslate(faceResult['data']['face_list'][0])
                reply = TextReply(content= content, messsage=msg)
            reply.source = msg.target
            reply.target = msg.source
            xml = reply.render()
        else:
            pass
        response = HttpResponse(xml, content_type="application/xml")
    return response
Example #8
0
def sign_in(msg):
    """每日签到。
    未绑定拼拼网的用户签到无效,并告知绑定方法。
    绑定用户,redis中控制每日签到一次
    db中纪录签到总天数、连续签到天数
    """
    # 检查微信号是否绑定了拼拼账号
    msg_openid = msg.source
    msg_user = UserWechat.query.filter_by(wechat_openid=msg_openid).first()
    if msg_user:
        user = User.query.get(msg_user.uid)
        today = arrow.utcnow().to('local')
        key = USER_SIGN_IN.KEY.format(dayid=today.format('YYYYMMDD'))
        field = USER_SIGN_IN.FIELD.format(user=user.id)
        # 检查当日是否已签到
        r = RedisApp()
        rs = r.hgetJson(key, field)
        if rs:
            reply = TextReply(
                content=u'{nickname} , 今天已经签到过了,明天继续加油。'.format(nickname=user.nickname), message=msg)
            return reply.render()
        rs = r.hsetJson(key, field, today.timestamp)
        if rs:
            # 获取用户签到历史
            s = UserSignIn.query.filter_by(uid=user.id).first()
            if s:
                s.tot_sign_in_days += 1
                last_sign_in_dt = arrow.get(
                    arrow.get(s.last_sign_in_dt).format('YYYYMMDD'), 'YYYYMMDD').timestamp
                this_sign_in_dt = arrow.get(
                    today.format('YYYYMMDD'), 'YYYYMMDD').timestamp
                if this_sign_in_dt - last_sign_in_dt == 86400:
                    s.continuous_sign_in_days += 1
                else:
                    s.continuous_sign_in_days = 1
                s.last_sign_in_dt = today.naive
                s.save
            else:
                s = UserSignIn()
                s.uid = user.id
                s.tot_sign_in_days = 1
                s.continuous_sign_in_days = 1
                s.last_sign_in_dt = today.naive
                s.save

            reply = TextReply(content=u'{nickname} ,今天是您和拼拼在一起的第{days}天,第{total_days}天签到,您已经连续签到{continuous_days}天,连续签到会有意外惊喜喔。'.format(
                nickname=user.nickname, days=user.get_regdays(), total_days=s.tot_sign_in_days, continuous_days=s.continuous_sign_in_days), message=msg)
            return reply.render()

        reply = TextReply(content='签到机发生错误,请稍候再试。', message=msg)
        return reply.render()
    reply = TextReply(content='你还未关联拼拼网账号,签到无效,科科。', message=msg)
    return reply.render()
Example #9
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type == 'text':
         reply = TextReply(content=msg.content, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'image':
         reply = ImageReply(media_id=msg.media_id, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
Example #10
0
    def get_response(self, msg):
        """
        测试是否微信服务器的重复请求,再根据类型响应
        :param msg:
        :return:
        """
        if msg.id == self.visist["visit_id"]:
            self.visist["count"] += 1
            print("weixin request again.")
            if self.visist["count"] > 2:
                ans = "脑壳疼,缓一缓"
                reply = TextReply(content=ans, message=msg)
                xml = reply.render()
                # AI.initialization()  # 重启
                return xml
            time.sleep(5)  # 拖时间,确认不会影响到还在执行的回复
            return ""
        else:
            # self.ai.set_callback(self.callback)
            self.visist["visit_id"] = msg.id
            self.visist["count"] = 0
            self.weixin_id = msg.source
            user_id = self._weixin_id2user_id.get(self.weixin_id, self.weixin_id)
            self.ai.init_userid(user_id)
            # print()
            if msg.type == 'text':
                query = msg.content
                if query == "来聊天":
                    response = self.letstalk(user_id)

                else:
                    response = self.ai.text_api(query,user_id)
                xml = self._response2xml(response, msg)
                return xml
            elif msg.type == "image":
                url = msg.image
                # 先下载,再读取
                path = "./UserData/tmp/"
                if not os.path.exists(path):
                    os.makedirs(path)
                name = "{}.png".format(msg.source)  # 以用户id做名字,避免乱串
                path = os.path.join(path, name)
                download_tool.stream_download(url, path)
                image = PIL_Image.open(path)
                response = self.ai.img_api(image,user_id)
                xml = self._response2xml(response, msg)
            else:
                reply = TextReply(content="暂时不支持该数据格式", message=msg)
                xml = reply.render()
            return xml
Example #11
0
 def _response2xml(self, response, msg):
     """
     将response解析成需要的xml
     :param response:
     :return:
     """
     # 图片型
     if response.startswith("#Image"):
         path = response.replace("#Image:", "")
         medie_id = self._weixin_util.upload(path)
         replay = ImageReply(media_id=medie_id, message=msg)
         xml = replay.render()
         return xml
     else:
         # 文本型的xml
         if response.startswith("#json:"):
             response = response.replace("#json:", "")
             response_json = json.loads(response)
             # print(response_json)
             # 处理url类的
             for key in response_json:
                 if "url" in key:
                     response = "你自己看吧。\n{}".format(response_json[key])
                     break
         reply = TextReply(content=response, message=msg)
         xml = reply.render()
         return xml
def get_robot_reply(msg):
    if "你叫什么" in msg.content:
        answer = "洋葱骑士"
    elif "你名字" in msg.content:
        answer = "洋葱骑士"
    elif "你是谁" in msg.content:
        answer = "洋葱骑士"
    elif "小组编号" in msg.content:
        answer = "02"
    elif "小组成员" in msg.content:
        answer = "杨涵越(组长),华豪,邹鹏程,许金仓,张诚,王清洋,李书宽"
    elif "军事新闻" in msg.content:
        answer = NEWS()
    # elif "二维码" in msg.content:
    #     answer = "请输入你要生成的内容:"
    #     qr()
    else:
        try:
            # 调用NLP接口实现智能回复
            params = urllib.parse.urlencode({
                'msg': msg.content
            }).encode()  # 接口参数需要进行URL编码
            req = urllib.request.Request("http://api.itmojun.com/chat_robot",
                                         params,
                                         method="POST")  # 创建请求
            answer = urllib.request.urlopen(
                req).read().decode()  # 调用接口(即向目标服务器发出HTTP请求,并获取服务器的响应数据)
            if answer == "":
                answer = "人家听不懂你在说什么"
        except Exception as e:
            answer = "AI机器人出现故障!(原因:%s)" % e
    reply = TextReply(content='%s' % answer, message=msg)
    return reply.render()
Example #13
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type == 'text':
         content = msg.content
         if content.isdigit():
             text = Connect().get_url(content)
             reply = TextReply(content=text, message=msg)
         elif content == '一言':
             text = Connect().hitokoto()
             reply = TextReply(content=text, message=msg)
         elif content == 'anime':
             text = Connect().bangumi()
             reply = TextReply(content=text, message=msg)
         elif content == '迅雷':
             text = 'Android:\nhttp://suo.im/5WbiD4\niOS(用自带Safari打开):\nhttps://ithunder-ota.a.88cdn.com/download-guide/step1.html?from=gzhlm'
             reply = TextReply(content=text, message=msg)
         elif content == '哔咔':
             text = '浏览器打开(包括iOS和Android):\nhttps://download2.picacomiccn.xyz'
             reply = TextReply(content=text, message=msg)
         else:
             return ''   # 对其他文本不作回复 https://github.com/wechatpy/wechatpy/issues/161
     elif msg.type == 'event' and msg.event == 'subscribe':
         help = "谢谢关注!\n\n" \
                "1. 在对话框输入'哔咔', 获取哔咔下载地址\n\n" \
                "2. 输入'迅雷', 获取迅雷下载地址\n\n" \
                "3. 输入'一言', 可以看到一句台词\n\n" \
                "4. 输入'anime', 查看今天更新的番剧\n\n" \
                "5. 输入b站直播房间号, 如'1017', 可以查看当前主播是否在线"
         reply = TextReply(content=help, message=msg)
     else:
         reply = TextReply(content="只支持文字消息", message=msg)
     xml = reply.render()
     resp.body = xml
     resp.status = falcon.HTTP_200
Example #14
0
def token():
    if request.method == 'GET':
        signature = request.args.get('signature')
        timestamp = request.args.get('timestamp')
        nonce = request.args.get('nonce')
        echo_str = request.args.get('echostr')  # echo_str是微信用来验证服务器的参数,需原样返回
        print(signature, timestamp, nonce, echo_str)

        try:
            print('正在验证服务器签名')
            # 无法验证成功???
            # check_signature(token, signature, timestamp, nonce)
            print('验证签名成功')
        except InvalidSignatureException as e:
            print('检查签名出错: '.format(e))
            return 'Check Error'

        return echo_str

    # POST
    print('开始处理用户消息')
    msg = parse_message(request.data)
    reply_text = handle_msg(msg)
    reply = TextReply(message=msg)
    reply.content = reply_text
    return reply.render()
Example #15
0
async def weixin_reply(request):
    if request.method == 'GET':
        res = request_para(request)
        sign_ture = res.get('signature')
        time_stamp = res.get('timestamp')
        nonce_ = res.get('nonce')
        echo_str = res.get('echostr')
        try:
            check_signature(token='4725471112', signature=sign_ture, timestamp=time_stamp, nonce=nonce_)
            return_str = echo_str
        except InvalidSignatureException:
            log_exp.error('InvalidSignatureException')
            return_str = 'InvalidSignatureException'
        return response.text(body=return_str)
    elif request.method == 'POST':
        xml = request.body
        msg = parse_message(xml)
        if msg.type == 'text' and msg.source == 'opfB6w88fRxMh6DJirlzW8biOFNw': # 固定1148270327这个用户
            res_msg = web_call_main(msg.content.strip())
            reply = TextReply(content=res_msg, message=msg)
            xml = reply.render()
            return response.text(body=xml, status=200)
        else:
            return response.text(body='NaN')
    else:
        return response.text(body='NaN')
Example #16
0
def handle_msg(request):
    if request.method == 'GET':
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce')
        echo_str = request.GET.get('echostr')
        check_signature(TOKEN, signature, timestamp, nonce)
        return HttpResponse(echo_str)
    elif request.method == 'POST':
        body = request.body
        msg = parse_message(body)
        rep = TextReply()
        rep.source = msg.target
        rep.target = msg.source
        if msg.type == 'event':
            if msg.event == 'click':
                print(msg.key)
                if msg.key == 'sports_advice':
                    rep.content = recommend_plan(msg.source)
                elif msg.key == 'view_info':
                    rep.content = get_info(msg.source)
                elif msg.key == 'add_test':
                    rep.content = add_test(msg.source)
                elif msg.key == 'show_today':
                    rep.content = get_datatoday(msg.source)
            elif msg.event == 'subscribe':
                rep.content = create_newuser(msg.source)
            else:
                rep.content = '!!!'
        else:
            rep.content = '<a href="http://learn.tsinghua.edu.cn">你好</a>'
        repxml = rep.render()
        return HttpResponse(repxml)
Example #17
0
def handle_reply(content, msg):
    '''
	根据用户选取的回复信息的类型,对相应信息进行处理成xml
	'''
    env = request.env()
    if content._name == 'wx.text':
        reply_content = content.text_content
        reply = TextReply(message=msg, content=reply_content)
    elif content._name == 'wx.image':
        reply_content = content.media_id
        reply = ImageReply(media_id=reply_content, message=msg)
    elif content._name == 'wx.imagetext':
        Articles = [{
            'title': content.name,
            'description': content.content,
            'picurl': content.image_id.url,
            'url': content.content_source_url
        }]
        reply = ArticlesReply(message=msg, articles=Articles)
    elif content._name == 'wx.many.imagetext':
        Articles = []
        for content in content.many_image_text:
            Articles.append({
                'title': content.name,
                'description': content.content,
                'picurl': content.image_id.url,
                'url': content.content_source_url
            })
        reply = ArticlesReply(message=msg, articles=Articles)

    _logger.info('消息处理reply %s', reply)  # debug
    return reply.render()
Example #18
0
def weixinCheck(request):
    '''
    所有的消息都会先进入这个函数进行处理,函数包含两个功能,
    微信接入验证是GET方法,
    微信正常的收发消息是用POST方法。
    :param request: 
    :return: 
    '''
    if request.method == 'GET':
        signature = request.GET.get("signature", None)
        timestamp = request.GET.get("timestamp", None)
        nonce = request.GET.get("nonce", None)
        echostr = request.GET.get("echostr", None)
        token = WEIXIN_TOKEN
        print('进来了')
        try:
            check_signature(token, signature, timestamp, nonce)
            return HttpResponse(request.GET.get('echostr', ''),
                                content_type="text/plain")
        except InvalidSignatureException:
            # 处理异常情况或忽略
            print('验证失败')
    elif request.method == 'POST':
        xml_message = smart_str(request.body)
        msg = parse_message(xml_message)
        reply = TextReply(content='你好,这是测试', message=msg)
        xml_respose = reply.render()
        return HttpResponse(xml_respose, content_type="application/xml")
Example #19
0
def response_message(xml, request=None):
    msg = parse_message(xml)
    log.debug('>>> source:{},target:{}, msg.type:{}'.format(
        msg.source, msg.target, msg.type))
    client = WeChatClient(APPID, SECRET)
    user_dict = client.user.get(msg.source)
    userpk = user_dict.get('email') or user_dict.get('userid')
    user = User.objects.filter(email=userpk).first()
    # client.message.send_text( msg.agent ,msg.source, 'user:{}'.format(user))
    # log.debug('>>> user:{}'.format(user))
    if msg.type == 'text':
        if re.match(r'.*(想)|(建议)', msg.content):
            Requirement.objects.get_or_create(email=userpk,
                                              content=msg.content)
            req_counts = Requirement.objects.filter(email=userpk).count()
            reply = TextReply(content='您的想法和建议我们已经收到({})'.format(req_counts),
                              message=msg)
            return reply.render()
        content = '''现在我还不会聊天
但我会记录您提出的想法和建议
试着输入“...想...”或“...建议...” '''

        reply = TextReply(content=content, message=msg)
        return reply.render()
        # log.debug('>>> response:{}'.format(response))
    elif msg.type == 'event':
        log.debug('>>> msg.event:{}'.format(msg.event))
        if msg.event == 'subscribe':
            return login_url(request, user_dict, client, userpk)
        if msg.event == 'location':
            log.debug('>>> msg:{}'.format(msg))
            return add_location(user, msg.id, msg.latitude, msg.longitude,
                                msg.precision)
        if msg.event == 'click':
            log.debug('>>> msg.key:{}'.format(msg.key))
            if msg.key == 'login':
                return login_url(request, user_dict, client, userpk)
            elif msg.key == 'get_available_cars':
                return get_available_cars(user)
            elif msg.key == 'my_location_his':
                return get_location_his(user)
    elif msg.type == 'location':
        return add_location(user, msg.id, msg.location_x, msg.location_y,
                            msg.scale, msg.label)

    reply = create_reply('')
    return reply.render()
Example #20
0
def get_resp_message(request, source_msg, mode=None):
    request_msg = parse_message(source_msg)
    request_msg_type = request_msg.type
    log.info('>>> body[{}],request_msg_type[{}],request_msg[{}]'.format(
        request.body, request_msg_type, request_msg))
    # 根据消息类型解析
    if request_msg_type == 'text':
        reply = TextReply(content='{}'.format(
            get_text_reply(request, request_msg.content)),
                          message=request_msg)
    elif request_msg_type == 'image':
        reply = TextReply(content=howold(request_msg.image),
                          message=request_msg)
    elif request_msg_type == 'voice':
        if not request_msg.recognition:
            reply = TextReply(content='没听清楚啊,再说一遍,亲', message=request_msg)
        else:
            content = get_text_reply(request, request_msg.recognition)
            # tts = gTTS(text=content, lang='zh-cn')
            # tmpfd, tempfilename = tempfile.mkstemp()
            # tts.save(tempfilename)
            # with open(tempfilename, mode='rb') as f:
            #     client = WeChatClient(config.WECHAT_APPID, config.WECHAT_SECRET)
            #     res = WeChatMedia(client=client).upload('voice', f.read())
            #     print('>>>', res)
            #     media_id = json.loads(res).get('media_id')
            #     if not media_id:
            #         reply = VideoReply(message=request_msg)
            #         reply.media_id = media_id
            #     else:
            #         reply = TextReply(content='{}'.format(content), message=request_msg)
            reply = TextReply(content='{}'.format(content),
                              message=request_msg)
    elif request_msg_type == 'event':
        request_msg_event = request_msg.event
        if request_msg_event == 'subscribe':
            reply = TextReply(content=config.WELCOME_MSG, message=request_msg)
        elif request_msg_event == 'unsubscribe':
            reply = TextReply(content='多谢关注!', message=request_msg)
        else:
            reply = EmptyReply()
    else:
        reply = EmptyReply()

    # 返回xml报文
    xml = reply.render()

    if mode == 'aes':
        # get var
        timestamp = request.raw_args.get('timestamp', '')
        nonce = request.raw_args.get('nonce', '')

        crypto = WeChatCrypto(config.WECHAT_TOKEN,
                              config.WECHAT_ENCODING_AES_KEY,
                              config.WECHAT_APPID)
        encrypted_xml = crypto.encrypt_message(xml, nonce, timestamp)
        return encrypted_xml
    else:
        return xml
Example #21
0
def home(request):
    if request.method == 'GET':
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce', None)
        echo_str = request.GET.get('echostr')
        print(signature, "   ", timestamp, "    ", nonce)
        try:
            check_signature(TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            return HttpResponse("hello world")
        return HttpResponse(echo_str, content_type="text/plain")
    msg = parse_message(request.body)
    print(msg.type)
    if (msg.type == 'text'):
        reply = TextReply(content="you say:%s" % msg.content, message=msg)
        xml = reply.render()
        return HttpResponse(xml)
    elif (msg.type == 'image'):
        url = msg.image
        f = open(path + "/aaa.jpg", 'wb')
        str1 = urllib.urlopen(url).read()
        f.write(str1)
        f.close()
        image = cv.LoadImage(path + "/aaa.jpg", 1)
        size = (image.width, image.height)
        iUD = cv.CreateImage(size, image.depth, image.nChannels)
        h = image.height
        w = image.width
        for i in range(h):
            for j in range(w):
                iUD[i, w - j - 1] = image[i, j]
        cv.WaitKey(0)
        cv.SaveImage(path + "/bbb.jpg", iUD)
        json_str = urllib.urlopen(
            "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
            % (appID, appsecret)).read().decode("utf-8")
        access_token = json.loads(json_str)['access_token']
        json_str = commands.getoutput(
            "curl -F media=@%s/bbb.jpg 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=image'"
            % (path, access_token))
        print(json_str)
        media_id = json_str.split(',')[1].split(':')[1].replace('"', '')
        print(type(media_id))
        print(media_id)
        print(dir(media_id))
        xml = """<xml>
			<ToUserName><![CDATA[%s]]></ToUserName>
			<FromUserName><![CDATA[%s]]></FromUserName>
			<CreateTime>%s</CreateTime>
			<MsgType><![CDATA[image]]></MsgType>
			<Image>
			<MediaId><![CDATA[%s]]></MediaId>
			</Image>
			</xml>
			""" % (msg.source, msg.target, time.time() + 1, media_id)
        return HttpResponse(xml)
 def reply_message(self, to_open_message, msg):
     """
     :param to_open_messgae 要回复给访客的消息
     :param msg 收到的消息解析后保存在msg
     """
     reply = TextReply(content=to_open_message, message=msg)
     # 转换成 XML
     xml = reply.render()
     return xml
Example #23
0
def server(request):
    # GET 方式用于微信公众平台绑定验证
    if request.method == 'GET':
        signature = request.GET.get('signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echo_str = request.GET.get('echostr', '')
        # print(WECHAT_TOKEN, signature, timestamp, nonce)
        try:
            check_signature(WECHAT_TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = '微信订阅号:错误的请求!!!'
        return HttpResponse(echo_str)
    else:
        msg = parse_message(request.body)
        # print("消息类型:",msg.type)
        # print("事件:",msg.event)
        # print("消息:", msg)

        reply = TextReply(message=msg)

        if msg.type == 'event':
            # print(msg.event)
            if 'subscribe' in msg.event and (msg.event != "unsubscribe"):
                # print("新用户订阅:%s" % msg.source, dir(msg))
                send_email(subject="新用户订阅!", content="新用户订阅")
                reply.content = "欢迎您来到重症医学质量控制,在后台回复消息,可获得重症医学相关知识!"
            elif msg.event == 'unsubscribe':
                # print("用户取消订阅:%s" % msg.source, dir(msg))s
                reply.content = "下次再来1!"
        elif msg.type == 'text':
            reply.content = msg.content
            # reply = ArticlesReply(message=msg)
            # reply.add_article({
            # 'title':'test',
            # 'description':'des of test',
            # 'image':'http://linux.zicp.vip/static/images/logo.png',
            # 'url':'http://linux.zicp.vip'
            # })
        elif msg.type == 'image':
            reply.content = "您发了一张图片吗?图片的地址为:%s" % msg.image
        elif msg.type == 'voice':
            reply.content = "您发了一条语音吗?"
        elif msg.type == 'video':
            reply.content = "您发了一个视频吗?"
        elif msg.type == 'location':
            reply.content = "您发了一个地理位置吗?纬度:%s-经度:%s,位置:%s" % (
                msg.location_x, msg.location_y, msg.label)
        elif msg.type == 'shortvideo':
            reply.content = "您发了一个短视频吗?"
        elif msg.type == 'link':
            reply.content = "您发了一个链接吗?链接:%s ,地址:%s" % (msg.description,
                                                       msg.url)

        xml = reply.render()
        return HttpResponse(xml)
Example #24
0
def Reply_text(msg, reply_text):
    """
    用于回复文本数据
    :param msg:
    :param reply_text:
    :return:
    """
    reply_data = TextReply(content=reply_text, message=msg)
    reply_xml = reply_data.render()
    return reply_xml
Example #25
0
def weixin(request):
    if request.method == 'POST':
        msg = parse_message(request.body)
        if msg.type == 'text':
            replay = TextReply(content=msg.content, message=msg)
            return HttpResponse(replay.render())
        return HttpResponse(TextReply(content="hah"))
    elif request.method == 'GET':
        print(request.GET)
        return HttpResponse(request.GET.get('echostr', default='110'))
Example #26
0
def autoreply(request):
    try:
        webData = request.body
        msg = parse_message(webData)
        msg_type = msg.type
        logger.info("询问排名")
        if msg_type == 'text':
            content = msg.Content
            from wechatpy.replies import TextReply
            if content == '排名':
                logger.info("询问排名")
                # reply = TextReply(content='text reply', message=msg)
                # 或者
                reply = TextReply(message=msg)
                reply.content = '查看详细排名' \
                                ' <a href="https://qiuplus.cn/zqzb/ranktable/">斯诺克排名 </a>'
                # 转换成 XML
                xml = reply.render()
                return xml
            else:
                reply = TextReply(content='text reply', message=msg)
                # 或者
                reply = TextReply(message=msg)
                reply.content = '近期无比赛'
                # 转换成 XML
                xml = reply.render()
                return xml

        elif msg_type == 'image':
            from wechatpy.replies import TextReply
            reply = TextReply(content='图片已收到', message=msg)
            # 或者
            reply = TextReply(message=msg)
            reply.content = 'text reply'
            # 转换成 XML
            xml = reply.render()
            return xml

    except Exception as Argment:
        logger.exception("error")
        logger.error(Argment)
        return Argment
Example #27
0
 def reply_message(self, message, content):
     """
     回复公众号消息
     """
     reply = TextReply()
     reply.target = message.FromUserName
     reply.source = message.ToUserName
     reply.content = content
     xml_str = reply.render()
     headers = {'CONTENT_TYPE': self.request.META['CONTENT_TYPE']}
     return Response(xml_str, headers=headers)
Example #28
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type == 'text':
         reply = TextReply(content=msg.content, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'image':
         name = img_download(msg.image, msg.source)
         print(name)
         r = access_api('images/' + name)
         if r == 'success':
             media_id = img_upload('image', 'faces/' + name)
             reply = ImageReply(media_id=media_id, message=msg)
         else:
             reply = TextReply(content='人脸检测失败,请上传1M以下人脸清晰的照片', message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
 def reply_message(self, message, content):
     """
     回复公众号消息
     """
     reply = TextReply()
     reply.target = message.FromUserName
     reply.source = message.ToUserName
     reply.content = content
     xml_str = reply.render()
     headers = {'CONTENT_TYPE': self.request.META['CONTENT_TYPE']}
     return Response(xml_str, headers=headers)
Example #30
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type == 'text':
         reply = TextReply(content=msg.content, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'image':
         name = img_download(msg.image, msg.source)  
         print(name)
         r = access_api('images/' + name)
         if r == 'success':
             media_id = img_upload('image', 'faces/' + name)
             reply = ImageReply(media_id=media_id, message=msg)
         else:
             reply = TextReply(content='人脸检测失败,请上传1M以下人脸清晰的照片', message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
Example #31
0
 def on_post(self, req, resp):
     # 猜测是打开数据流
     xml = req.stream.read()
     # 解析xml格式数据
     msg = parse_message(xml)
     if msg.type == 'text':
         reply = TextReply(content='露露我爱你',
                           message=msg)  # content=msg.content
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'image':
         reply = ImageReply(media_id=msg.media_id, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'voice':
         reply = VoiceReply(media_id=msg.media_id, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
Example #32
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type == 'text':
         if msg.content == '笑话':
             cursor = table.find({'id': random.randint(1, 6)})
             for i in cursor:
                 content = i["joke"]
                 print(content)
             reply = TextReply(content=content, message=msg)
             xml = reply.render()
         else:
             print(msg, msg.content)
             reply = TextReply(content=msg.content, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
     elif msg.type == 'image':
         reply = ImageReply(media_id=msg.media_id, message=msg)
         xml = reply.render()
         resp.body = (xml)
         resp.status = falcon.HTTP_200
Example #33
0
def weixin_handler():
    # 从config文件中获取
    token = os.getenv('WECHAT_TOKEN', config.WECHAT_TOKEN)
    encodingAESKey = os.getenv('WECHAT_ENCODING_AES_KEY',
                               config.WECHAT_ENCODING_AES_KEY)
    appId = os.getenv('WECHAT_APP_ID', config.WECHAT_APP_ID)

    # 从请求中获取
    signature = flask.request.args.get("signature")
    timestamp = flask.request.args.get("timestamp")
    nonce = flask.request.args.get("nonce")
    echostr = flask.request.args.get("echostr")
    # encrypt_type = flask.request.args.get("encrypt_type")
    msg_signature = flask.request.args.get("msg_signature")
    '''
    print('signature:', signature)
    print('timestamp: ', timestamp)
    print('nonce:', nonce)
    print('echo_str:', echostr)
    print('encrypt_type:', encrypt_type)
    print('msg_signature:', msg_signature)
    '''

    crypto = WeChatCrypto(token, encodingAESKey, appId)
    try:
        check_signature(token, signature, timestamp, nonce)  # 签名验证
    except InvalidSignatureException:
        flask.abort(403)  # 校验token失败,证明这条消息不是微信服务器发送过来的

    if flask.request.method == "GET":  # 如果时明文模式 直接返回echoster
        return echostr
    elif flask.request.method == "POST":  # 如果时加密模式 先对传入的数据解密
        try:
            msg = crypto.decrypt_message(flask.request.data, msg_signature,
                                         timestamp, nonce)
            print('Descypted message: \n%s' % msg)  # 输出数据内容
        except (InvalidSignatureException, InvalidAppIdException):
            flask.abort(404)
        msg = parse_message(msg)  # 解析xml
        if msg.type == 'text':
            res = get_robot_reply(msg.content)
            reply = TextReply(message=msg)
            reply.content = '%s' % (res)
        elif msg.type == "image":  # 图片回复
            reply = ImageReply(message=msg)
            reply.media_id = msg.media_id
        else:
            reply = TextReply(content="暂时不支持此种类型的回复哦~", message=msg)
        print('Enscypted message: \n%s' % reply)
        # 返回加密信息
        return crypto.encrypt_message(reply.render(), nonce, timestamp)
Example #34
0
def handle_msg(request):
    if request.method == 'GET':
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce')
        echo_str = request.GET.get('echostr')
        check_signature(TOKEN, signature, timestamp, nonce)
        return HttpResponse(echo_str)
    elif request.method == 'POST':
        body = request.body
        msg = parse_message(body)
        rep = TextReply()
        rep.source = msg.target
        rep.target = msg.source
        if msg.type == 'event':
            if msg.event == 'click':
                if msg.key == 'sports_advice':
                    rep.content = recommend_plan(msg.source)
                elif msg.key == 'view_info':
                    rep.content = get_info(msg.source)
                elif msg.key == 'add_bong':
                    rep.content = add_bong(msg.source)
                elif msg.key == 'add_test':
                    rep.content = add_test(msg.source)
                elif msg.key == 'add_test_new':
                    rep.content = add_test_new(msg.source)
                elif msg.key == 'show_today':
                    rep.content = get_datatoday(msg.source)
                elif msg.key == 'change_remind':
                    rep.content = set_remind(msg.source)
                elif msg.key == 'build_match':
                    article_rep = ArticlesReply()
                    article_rep.source = msg.target
                    article_rep.target = msg.source
                    article_rep.add_article({
                        'title': '创建比赛',
                        'description': '点此链接以创建比赛',
                        'image': serverIP+'static/img/run02.jpg',
                        'url': build_match(msg.source)
                    })
                    repxml = article_rep.render()
                    return HttpResponse(repxml)
            elif msg.event == 'subscribe':
                rep.content = create_newuser(msg.source)
            else:
                rep.content = '!!!'
        else:
            rep.content = '你好'
        repxml = rep.render()
        return HttpResponse(repxml)
Example #35
0
 def responMsg(self, pstr, xml):
     #signature=pstr["signature"][0]
     #nonce=pstr["nonce"][0]
     #timestam=pstr["timestamp"][0]
     msg = parse_message(xml)
     reply = TextReply(message=msg)
     reply.content = '你好啊,扑街!'
     restr = reply.render()
     bstr = bytes(restr, encoding='utf-8')
     returncode = bytes(str(bstr, encoding='utf-8').replace('\n', ''),
                        encoding='utf-8')
     #self.wfile.write(returncode)
     print(returncode)
     return returncode
Example #36
0
def welcome_article(msg):
    """新关注用户发送介绍图文
    """
    # msg_openid = msg.source
    content = u"""
    Hi,朋友,很高兴认识你!

    如果你是拼拼网的老朋友,<a href="http://mp.weixin.qq.com/s?__biz=MzI3MjM5MTI2MA==&mid=100000015&idx=1&sn=311cb4a695d5964399b6b1d2d6f798bb#rd">绑定账号</a>即可随时查看拼团动态。

    如果你是拼拼网的新朋友,不妨看看<a href="http://mp.weixin.qq.com/s?__biz=MzI3MjM5MTI2MA==&mid=100000017&idx=1&sn=bb1b4b2f0468306b92dafb17d3b41acb#rd">拼拼网介绍</a>。

    最后,感谢你关注拼拼网微信号,享受每周一推的<a href="http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MzI3MjM5MTI2MA==#wechat_webview_type=1&wechat_redirect">好货分享</a>吧~

    ----PinPin Team
    """
    reply = TextReply(content=content, message=msg)
    return reply.render()
Example #37
0
    def test_reply_render(self):
        timestamp = int(time.time())
        reply = TextReply(
            source='user1',
            target='user2',
            time=timestamp,
            content='test'
        )
        r = reply.render()

        self.assertTrue(r.startswith('<xml>\n'))
        self.assertTrue(r.endswith('\n</xml>'))
        self.assertTrue('<ToUserName><![CDATA[user2]]></ToUserName>' in r)
        self.assertTrue('<FromUserName><![CDATA[user1]]></FromUserName>' in r)
        self.assertTrue('<MsgType><![CDATA[text]]></MsgType>' in r)
        self.assertTrue('<Content><![CDATA[test]]></Content>' in r)
        create_time = '<CreateTime>{time}</CreateTime>'.format(time=timestamp)
        self.assertTrue(create_time in r)
Example #38
0
    def parse_msg(self, msg):
        print msg.type
        print msg
        if msg.type == "event":
            content = ""
            if msg._data.get("Event", "") == "subscribe":
                content = "1、每日标准上班时间 10:00到19:00;" + \
                    "2、打卡时间10:03之前,之后记为迟到;" + \
                    "3、每月3次以内(含3次)迟到10:30之内,不做处理," + \
                    "超出3次,从第四次开始累计罚款20 40 80 160 平方递增," + \
                    "迟到超过30分钟按照事假2小时处理;" + \
                    "4、每人每月带薪病事假1天,不可跨月累计," + \
                    "超出部分病假发放50%工资(1天以上的需要医院假条)" + \
                    ",事假不发工资;" + \
                    "5、全勤奖,每月无事假病假,及任何迟到显现可获得全勤奖," + \
                    "奖品每月更换,平均价值300元;" + \
                    "6、加班,每日加班超过22:00(需要管理人员在加班单上签字)," + \
                    "第二天可11:00到岗,周末及节假日加班可累计倒休,抵扣事假,病假。"

            reply = TextReply(message=msg)
            reply.content = content

        elif msg.type == "text":
            reply = TextReply(message=msg)
            reply.content = msg._data.get("Content")

        elif msg.type == "image":
            reply = ImageReply(message=msg)
            reply.media_id = msg._data.get("MediaId")

        elif msg.type == "voice":
            reply = VoiceReply(message=msg)
            reply.media_id = msg._data.get("MediaId")
            pass
        else:
            return None

        re_xml = reply.render()
        return re_xml
Example #39
0
def test1(request):
    print('!!!!!!')
    if request.method == 'GET':
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce')
        echo_str = request.GET.get('echostr')
        check_signature(TOKEN, signature, timestamp, nonce)
        print('!!!')
        return HttpResponse(echo_str)
    elif request.method == 'POST':
        body = request.body
        msg = parse_message(body)
        print(msg.content)
        print(msg.source)
        print(msg.target)
        rep = TextReply()
        rep.source = msg.target
        rep.target = msg.source
        rep.content = '<a href="http://www.baidu.com">草泥马</a>'
        repxml = rep.render()
        return HttpResponse(repxml)
Example #40
0
def handleMsg(request):
    if request.method == 'GET':
        signature = request.GET.get('signature')
        timestamp = request.GET.get('timestamp')
        nonce = request.GET.get('nonce')
        echo_str = request.GET.get('echostr')
        check_signature(TOKEN, signature, timestamp, nonce)
        return HttpResponse(echo_str)
    elif request.method == 'POST':
        body = request.body
        msg = parse_message(body)
        rep = TextReply()
        rep.source = msg.target
        rep.target = msg.source
        print(msg.type)
        if msg.type == 'event':
            if msg.event == 'click':
                if msg.key == 'change_info':
                    rep.content = '请点击下面的链接修改信息\n<a href="http://59.66.139.224/showinfo?openID= '+ msg.source + '">修改信息</a>'
        else:
            rep.content = '<a href="http://learn.tsinghua.edu.cn">草泥马</a>'
        repxml = rep.render()
        return HttpResponse(repxml)
Example #41
0
def weixin():
    if request.method == 'GET':
        _g = lambda k: request.args.get(k)

        try:
            print(TOKEN, _g('signature'), _g('timestamp'), _g('nonce'))
            check_signature(TOKEN,
                            _g('signature'),
                            _g('timestamp'),
                            _g('nonce'))

            return _g('echostr')
        except InvalidSignatureException:
            pass

    elif request.method == 'POST':
        msg = parse_message(request.data)

        if isinstance(msg, ClickEvent):
            ev = msg

            if ev.key == WX_BTN_BIND_BX:
                reply = TextReply()
                reply.source = ev.target
                reply.target = ev.source
                reply.content = '请访问以下链接登陆到BX邮箱\n%s' % (
                    '%s?%s' % (urljoin(DOMAIN, 'mslogin'),
                               urlencode({'wx': ev.source}))
                )
                return reply.render()
            elif ev.key == WX_BTN_BEGIN_CHECKIN:
                reply = TextReply()
                reply.source = msg.target
                reply.target = msg.source
                reply.content = '请访问以下链接选择开始哪个会议\n%s' % (
                    '%s/check-in-meetings?openid=%s' % (DOMAIN, msg.source)
                )
                return reply.render()
            else:
                reply = TextReply()
                reply.source = msg.target
                reply.target = msg.source
                reply.content = '哦'
                return reply.render()

        elif isinstance(msg, TextMessage):
            if msg.content.lower().startswith('e'):
                reply = TextReply()
                reply.source = msg.target
                reply.target = msg.source
                reply.content = '请访问以下链接选择开始哪个会议\n%s' % (
                    '%s/check-in-meetings?openid=%s' % (DOMAIN, msg.source)
                )

                return reply.render()
            else:
                return '哦'

        elif isinstance(msg, ScanEvent) or isinstance(msg, SubscribeScanEvent):
            openid = msg.source
            meetingid = msg.scene_id
            meeting = mongo.db.meeting.find_one({'meetingid': meetingid})
            checkin_time, ps = emit_checked_in(openid=openid, meeting=meeting)

            r = check_in(openid=openid, meetingid=meetingid, punish_str=ps, checkin_time=checkin_time)

            meeting = mongo.db.meeting.find_one({'meetingid': meetingid})
            print(meeting)
            if all_attendees_checked(meeting['attendee']):
                s = '签到汇总\n%s'
                ra = []
                for u in meeting['attendee']:
                    print(u)
                    full_u = mongo.db.users.find_one({'openid': u['openid']})
                    ra.append([full_u['outlook']['name'],
                               u['punish_str']])
                s %= '\n'.join(map(lambda ss: ': '.join(ss), ra))

                tmp = list(map(lambda u: u['openid'], meeting['attendee']))
                tmp.append(meeting['organizer']['openid'])
                if len(tmp) > 1:
                    wx.message.send_mass_text(tmp, s, is_to_all=True)
                else:
                    wx.message.send_text(tmp[0], s)

            # return r
            wx.message.send_text(openid, r)
            reply = TextReply()
            reply.source = msg.target
            reply.target = msg.source
            reply.content = '请访问以下链接选择查看签到状况\n%s' % (
                '%s/check-in-members?meetingid=%s' % (DOMAIN, meetingid)
            )
            return reply.render()