Ejemplo n.º 1
0
def test_django():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_test.settings")
    sys.path.append(
        os.path.join(
            os.path.abspath(os.path.dirname(__file__)), 'django_test_env'
        )
    )

    from django.test.utils import setup_test_environment
    setup_test_environment()
    from django.test.client import Client
    from werobot.parser import parse_xml, process_message
    import django

    django.setup()
    client = Client()

    token = 'TestDjango'
    timestamp = str(time.time())
    nonce = str(random.randint(0, 10000))
    signature = get_signature(token, timestamp, nonce)
    echostr = generate_token()

    response = client.get(
        '/robot/', {
            'signature': signature,
            'timestamp': timestamp,
            'nonce': nonce,
            'echostr': echostr
        }
    )
    assert response.status_code == 200
    assert response.content.decode('utf-8') == echostr

    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>"""
    params = "?timestamp=%s&nonce=%s&signature=%s" % \
             (timestamp, nonce, signature)
    url = '/robot/'
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 403
    assert response.content.decode('utf-8') == u'喵'

    url += params
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 200
    response = process_message(parse_xml(response.content))
    assert response.content == 'hello'

    response = client.options(url)
    assert response.status_code == 405
Ejemplo n.º 2
0
def test_django():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_test.settings")
    sys.path.append(
        os.path.join(
            os.path.abspath(os.path.dirname(__file__)), 'django_test_env'
        )
    )

    from django.test.utils import setup_test_environment
    setup_test_environment()
    from django.test.client import Client
    from werobot.parser import parse_xml, process_message
    import django

    django.setup()
    client = Client()

    token = 'TestDjango'
    timestamp = str(time.time())
    nonce = str(random.randint(0, 10000))
    signature = get_signature(token, timestamp, nonce)
    echostr = generate_token()

    response = client.get(
        '/robot/', {
            'signature': signature,
            'timestamp': timestamp,
            'nonce': nonce,
            'echostr': echostr
        }
    )
    assert response.status_code == 200
    assert response.content.decode('utf-8') == echostr

    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>"""
    params = "?timestamp=%s&nonce=%s&signature=%s" % \
             (timestamp, nonce, signature)
    url = '/robot/'
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 403
    assert response.content.decode('utf-8') == u'喵'

    url += params
    response = client.post(url, data=xml, content_type="text/xml")

    assert response.status_code == 200
    response = process_message(parse_xml(response.content))
    assert response.content == 'hello'

    response = client.options(url)
    assert response.status_code == 405
Ejemplo n.º 3
0
 def decrypt_message(self, timestamp, nonce, msg_signature, encrypt_msg):
     """
     解密收到的微信消息
     :param timestamp: 请求 URL 中收到的 timestamp
     :param nonce: 请求 URL 中收到的 nonce
     :param msg_signature: 请求 URL 中收到的 msg_signature
     :param encrypt_msg: 收到的加密文本. ( XML 中的 <Encrypt> 部分 )
     :return: 解密后的 XML 文本
     """
     signature = get_signature(self.token, timestamp, nonce, encrypt_msg)
     if signature != msg_signature:
         raise InvalidSignature(msg_signature)
     return self.prp_crypto.decrypt(encrypt_msg, self.app_id)
Ejemplo n.º 4
0
 def decrypt_message(self, timestamp, nonce, msg_signature, encrypt_msg):
     """
     解密收到的微信消息
     :param timestamp: 请求 URL 中收到的 timestamp
     :param nonce: 请求 URL 中收到的 nonce
     :param msg_signature: 请求 URL 中收到的 msg_signature
     :param encrypt_msg: 收到的加密文本. ( XML 中的 <Encrypt> 部分 )
     :return: 解密后的 XML 文本
     """
     signature = get_signature(self.token, timestamp, nonce, encrypt_msg)
     if signature != msg_signature:
         raise InvalidSignature(msg_signature)
     return self.prp_crypto.decrypt(encrypt_msg, self.app_id)
