示例#1
0
def wechat():
    signature = request.args.get('signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    encrypt_type = request.args.get('encrypt_type', 'raw')
    msg_signature = request.args.get('msg_signature', '')
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str

    # POST request
    if encrypt_type == 'raw':
        # plaintext mode
        msg = parse_message(request.data)
        replies.EmptyReply().render()
        reply = handler.handle_msg(msg, AppId, Secret)
        return reply.render()
    else:
        # encryption mode
        crypto = WeChatCrypto(TOKEN, EncodingAESKey, AppId)
        try:
            msg = crypto.decrypt_message(request.data, msg_signature,
                                         timestamp, nonce)
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            reply = handler.handle_msg(msg, AppId, Secret)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
示例#2
0
    def test_parse_subscribe_scan_product_event(self):
        from wechatpy.events import SubscribeScanProductEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_fbe8a958756e]]></ToUserName>
        <FromUserName><![CDATA[otAzGjrS4AYCmeJM1GhEOcHXXTAo]]></FromUserName>
        <CreateTime>1433259128</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[scanbarcode|keystandard|keystr]]></EventKey>
        </xml>"""

        msg = parse_message(xml)
        self.assertTrue(isinstance(msg, SubscribeScanProductEvent))
        self.assertEqual('scanbarcode', msg.scene)
        self.assertEqual('keystandard', msg.standard)
        self.assertEqual('keystr', msg.key)

        xml = """<xml>
        <ToUserName><![CDATA[gh_fbe8a958756e]]></ToUserName>
        <FromUserName><![CDATA[otAzGjrS4AYCmeJM1GhEOcHXXTAo]]></FromUserName>
        <CreateTime>1433259128</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[scanimage|keystandard|keystr]]></EventKey>
        </xml>"""

        msg = parse_message(xml)
        self.assertTrue(isinstance(msg, SubscribeScanProductEvent))
        self.assertEqual('scanimage', msg.scene)
        self.assertEqual('keystandard', msg.standard)
        self.assertEqual('keystr', msg.key)
示例#3
0
def wechat():
    signature = request.args.get('signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    encrypt_type = request.args.get('encrypt_type', 'raw')
    msg_signature = request.args.get('msg_signature', '')
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str

    # POST request
    if encrypt_type == 'raw':
        # plaintext mode
        msg = parse_message(request.data)
        reply = msg_handler(msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto
        crypto = WeChatCrypto(TOKEN, AES_KEY, APPID)
        try:
            msg = crypto.decrypt_message(request.data, msg_signature,
                                         timestamp, nonce)
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            reply = msg_handler(msg)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
示例#4
0
    def test_parse_subscribe_scan_product_event(self):
        from wechatpy.events import SubscribeScanProductEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_fbe8a958756e]]></ToUserName>
        <FromUserName><![CDATA[otAzGjrS4AYCmeJM1GhEOcHXXTAo]]></FromUserName>
        <CreateTime>1433259128</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[scanbarcode|keystandard|keystr]]></EventKey>
        </xml>"""

        msg = parse_message(xml)
        self.assertTrue(isinstance(msg, SubscribeScanProductEvent))
        self.assertEqual('scanbarcode', msg.scene)
        self.assertEqual('keystandard', msg.standard)
        self.assertEqual('keystr', msg.key)

        xml = """<xml>
        <ToUserName><![CDATA[gh_fbe8a958756e]]></ToUserName>
        <FromUserName><![CDATA[otAzGjrS4AYCmeJM1GhEOcHXXTAo]]></FromUserName>
        <CreateTime>1433259128</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[scanimage|keystandard|keystr]]></EventKey>
        </xml>"""

        msg = parse_message(xml)
        self.assertTrue(isinstance(msg, SubscribeScanProductEvent))
        self.assertEqual('scanimage', msg.scene)
        self.assertEqual('keystandard', msg.standard)
        self.assertEqual('keystr', msg.key)
