Ejemplo n.º 1
0
    async def wrapper():
        signature = request.args.get("msg_signature", "")
        timestamp = request.args.get("timestamp", "")
        nonce = request.args.get("nonce", "")

        crypto = WeChatCrypto(
            bot.config.bot.wechat_enterprise.WECHAT_TOKEN,
            bot.config.bot.wechat_enterprise.ENCODING_AES_KEY,
            bot.config.bot.wechat_enterprise.CORP_ID)

        if request.method == "GET":
            kokkoro.logger.debug("Wechat check triggered")

            echo_str = request.args.get("echostr", "")
            try:
                echo_str = crypto.check_signature(signature, timestamp, nonce,
                                                  echo_str)
            except InvalidSignatureException:
                abort(403)
            return echo_str
        else:
            kokkoro.logger.debug("Wechat messages handler triggered")
            try:
                msg = crypto.decrypt_message(await request.data, signature,
                                             timestamp, nonce)
                kokkoro.logger.debug(f"Descypted message: \n{msg}")
            except (InvalidSignatureException, InvalidCorpIdException):
                abort(403)
            msg = parse_message(msg)

            await bot.kkr_on_message(msg)
            reply = create_reply(bot.ret_val, msg).render()
            bot.ret_val = None
            res = crypto.encrypt_message(reply, nonce, timestamp)
            return res
Ejemplo n.º 2
0
def wechat():
    signature = request.args.get("msg_signature", "")
    timestamp = request.args.get("timestamp", "")
    nonce = request.args.get("nonce", "")

    crypto = WeChatCrypto(TOKEN, EncodingAESKey, CorpId)
    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
    else:
        try:
            msg = crypto.decrypt_message(request.data, signature, timestamp, nonce)
        except (InvalidSignatureException, InvalidCorpIdException):
            abort(403)
        msg = parse_message(msg)
        if msg.type == "text":
            reply = create_reply(msg.content, msg).render()
        else:
            reply = create_reply("Can not handle this for now", msg).render()
        res = crypto.encrypt_message(reply, nonce, timestamp)
        return res
Ejemplo n.º 3
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual("video", msg.type)
Ejemplo n.º 4
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual("image", msg.type)
Ejemplo n.º 5
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual("text", msg.type)
        self.assertEqual(1, msg.agent)
Ejemplo n.º 6
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual("event", msg.type)
        self.assertEqual("subscribe", msg.event)
Ejemplo n.º 7
0
    def test_subscribe_event(self):
        xml = """
        <xml>
            <ToUserName><![CDATA[toUser]]></ToUserName>
            <FromUserName><![CDATA[UserID]]></FromUserName>
            <CreateTime>1348831860</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[subscribe]]></Event>
            <AgentID>1</AgentID>
        </xml>
        """
        event = parse_message(xml)

        self.assertIsInstance(event, events.SubscribeEvent)
        self.assertEqual(1, event.agent)
Ejemplo n.º 8
0
    def test_parse_delete_calendar(self):
        xml = """
        <xml>
           <ToUserName><![CDATA[toUser]]></ToUserName>
           <FromUserName><![CDATA[fromUser]]></FromUserName>
           <CreateTime>1348831860</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[delete_calendar]]></Event>
           <CalId><![CDATA[wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA]]></CalId>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.DeleteCalendarEvent)
        self.assertEqual("wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA", msg.calendar_id)
Ejemplo n.º 9
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)

        self.assertTrue(isinstance(msg, UnknownMessage))
Ejemplo n.º 10
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual("location", msg.type)
Ejemplo n.º 11
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual("event", msg.type)
        self.assertEqual("view", msg.event)
        self.assertEqual("www.qq.com", msg.url)
Ejemplo n.º 12
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>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual("event", msg.type)
        self.assertEqual("click", msg.event)
        self.assertEqual("EVENTKEY", msg.key)
Ejemplo n.º 13
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>
        <PicUrl><![CDATA[picurl]]></PicUrl>
        <MsgId>1234567890123456</MsgId>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)
        self.assertEqual("link", msg.type)
Ejemplo n.º 14
0
    def test_parse_delete_schedule(self):
        xml = """
        <xml>
           <ToUserName><![CDATA[toUser]]></ToUserName>
           <FromUserName><![CDATA[fromUser]]></FromUserName>
           <CreateTime>1348831860</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[delete_schedule]]></Event>
           <CalId><![CDATA[wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA]]></CalId>
           <ScheduleId><![CDATA[17c7d2bd9f20d652840f72f59e796AAA]]></ScheduleId>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.DeleteScheduleEvent)
        self.assertEqual("wcjgewCwAAqeJcPI1d8Pwbjt7nttzAAA", msg.calendar_id)
        self.assertEqual("17c7d2bd9f20d652840f72f59e796AAA", msg.schedule_id)