Ejemplo n.º 5
0
    def test_tornado(self):
        token = self.token
        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )

        response = self.fetch(path=self.endpoint + params)
        assert response.code == 200
        assert response.body.decode('utf-8') == echostr

        response = self.fetch(path=self.endpoint, )
        assert response.code == 403
        assert response.body.decode('utf-8') == u'喵'

        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>"""

        response = self.fetch(
            path=self.endpoint + params,
            method='POST',
            body=xml,
            headers={'Content-Type': 'text/xml'}
        )
        self.assertEqual(response.code, 200)
        self.assertEqual(
            process_message(parse_xml(response.body)).content, 'hello'
        )

        response = self.fetch(
            path=self.endpoint,
            method='POST',
            body=xml,
            headers={'Content-Type': 'text/xml'}
        )
        self.assertEqual(response.code, 403)
Ejemplo n.º 6
0
        def test_tornado(self):
            token = self.token
            timestamp = str(time.time())
            nonce = str(random.randint(0, 10000))
            signature = get_signature(token, timestamp, nonce)
            echostr = generate_token()

            params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
                timestamp, nonce, signature, echostr
            )

            response = self.fetch(path=self.endpoint + params)
            assert response.code == 200
            assert response.body.decode('utf-8') == echostr

            response = self.fetch(path=self.endpoint, )
            assert response.code == 403
            assert response.body.decode('utf-8') == u'喵'

            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>"""

            response = self.fetch(
                path=self.endpoint + params,
                method='POST',
                body=xml,
                headers={'Content-Type': 'text/xml'}
            )
            self.assertEqual(response.code, 200)
            self.assertEqual(
                process_message(parse_xml(response.body)).content, 'hello'
            )

            response = self.fetch(
                path=self.endpoint,
                method='POST',
                body=xml,
                headers={'Content-Type': 'text/xml'}
            )
            self.assertEqual(response.code, 403)
Ejemplo n.º 7
0
    def tester(app, token, endpoint):
        test_app = webtest.TestApp(app)

        response = test_app.get(endpoint, expect_errors=True)
        assert response.status_code == 403

        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )
        response = test_app.get(endpoint + params)

        assert response.status_code == 200
        assert response.body.decode('utf-8') == echostr

        response = test_app.get(endpoint, expect_errors=True)

        assert response.status_code == 403
        assert response.body.decode('utf-8') == u'喵'

        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>
                """
        with pytest.raises(AppError):
            # WebTest will raise an AppError
            # if the status_code is not >= 200 and < 400.
            test_app.post(endpoint, xml, content_type="text/xml")

        response = test_app.post(
            endpoint + params, xml, content_type="text/xml"
        )

        assert response.status_code == 200
        response = process_message(parse_xml(response.body))
        assert response.content == 'hello'
Ejemplo n.º 8
0
    def tester(app, token, endpoint):
        test_app = webtest.TestApp(app)

        response = test_app.get(endpoint, expect_errors=True)
        assert response.status_code == 403

        timestamp = str(time.time())
        nonce = str(random.randint(0, 10000))
        signature = get_signature(token, timestamp, nonce)
        echostr = generate_token()

        params = "?timestamp=%s&nonce=%s&signature=%s&echostr=%s" % (
            timestamp, nonce, signature, echostr
        )
        response = test_app.get(endpoint + params)

        assert response.status_code == 200
        assert response.body.decode('utf-8') == echostr

        response = test_app.get(endpoint, expect_errors=True)

        assert response.status_code == 403
        assert response.body.decode('utf-8') == u'喵'

        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>
                """
        with pytest.raises(AppError):
            # WebTest will raise an AppError
            # if the status_code is not >= 200 and < 400.
            test_app.post(endpoint, xml, content_type="text/xml")

        response = test_app.post(
            endpoint + params, xml, content_type="text/xml"
        )

        assert response.status_code == 200
        response = process_message(parse_xml(response.body))
        assert response.content == 'hello'
Ejemplo n.º 9
0
    def encrypt_message(self, reply, timestamp=None, nonce=None):
        """
        加密微信回复
        :param reply: 加密前的回复
        :type reply: WeChatReply 或 XML 文本
        :return: 加密后的回复文本
        """
        if hasattr(reply, "render"):
            reply = reply.render()

        timestamp = timestamp or to_text(int(time.time()))
        nonce = nonce or generate_token(5)
        encrypt = to_text(self.prp_crypto.encrypt(reply, self.app_id))
        signature = get_signature(self.token, timestamp, nonce, encrypt)
        return to_text(
            self.ENCRYPTED_MESSAGE_XML.format(encrypt=encrypt,
                                              signature=signature,
                                              timestamp=timestamp,
                                              nonce=nonce))
Ejemplo n.º 10
0
    def encrypt_message(self, reply, timestamp=None, nonce=None):
        """
        加密微信回复
        :param reply: 加密前的回复
        :type reply: WeChatReply 或 XML 文本
        :return: 加密后的回复文本
        """
        if hasattr(reply, "render"):
            reply = reply.render()

        timestamp = timestamp or to_text(int(time.time()))
        nonce = nonce or generate_token(5)
        encrypt = to_text(self.prp_crypto.encrypt(reply, self.app_id))
        signature = get_signature(self.token, timestamp, nonce, encrypt)
        return to_text(self.ENCRYPTED_MESSAGE_XML.format(
            encrypt=encrypt,
            signature=signature,
            timestamp=timestamp,
            nonce=nonce
        ))