示例#5
0
def message_entries():
    signature = request.args.get('signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    encrypt_type = request.args.get('encrypt_type', 'raw')
    msg_signature = request.args.get('msg_signature', '')
    try:
        check_signature(Config.TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    # 微信验证
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str

    # POST request
    if encrypt_type == 'raw':
        # plaintext mode
        msg = parse_message(request.data)
        # 事件处理
        if msg.type == 'event':
            # 关注事件
            if msg.event == 'subscribe':
                mfc = MenuFunc(msg.source)
                mfc.subscribecreatemenu()
            reply = create_reply(msg.event, msg)
        elif msg.type == 'text':
            reply = create_reply(msg.content, msg)
        elif msg.type == 'image':
            reply = create_reply('对不起,暂时不支持图片消息', msg)
        else:
            reply = create_reply(msg.type, msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto

        crypto = WeChatCrypto(Config.TOKEN, Config.AES_KEY, Config.APPID)
        try:
            msg = crypto.decrypt_message(
                request.data,
                msg_signature,
                timestamp,
                nonce
            )
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            if msg.type == 'text':
                reply = create_reply(msg.content, msg)
            else:
                reply = create_reply('Sorry, can not handle this for now', msg)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
示例#6
0
文件: main.py 项目: Melon96/wechat
def wechat():
    signature = request.args.get("signature", "")
    timestamp = request.args.get("timestamp", "")
    nonce = request.args.get("nonce", "")
    encrypt_type = request.args.get("encrypt_type", "raw")
    msg_signature = request.args.get("msg_signature", "")
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == "GET":
        echo_str = request.args.get("echostr", "")
        return echo_str

    # POST request
    if encrypt_type == "raw":
        # plaintext mode
        msg = parse_message(request.data)
        if msg.type == "text":
            # reply = create_reply(msg.content, msg)
            str0 = msg.content;
            if str0[0] == '6':
                str0 += ".XSHG"
            else:
                str0 += ".XSHE"

            myq = query(jqdatasdk.valuation).filter(jqdatasdk.valuation.code == str0)
            df = jqdatasdk.get_fundamentals(myq, '2020-9-28')
            str1 = df['pe_ratio']
            str2 = df['pb_ratio']
            str4 = '%s ' % str1
            str5 = '%s' % str2
            str6 = str4 + str5
            reply = create_reply(str6, msg)
        else:
            reply = create_reply("Sorry, can not handle this for now", msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto

        crypto = WeChatCrypto(TOKEN, AES_KEY, APPID)
        try:
            msg = crypto.decrypt_message(request.data, msg_signature, timestamp, nonce)
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            if msg.type == "text":
                reply = create_reply(msg.content, msg)
            else:
                reply = create_reply("Sorry, can not handle this for now", msg)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
def wechat(club_name):
    logger.debug(club_name)
    query = request.args
    logger.debug(query)
    signature = query.get("signature", "")
    timestamp = query.get("timestamp", "")
    nonce = query.get("nonce", "")
    logger.debug(request.args)
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except Exception as e:
        logger.debug("invalid request!")
        abort(403)

    if request.method == "GET":
        return make_response(request.args.get("echostr", ""))
    else:
        logger.debug("start make response")
        encrypt_type = request.args.get("encrypt_type", "raw")
        xml = request.data
        msg = None
        if encrypt_type == "raw":
            # plain mode
            logger.debug("plain mode")
            msg = parse_message(xml)
        else:
            try:
                # encrypt mode
                crypto = WeChatCrypto(TOKEN, AES_KEY, APP_ID)
                msg = parse_message(
                    crypto.decrypt_message(xml, signature, timestamp, nonce))
            except Exception as e:
                abort(403)

        reply_xml = None
        if msg.type == "text":
            key_words = [item.strip() for item in str(msg.content).split(" ")]
            articles = app_controller.search_club_service_article(
                club_name, key_words)
            for article in articles:
                article["image"] = "{}{}".format(get_host(), article["image"])
                article["url"] = "{}{}".format(get_host(), article["url"])
            reply = ArticlesReply(articles=articles, message=msg)
            reply_xml = reply.render()
        else:
            reply = TextReply(content="Not supported!", message=msg)
            reply_xml = reply.render()

        logger.debug("xml:" + reply_xml)
        if encrypt_type == "raw":
            return reply_xml
        else:
            return crypto.encrypt_message(reply_xml, nonce, timestamp)
示例#8
0
def wechat():
    print(request.args)
    signature = request.args.get("signature", "")
    timestamp = request.args.get("timestamp", "")
    nonce = request.args.get("nonce", "")
    encrypt_type = request.args.get("encrypt_type", "raw")
    msg_signature = request.args.get("msg_signature", "")
    is_test = request.args.get("test", False)
    try:
        if not is_test:
            check_signature(TOKEN, signature, timestamp, nonce)
        pass
    except InvalidSignatureException:
        abort(403)
    if request.method == "GET":
        print("got a get request")
        echo_str = request.args.get("echostr", "")
        return echo_str

    # POST request
    if encrypt_type == "raw":
        # plaintext mode
        msg = parse_message(request.data)
        if msg.type == "text":
            # if "你是谁" in msg.content:
            #     reply = create_reply("我是月光如水的夏夜,融化冰雪的深情", msg)
            # elif "我是鸣夏" in msg.content:
            #     reply = create_reply("说啥都是爱你", msg)
            # else:
            #     relpy_text = tuning_reply(msg.content)
            print(msg.content)
            relpy_text = task_controller(msg.content)
            reply = create_reply(relpy_text, msg)
        else:
            reply = create_reply(introduction, msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto

        crypto = WeChatCrypto(TOKEN, AES_KEY, APPID)
        try:
            msg = crypto.decrypt_message(request.data, msg_signature,
                                         timestamp, nonce)
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            if msg.type == "text":
                reply = create_reply(msg.content, msg)
            else:
                reply = create_reply(introduction, msg)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
示例#9
0
def wechat():
    signature = request.args.get('signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    encrypt_type = request.args.get('encrypt_type', 'raw')
    msg_signature = request.args.get('msg_signature', '')
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str

    # POST request
    if encrypt_type == 'raw':
        # plaintext mode
        msg = parse_message(request.data)
        if msg.type == 'text':
            reply = create_reply(msg.content, msg)
        else:
            reply = create_reply('Sorry, can not handle this for now', msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto

        crypto = WeChatCrypto(TOKEN, ENCODING_AES_KEY, APPID)
        try:
            msg = crypto.decrypt_message(request.data, msg_signature,
                                         timestamp, nonce)
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            app.logger.info(msg)
            if msg.type == 'text':
                result = fetchone_by_name(msg.content)
                if result:
                    reply_msg = category.get(result, "知不道")
                else:
                    reply_msg = "抱歉, Feed还小,不知道“{0}”是什么垃圾".format(msg.content)
                reply = create_reply(reply_msg, msg)
            else:
                reply = create_reply('Sorry, can not handle this for now', msg)
            app.logger.info("test")

            return crypto.encrypt_message("".join(reply.render().split()),
                                          nonce, timestamp)
示例#10
0
def wechat(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(token, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = '错误的请求'
        response = HttpResponse(echo_str)
        return response

    elif request.method == 'POST':
        msg = parse_message(request.body)
        if msg.type == 'text':
            answer = query(msg.content)  # TODO
            reply = create_reply(answer, msg)
        elif msg.type == 'image':
            reply = create_reply('这是条图片消息', msg)
        elif msg.type == 'voice':
            reply = create_reply('这是条语音消息', msg)
        else:
            reply = create_reply('这是条其他类型消息', msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response
示例#11
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)
示例#12
0
def wechat_verify():
    '''
    用来处理微信服务器对本后台的验证,GET方法。
    :return:
    '''
    # POST 方式用于接受被动消息
    if request.method == 'POST':
        msg = parse_message(request.get_data())
        # print("开发者服务收到的消息:", msg.scene_id)
        # 处理方法
        handleWxEvent(msg)
        return 'ok'

    if request.method == 'GET':
        # 获取参数
        rq_dict = request.args
        if len(rq_dict) == 0:
            return ""
        tuple_args = get_all_args(rq_dict)
        token = '123456'
        try:
            check_signature(token, tuple_args[1], tuple_args[2], tuple_args[3])
        except InvalidSignatureException as e:
            logger.error(e, exc_info=True)
            return ''
        else:
            return tuple_args[0]
示例#13
0
def text_handle(request):
    msg = parse_message(request.body)
    reply = TextReply(message=msg)
    content = msg.content
    new_uid = reply.target

    if content == "来数据":
        views.update_database_randomly(new_uid)
        return HttpResponse(create_reply("注入了数据!", message=msg))

    elif content == "xp好帅":
        views.test2(new_uid)
        return HttpResponse(create_reply("获得了浇水次数和施肥次数!!", message=msg))

    if new_uid in sessions and sessions[new_uid] == 1:
        if content == "退出":
            sessions[reply.target] = 0
            return HttpResponse(create_reply("生命之树期待与您再次相会", message=msg))
        rebot_key = "da0d72f6aacebe4301f685e2c11f22c0"
        url = "http://www.tuling123.com/openapi/api?key=%s&info=%s" % (rebot_key,urllib.parse.quote(content))
#       return HttpResponse(create_reply(u"生命之树期待与您再次相会", message=msg))
        response = urllib.request.urlopen(url).read()         #调用urllib2向服务器发送get请求url
        reply_text = json.loads(response.decode("utf-8"))['text']
        reply_text.replace('图灵机器人','生命之树')
#       reply_text.replace(u'图灵机器人'.encode('utf-8'),u'生命之树')
        return HttpResponse(create_reply(reply_text, message=msg))
        
    if(views.check_band_user(new_uid) == False):
        views.insert_band_user(new_uid)
        return HttpResponse(create_reply(u"太平洋手环保太平,欢迎您使用太平洋手环!", message=msg))
    else:
        return HttpResponse(create_reply(u"欢迎您重归太平洋手环!", message=msg))
示例#14
0
    def test_template_subscribe_msg_popup_event(self):
        from wechatpy.events import SubscribeMsgPopupEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
        <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
        <CreateTime>1610969440</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe_msg_popup_event]]></Event>
        <SubscribeMsgPopupEvent>
            <List>
                <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
                <SubscribeStatusString><![CDATA[accept]]></SubscribeStatusString>
                <PopupScene>2</PopupScene>
            </List>
            <List>
                <TemplateId><![CDATA[9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI]]></TemplateId>
                <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
                <PopupScene>2</PopupScene>
            </List>
        </SubscribeMsgPopupEvent>
        </xml>"""
        event = parse_message(xml)
        self.assertIsInstance(event, SubscribeMsgPopupEvent)
        self.assertEqual(2, len(event.subscribes))
        self.assertEqual("VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc",
                         event.subscribes[0]["TemplateId"])
示例#15
0
def handle_wx(request):
    # GET方式用于微信公众平台绑定验证
    if request.method == 'GET':
        signature = request.GET.get('signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echostr = request.GET.get('echostr', '')
        try:
            check_signature(TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echostr = 'error'
        response = HttpResponse(echostr, content_type="text/plain")
        return response
    else:
        msg = parse_message(request.body)
        print(msg)
        # 判断文本消息类型,文本消息处理
        if msg.type == 'text':
            reply = do_reply(msg)
        elif msg.type == 'voice':
            voice_trans()
            reply = create_reply('还没识别出来,稍等...', msg)
        elif msg.type == 'event':
            reply = do_event(msg)
        response = HttpResponse(reply.render(),
                                content_type='application/html')
        return response
示例#16
0
def weixin_main(request):
    if request.method == "GET":
        #接收微信服务器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
        token = 'qiqi123'
        #把参数放到list中排序后合成一个字符串,再用sha1加密得到新的字符串与微信发来的signature对比,如果相同就返回echostr给服务器,校验通过
        hashlist = [token, timestamp, nonce]
        hashlist.sort()
        hashstr = ''.join([s for s in hashlist]).encode('utf-8')
        hashstr = hashlib.sha1(hashstr).hexdigest()
        if hashstr == signature:
          return HttpResponse(echostr)
        else:
          return HttpResponse("error")
    else:
        # othercontent = autoreply(request)
        # return HttpResponse(othercontent)
        msg = parse_message(request.body)
        if msg.type == 'text':
            title, text = get_title_text()
            print(text)
            reply = create_reply(text, msg)
        elif msg.type == 'image':
            reply = create_reply('这是条图片消息', msg)
        elif msg.type == 'voice':
            reply = create_reply('这是条语音消息', msg)
        else:
            reply = create_reply('这是条其他类型消息', msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response
示例#17
0
 def decrypt_and_parse_message(cls, xml: str, msg_signature: str, timestamp: str, nonce: str):
     if msg_signature:
         try:
             xml = cls.we_crypto.decrypt_message(msg=xml, signature=msg_signature, timestamp=timestamp, nonce=nonce)
         except (InvalidAppIdException, InvalidSignatureException) as e:
             raise e
     return parse_message(xml)
示例#18
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
示例#19
0
def wechat(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', '')
        try:
            check_signature(WECHAT_TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = 'error'
        response = HttpResponse(echo_str, content_type="text/plain")
        return response
    elif request.method == 'POST':
        msg = parse_message(request.body)
        if msg.type == 'text':
            reply = handle_message(msg)
        elif msg.type == 'image':
            reply = create_reply('这是条图片消息,暂时还不能处理该类型消息', msg)
        elif msg.type == 'voice':
            reply = create_reply('这是条语音消息,暂时还不能处理该类型消息', msg)
        else:
            # 关注/取消关注的时候
            reply = handle_message(msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response
    else:
        print('不存在的方法')
示例#20
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()
示例#21
0
 def on_post(self, req, resp):
     xml = req.stream.read()
     msg = parse_message(xml)
     if msg.type != 'text' and msg.type != 'voice':
         return
     if msg.type == 'text':
         if "收到不支持的消息类型" in msg.content:
             return
         received_text = msg.content
     elif msg.type == 'voice':
         voice = client.media.download(msg.media_id)
         save_voice(voice.content, VOICE_PATH)
         received_text = msg.recognition
     data = {"sender": msg.source, "message": received_text}
     r = requests.post(CHATBOT_URL, data=json.dumps(data))
     reply = [one["text"] for one in json.loads(r.content)]
     answer = "\n".join(reply)
     if msg.type == 'text':
         text_reply = create_reply(answer, message=msg)
     elif msg.type == 'voice':
         text_reply = create_reply("问:{}\n\n答:{}".format(
             received_text, answer),
                                   message=msg)
     xml = text_reply.render()
     resp.body = (xml)
     resp.status = falcon.HTTP_200
示例#22
0
def wechat():
    xml = request.stream.read()
    msg = parse_message(xml)
    print(msg)

    if msg.type == 'event':
        if isinstance(msg, SubscribeEvent):
            reply = subscribeevent_handle(msg)
        else:
            reply = create_reply('暂不支持其它事件', message=msg)
    elif msg.type == 'text':
        reply = text_handler(msg, msg.content)
    elif msg.type == 'image':
        reply = create_reply('图片好好哟', message=msg)
    elif msg.type == 'voice':
        reply = text_handler(msg, msg.recognition)
    elif msg.type == 'video':
        reply = create_reply('视频挺不错哟', message=msg)
    # elif msg.type in ['location','link']:
    #     pass
    else:
        reply = create_reply('暂不支持处理link和location', message=msg)

    # 转换成 XML
    xml = reply.render()
    return xml
示例#23
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")
示例#24
0
def index(request):
    if request.method == 'GET':
        signature = request.GET.get('signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echostr = request.GET.get('echostr', '')
        try:
            check_signature(TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echostr = 'error'
        response = HttpResponse(echostr, content_type="text/plain")
        return response
    elif request.method == 'POST':
        reply = None
        msg = parse_message(request.body)
        if msg.type == 'text':
            if msg.content == '探针价格':
                reply = create_reply(price_result(), msg)
            else:
                reply = create_reply(query_result(msg.content), msg)
        elif msg.event == 'subscribe':
            reply = create_reply(
                '感谢关注天津市肿瘤医院病理科FISH检测公众号。点击https://jinshuju.net/f/iuoJBo登记患者信息',
                msg)
        response = HttpResponse(reply.render(), content_type='application/xml')
        return response
    else:
        return HttpResponse('ERROR')
示例#25
0
def wechatIndex():
    token = current_app.config.get('WECHAT_TOKEN')
    encoding_aes_key = current_app.config.get('WECHAT_AESKEY')
    encrypt_mode = current_app.config.get('WECHAT_ENC_MODE')
    signature = request.args.get('signature', "")
    timestamp = request.args.get('timestamp', "")
    nonce = request.args.get('nonce', "")
    encrypt_type = request.args.get('encrypt_type', 'raw')
    try:
        check_signature(token, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str
    else:
        if encrypt_type == 'raw':
            # plaintext mode
            msg = parse_message(request.data)
            print msg.type
            if msg.type == 'text':
                reply = create_reply(msg.content, msg)
            elif msg.type == 'event':
                # evt = events.SubscribeEvent(msg)
                print msg.source
                reply = create_reply(msg.source, msg)
            else:
                reply = create_reply('Sorry, can not handle this for now', msg)
            return reply.render()
示例#26
0
文件: wechat.py 项目: BiaoLiu/boai
def index(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', '')
        try:
            check_signature(settings.WECHAT_APP_TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = 'error'
        return HttpResponse(echo_str, content_type="text/plain")
    else:
        reply = None
        msg = parse_message(request.body)
        if msg.type == 'text':  # 文本消息
            reply = doreply_text(msg)
        elif msg.type == 'event':  # 事件消息
            reply = doreply_event(msg)

        if not reply or not isinstance(reply, BaseReply):
            reply = create_reply('程序猿哥哥正在开发中', msg)
        return HttpResponse(reply.render(), content_type="application/xml")
    def test_pic_sysphoto_event(self):
        from wechatpy.events import PicSysPhotoEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408090651</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[pic_sysphoto]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendPicsInfo><Count>1</Count>
        <PicList>
            <item>
            <PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
            </item>
        </PicList>
        </SendPicsInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, PicSysPhotoEvent))
        self.assertEqual(1, event.count)
        self.assertEqual('1b5f7c23b5bf75682a53e7b6d163e185',
                         event.pictures[0]['PicMd5Sum'])
    def test_pic_photo_or_album_event(self):
        from wechatpy.events import PicPhotoOrAlbumEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408090816</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[pic_photo_or_album]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendPicsInfo><Count>1</Count>
        <PicList>
        <item>
        <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
        </item>
        </PicList>
        </SendPicsInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, PicPhotoOrAlbumEvent))
        self.assertEqual(1, event.count)
        self.assertEqual('5a75aaca956d97be686719218f275c6b',
                         event.pictures[0]['PicMd5Sum'])
    def test_location_select_event(self):
        from wechatpy.events import LocationSelectEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408091189</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[location_select]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendLocationInfo><Location_X><![CDATA[23]]></Location_X>
        <Location_Y><![CDATA[113]]></Location_Y>
        <Scale><![CDATA[15]]></Scale>
        <Label><![CDATA[广州市海珠区客村艺苑路 106号]]></Label>
        <Poiname><![CDATA[]]></Poiname>
        </SendLocationInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, LocationSelectEvent))
        self.assertEqual(('23', '113'), event.location)
        self.assertEqual('15', event.scale)
        self.assertTrue(event.poiname is None)
        self.assertEqual('广州市海珠区客村艺苑路 106号', event.label)
示例#30
0
def reply(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', '')
        try:
            check_signature(token, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = 'error'
        response = HttpResponse(echo_str, content_type="text/plain")
        return response
    elif request.method == 'POST':
        msg = parse_message(request.body)
        if msg.type == 'text':
            disposeObj = dispose()
            replyContent = disposeObj.run(msg.content)
            reply = create_reply(replyContent, msg)
        elif msg.type == 'image':
            reply = create_reply('这是条图片消息', msg)
        elif msg.type == 'voice':
            disposeObj = dispose()
            replyContent = disposeObj.run(msg.recognition)
            reply = create_reply(replyContent, msg)
        else:
            reply = create_reply('这是条其他类型消息', msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response
    else:
        logger.info('--------------------------------')
示例#31
0
    def test_pic_sysphoto_event(self):
        from wechatpy.events import PicSysPhotoEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408090651</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[pic_sysphoto]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendPicsInfo><Count>1</Count>
        <PicList>
            <item>
            <PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
            </item>
        </PicList>
        </SendPicsInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, PicSysPhotoEvent))
        self.assertEqual(1, event.count)
        self.assertEqual(
            '1b5f7c23b5bf75682a53e7b6d163e185',
            event.pictures[0]['PicMd5Sum']
        )
示例#32
0
    def test_pic_photo_or_album_event(self):
        from wechatpy.events import PicPhotoOrAlbumEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408090816</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[pic_photo_or_album]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendPicsInfo><Count>1</Count>
        <PicList>
        <item>
        <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
        </item>
        </PicList>
        </SendPicsInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, PicPhotoOrAlbumEvent))
        self.assertEqual(1, event.count)
        self.assertEqual(
            '5a75aaca956d97be686719218f275c6b',
            event.pictures[0]['PicMd5Sum']
        )
示例#33
0
    def test_parse_submit_invoice_title_event(self):
        """ Test parsing xml for SubmitInvoiceTitleEvent """
        from wechatpy.events import SubmitInvoiceTitleEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_fc0a06a20993]]></ToUserName>
        <FromUserName><![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]></FromUserName>
        <CreateTime>1475134700</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[submit_invoice_title]]></Event>
        <title><![CDATA[样例公司抬头]]></title>
        <tax_no><![CDATA[1486715661]]></tax_no>
        <addr><![CDATA[abc]]></addr>
        <phone><![CDATA[13313331333]]></phone>
        <bank_type><![CDATA[bt]]></bank_type>
        <bank_no><![CDATA[bn]]></bank_no>
        <attach><![CDATA[at]]></attach>
        <title_type><![CDATA[InvoiceUserTitleBusinessType]]></title_type>
        </xml>"""

        msg = parse_message(xml)
        self.assertTrue(isinstance(msg, SubmitInvoiceTitleEvent))
        self.assertEqual('样例公司抬头', msg.title)
        self.assertEqual('1486715661', msg.tax_no)
        self.assertEqual('abc', msg.addr)
        self.assertEqual('13313331333', msg.phone)
        self.assertEqual('bt', msg.bank_type)
        self.assertEqual('bn', msg.bank_no)
        self.assertEqual('at', msg.attach)
        self.assertEqual('InvoiceUserTitleBusinessType', msg.title_type)
示例#34
0
    def test_location_select_event(self):
        from wechatpy.events import LocationSelectEvent

        xml = """<xml>
        <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
        <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
        <CreateTime>1408091189</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[location_select]]></Event>
        <EventKey><![CDATA[6]]></EventKey>
        <SendLocationInfo><Location_X><![CDATA[23]]></Location_X>
        <Location_Y><![CDATA[113]]></Location_Y>
        <Scale><![CDATA[15]]></Scale>
        <Label><![CDATA[广州市海珠区客村艺苑路 106号]]></Label>
        <Poiname><![CDATA[]]></Poiname>
        </SendLocationInfo>
        </xml>"""

        event = parse_message(xml)

        self.assertTrue(isinstance(event, LocationSelectEvent))
        self.assertEqual(('23', '113'), event.location)
        self.assertEqual('15', event.scale)
        self.assertTrue(event.poiname is None)
        self.assertEqual('广州市海珠区客村艺苑路 106号', event.label)
示例#35
0
def wechat_handler():
    try:
        token = current_app.config['WECHAT_TOEKN']
        signature = request.args.get('signature')
        timestamp = request.args.get('timestamp')
        nonce = request.args.get('nonce')
        check_signature(token, signature, timestamp, nonce)

        current_app.logger.info('wechat_handler begin')
        body = request.get_data()
        current_app.logger.info('wechat_handler body %s' % body)
        msg = parse_message(body)
        if msg.type == 'text':
            return reply_msg(msg)
        elif msg.type == 'event' and msg.event == 'click' and msg.key == 'V2003_SignIn':
            return sign_in(msg)
        elif msg.type == 'event' and msg.event in ['subscribe_scan', 'scan'] and msg.scene_id == '123':
            binding(msg)
            if msg.event == 'subscribe_scan':
                return welcome_article(msg)
        elif msg.type == 'event' and msg.event == 'unsubscribe':
            unsubscribe_unbinding(msg)
        elif msg.type == 'event' and msg.event == 'subscribe':
            return welcome_article(msg)
        reply = EmptyReply()
        return reply.render()
    except InvalidSignatureException:
        abort(404)
    except Exception as e:
        current_app.logger.exception('wechat_handler %s' % e)
        reply = EmptyReply()
        return reply.render()
示例#36
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
示例#37
0
def wechat(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', '')
        try:
            check_signature(WECHAT_TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = 'error'
        response = HttpResponse(echo_str, content_type="text/plain")
        # createMenu(client)
        return response
    elif request.method == 'POST':
        msg = parse_message(request.body)
        if msg.type == 'text':
            reply = create_reply('这是条文字消息', msg)
        elif msg.type == 'image':
            reply = create_reply('这是条图片消息', msg)
        elif msg.type == 'voice':
            reply = create_reply('这是条语音消息', msg)
        else:
            reply = create_reply('这是条其他类型消息', msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response
    else:
        logger.info('--------------------------------')
示例#38
0
def time_out_reply(event):
    event = re.sub(r'\<xml\>', '<xml>\n', event)
    xml = event
    msg = parse_message(xml)
    reply = TextReply(content='【系统已激活,请再次提问】', message=msg)
    resp = apiReply(reply, txt=True, content_type="application/xml")
    return resp
示例#39
0
def wexin(request):
    WEIXIN_TPKEN = 'douxinyi20130819'
    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_TPKEN
        try:
            check_signature(WEIXIN_TPKEN,signature,timestamp,nonce)
        except InvalidSignatureException:
            echostr = 'error'
        return HttpResponse(echostr,content_type="text/plain")
    elif request.method == "POST":
        msg = parse_message(request.body)
        if msg.type == 'text':
            repr = create_reply('这是条文字消息', msg)
        elif msg.type == 'image':
            repr = create_reply('这是条图片消息', msg)
        elif msg.type == 'voice':
            repr = create_reply('这是条语音消息', msg)
        else:
            repr = create_reply('这是条其他类型消息', msg)
        return HttpResponse(repr.render(),content_type='application/xml')
    else:
        pass
示例#40
0
def handle(request):
    if request.method == "GET":
        if not tools.checkSignature(request):
            return HttpResponse("invalid signature")
        else:
            return HttpResponse(request.GET["echostr"]) 
    msg = parse_message(request.body)
    return msg_splitter[msg.type](msg)
示例#41
0
def _wechat_required(method, *args, **kwargs):
    from wechatpy.crypto import WeChatCrypto
    from wechatpy import parse_message

    signature = request.args.get('signature')

    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')

    if not current_app.config.get('WECHAT_TOKEN'):
        return abort(500, "Token is None")

    token = current_app.config['WECHAT_TOKEN']
    try:
        check_signature(token, signature, timestamp, nonce)
    except InvalidSignatureException:
        current_app.logger.warning('check signature failed.')
        return abort(403)

    if request.method == 'GET':
        return request.args.get('echostr', '')

    raw_msg = request.data
    current_app.logger.debug(raw_msg)
    if current_app.config.get('WECHAT_AES_KEY'):
        crypto = WeChatCrypto(
            current_app.config['WECHAT_TOKEN'],
            current_app['WECHAT_AES_KEY'],
            current_app.config['WECHAT_APPID']
        )
        try:
            raw_msg = crypto.decrypt_message(
                raw_msg,
                signature,
                timestamp,
                nonce
            )
        except (InvalidAppIdException, InvalidSignatureException):
            current_app.logger.warning('decode message failed.')
            return abort(403)

    request.wechat_msg = parse_message(raw_msg)

    res = method(*args, **kwargs)
    xml = ''

    if isinstance(res, BaseReply):
        xml = res.render()

    if current_app.config.get('WECHAT_AES_KEY'):
        crypto = WeChatCrypto(
            current_app.config['WECHAT_TOKEN'],
            current_app.config['WECHAT_AES_KEY'],
            current_app.config['WECHAT_APPID']
        )
        xml = crypto.encrypt_message(xml, nonce, timestamp)

    return xml
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 ''
示例#43
0
文件: views.py 项目: Randyedu/WeCron
 def post(self, request):
     try:
         req_text = request.body.decode('utf-8')
         msg = parse_message(req_text)
     except Exception as e:
         logger.exception('Illegal message from weixin: \n%s', req_text)
         return HttpResponse('Illegal message from weixin: \n%s' % req_text)
     wechat_resp = handle_message(msg)
     return HttpResponse(wechat_resp, content_type='text/xml; charset=utf-8')
示例#44
0
def wechat():
    signature = request.args.get('signature', '')
    timestamp = request.args.get('timestamp', '')
    nonce = request.args.get('nonce', '')
    encrypt_type = request.args.get('encrypt_type', 'raw')
    msg_signature = request.args.get('msg_signature', '')
    try:
        check_signature(TOKEN, signature, timestamp, nonce)
    except InvalidSignatureException:
        abort(403)
    if request.method == 'GET':
        echo_str = request.args.get('echostr', '')
        return echo_str

    # POST request
    if encrypt_type == 'raw':
        # plaintext mode
        msg = parse_message(request.data)
        if msg.type == 'text':
            reply = create_reply(msg.content, msg)
        else:
            reply = create_reply('Sorry, can not handle this for now', msg)
        return reply.render()
    else:
        # encryption mode
        from wechatpy.crypto import WeChatCrypto

        crypto = WeChatCrypto(TOKEN, AES_KEY, APPID)
        try:
            msg = crypto.decrypt_message(
                request.data,
                msg_signature,
                timestamp,
                nonce
            )
        except (InvalidSignatureException, InvalidAppIdException):
            abort(403)
        else:
            msg = parse_message(msg)
            if msg.type == 'text':
                reply = create_reply(msg.content, msg)
            else:
                reply = create_reply('Sorry, can not handle this for now', msg)
            return crypto.encrypt_message(reply.render(), nonce, timestamp)
示例#45
0
def _enterprise_wechat_required(method, *args, **kwargs):
    from wechatpy.enterprise import parse_message
    from wechatpy.enterprise.crypto import WeChatCrypto
    from wechatpy.enterprise.exceptions import InvalidCorpIdException
    signature = request.args.get('msg_signature')
    timestamp = request.args.get('timestamp')
    nonce = request.args.get('nonce')

    if not current_app.config.get('WECHAT_TOKEN'):
        return abort(500, "Token is None")

    crypto = WeChatCrypto(
        current_app.config['WECHAT_TOKEN'],
        current_app['WECHAT_AES_KEY'],
        current_app.config['WECHAT_APPID']
    )
    if request.method == 'GET':
        echo_str = request.args.get('echostr')
        try:
            echo_str = crypto.check_signature(
                signature,
                timestamp,
                nonce,
                echo_str
            )
        except InvalidSignatureException:
            abort(403)
        return echo_str

    try:
        msg = crypto.decrypt_message(
            request.data,
            signature,
            timestamp,
            nonce,
        )
    except (InvalidSignatureException, InvalidCorpIdException):
        return abort(403)
    else:
        request.wechat_msg = parse_message(msg)

    res = method(*args, **kwargs)
    xml = ''

    if isinstance(res, BaseReply):
        xml = res.render()

    crypto = WeChatCrypto(
        current_app.config['WECHAT_TOKEN'],
        current_app.config['WECHAT_AES_KEY'],
        current_app.config['WECHAT_APPID']
    )
    xml = crypto.encrypt_message(xml, nonce, timestamp)

    return xml
示例#46
0
    def test_parse_text_message(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
         <CreateTime>1348831860</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[this is a test]]></Content>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual('text', msg.type)
示例#47
0
    def test_parse_video_message(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1357290913</CreateTime>
        <MsgType><![CDATA[video]]></MsgType>
        <MediaId><![CDATA[media_id]]></MediaId>
        <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual('video', msg.type)
示例#48
0
    def test_parse_subscribe_event(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual('event', msg.type)
        self.assertEqual('subscribe', msg.event)
示例#49
0
    def test_parse_image_message(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1348831860</CreateTime>
        <MsgType><![CDATA[image]]></MsgType>
        <PicUrl><![CDATA[this is a url]]></PicUrl>
        <MediaId><![CDATA[media_id]]></MediaId>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual('image', msg.type)
示例#50
0
    def test_parse_unknown_message(self):
        from wechatpy.messages import UnknownMessage

        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1348831860</CreateTime>
        <MsgType><![CDATA[notsure]]></MsgType>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)

        self.assertTrue(isinstance(msg, UnknownMessage))
示例#51
0
    def test_parse_link_message(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1351776360</CreateTime>
        <MsgType><![CDATA[link]]></MsgType>
        <Title><![CDATA[公众平台官网链接]]></Title>
        <Description><![CDATA[公众平台官网链接]]></Description>
        <Url><![CDATA[url]]></Url>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual('link', msg.type)
示例#52
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)
示例#53
0
    def test_verify_expired_event(self):
        from wechatpy.events import VerifyExpiredEvent

        xml = """
        <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>1442400900</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[verify_expired]]></Event>
        <ExpiredTime>1442400900</ExpiredTime>
        </xml>"""
        event = parse_message(xml)
        self.assertTrue(isinstance(event, VerifyExpiredEvent))
        self.assertTrue(isinstance(event.expired_time, datetime))
示例#54
0
    def test_naming_verify_success_event(self):
        from wechatpy.events import NamingVerifySuccessEvent

        xml = """
        <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>1442401093</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[naming_verify_success]]></Event>
        <ExpiredTime>1442401093</ExpiredTime>
        </xml>"""
        event = parse_message(xml)
        self.assertTrue(isinstance(event, NamingVerifySuccessEvent))
        self.assertTrue(isinstance(event.expired_time, datetime))
示例#55
0
    def test_annual_renew_event(self):
        from wechatpy.events import AnnualRenewEvent

        xml = """
        <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>1442401004</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[annual_renew]]></Event>
        <ExpiredTime>1442401004</ExpiredTime>
        </xml>"""
        event = parse_message(xml)
        self.assertTrue(isinstance(event, AnnualRenewEvent))
        self.assertTrue(isinstance(event.expired_time, datetime))
示例#56
0
    def check_message(self, xml, data, is_encrypt=True):
        if is_encrypt:
            crypto = WeChatCrypto(self.token, self.aes_key, self.app_id)
            try:
                decrypted_xml = crypto.decrypt_message(
                    xml,
                    data.get("msg_signature"),
                    data.get("timestamp"),
                    data.get("nonce"))
            except (InvalidAppIdException, InvalidSignatureException):
                return None

            msg = parse_message(decrypted_xml)
        else:
            msg = parse_message(xml)

        re_xml = self.parse_msg(msg)

        if is_encrypt:
            return_xml = crypto.encrypt_message(
                    re_xml, data.get("nonce"), data.get("timestamp"))
        else:
            return_xml = re_xml
        return return_xml
示例#57
0
    def test_parse_subscribe_event_with_last_trade_no(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[last_trade_no_4008072001201701105817415015]]></EventKey>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual('event', msg.type)
        self.assertEqual('subscribe', msg.event)
        self.assertEqual('last_trade_no_4008072001201701105817415015', msg.key)
示例#58
0
    def test_parse_click_event(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[CLICK]]></Event>
        <EventKey><![CDATA[EVENTKEY]]></EventKey>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual('event', msg.type)
        self.assertEqual('click', msg.event)
        self.assertEqual('EVENTKEY', msg.key)
示例#59
0
    def test_parse_view_event(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[VIEW]]></Event>
        <EventKey><![CDATA[www.qq.com]]></EventKey>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual('event', msg.type)
        self.assertEqual('view', msg.event)
        self.assertEqual('www.qq.com', msg.url)
示例#60
0
    def test_parse_location_message(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1351776360</CreateTime>
        <MsgType><![CDATA[location]]></MsgType>
        <Location_X>23.134521</Location_X>
        <Location_Y>113.358803</Location_Y>
        <Scale>20</Scale>
        <Label><![CDATA[位置信息]]></Label>
        <MsgId>1234567890123456</MsgId>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual('location', msg.type)