Ejemplo n.º 15
0
    def test_parse_location_event(self):
        xml = """<xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[LOCATION]]></Event>
        <Latitude>23.137466</Latitude>
        <Longitude>113.352425</Longitude>
        <Precision>119.385040</Precision>
        <AgentID>1</AgentID>
        </xml>"""

        msg = parse_message(xml)

        self.assertEqual("event", msg.type)
        self.assertEqual("location", msg.event)
        self.assertEqual(23.137466, msg.latitude)
        self.assertEqual(113.352425, msg.longitude)
        self.assertEqual(119.385040, msg.precision)
Ejemplo n.º 16
0
    def test_export(self):
        xml = """
        <xml>
            <ToUserName><![CDATA[wx28dbb14e3720FAKE]]></ToUserName>
            <FromUserName><![CDATA[FromUser]]></FromUserName>
            <CreateTime>1425284517</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[batch_job_result]]></Event>
            <BatchJob>
                <JobId><![CDATA[jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4]]></JobId>
                <JobType><![CDATA[export_user]]></JobType>
                <ErrCode>0</ErrCode>
                <ErrMsg><![CDATA[ok]]></ErrMsg>
            </BatchJob>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.ExportEvent)
        self.assertEqual("jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4", msg.job_id)
        self.assertEqual("export_user", msg.job_type)

        xml = """
        <xml>
            <ToUserName><![CDATA[wx28dbb14e3720FAKE]]></ToUserName>
            <FromUserName><![CDATA[FromUser]]></FromUserName>
            <CreateTime>1425284517</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[batch_job_result]]></Event>
            <BatchJob>
                <JobId><![CDATA[jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4]]></JobId>
                <JobType><![CDATA[export_simple_user]]></JobType>
                <ErrCode>0</ErrCode>
                <ErrMsg><![CDATA[ok]]></ErrMsg>
            </BatchJob>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.ExportEvent)
        self.assertEqual("jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4", msg.job_id)
        self.assertEqual("export_simple_user", msg.job_type)

        xml = """
        <xml>
            <ToUserName><![CDATA[wx28dbb14e3720FAKE]]></ToUserName>
            <FromUserName><![CDATA[FromUser]]></FromUserName>
            <CreateTime>1425284517</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[batch_job_result]]></Event>
            <BatchJob>
                <JobId><![CDATA[jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4]]></JobId>
                <JobType><![CDATA[export_department]]></JobType>
                <ErrCode>0</ErrCode>
                <ErrMsg><![CDATA[ok]]></ErrMsg>
            </BatchJob>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.ExportEvent)
        self.assertEqual("jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4", msg.job_id)
        self.assertEqual("export_department", msg.job_type)

        xml = """
        <xml>
            <ToUserName><![CDATA[wx28dbb14e3720FAKE]]></ToUserName>
            <FromUserName><![CDATA[FromUser]]></FromUserName>
            <CreateTime>1425284517</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[batch_job_result]]></Event>
            <BatchJob>
                <JobId><![CDATA[jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4]]></JobId>
                <JobType><![CDATA[export_taguser]]></JobType>
                <ErrCode>0</ErrCode>
                <ErrMsg><![CDATA[ok]]></ErrMsg>
            </BatchJob>
        </xml>
        """
        msg = parse_message(xml)

        self.assertIsInstance(msg, events.ExportEvent)
        self.assertEqual("jobid_S0MrnndvRG5fadSlLwiBqiDDbM143UqTmKP3152FZk4", msg.job_id)
        self.assertEqual("export_taguser", msg.job_type)