def init_app(self, app, endpoint='werobot', rule=None):
        """
        为一个应用添加 WeRoBot 支持。
        如果你在实例化 ``WeRoBot`` 类的时候传入了一个 Flask App ,会自动调用本方法;
        否则你需要手动调用 ``init_app`` 来为应用添加支持。
        可以通过多次调用 ``init_app`` 并分别传入不同的 Flask App 来复用微信机器人。

        :param app: 一个标准的 Flask App。
        :param endpoint: WeRoBot 的 Endpoint 。默认为 ``werobot`` 。
            你可以通过 url_for(endpoint) 来获取到 WeRoBot 的地址。
            如果你想要在同一个应用中绑定多个 WeRoBot 机器人, 请使用不同的 endpoint .
        :param rule:
          WeRoBot 机器人的绑定地址。默认为 Flask App Config 中的 ``WEROBOT_ROLE``
        """
        assert isinstance(app, Flask)
        from werobot.utils import check_token
        from werobot.parser import parse_user_msg
        from werobot.reply import create_reply

        self.app = app
        config = app.config
        token = self.token
        if token is None:
            token = config.setdefault('WEROBOT_TOKEN', 'none')
        if not check_token(token):
            raise AttributeError('%s is not a vailed WeChat Token.' % token)
        if rule is None:
            rule = config.setdefault('WEROBOT_ROLE', '/wechat')

        if not check_token(token):
            raise AttributeError('%s is an invalid token.' % token)
        self.token = token

        from flask import request, make_response

        def handler():
            if not self.check_signature(request.args.get('timestamp', ''),
                                        request.args.get('nonce', ''),
                                        request.args.get('signature', '')):
                return 'Invalid Request.'
            if request.method == 'GET':
                return request.args['echostr']

            body = request.data
            message = parse_user_msg(body)
            reply = self.get_reply(message)
            if not reply:
                return ''
            response = make_response(create_reply(reply, message=message))
            response.headers['content_type'] = 'application/xml'
            return response

        app.add_url_rule(rule,
                         endpoint=endpoint,
                         view_func=handler,
                         methods=['GET', 'POST'])
Example #2
0
    def init_app(self, app, endpoint='werobot', rule=None):
        """
        为一个应用添加 WeRoBot 支持。
        如果你在实例化 ``WeRoBot`` 类的时候传入了一个 Flask App ,会自动调用本方法;
        否则你需要手动调用 ``init_app`` 来为应用添加支持。
        可以通过多次调用 ``init_app`` 并分别传入不同的 Flask App 来复用微信机器人。

        :param app: 一个标准的 Flask App。
        :param endpoint: WeRoBot 的 Endpoint 。默认为 ``werobot`` 。
            你可以通过 url_for(endpoint) 来获取到 WeRoBot 的地址。
            如果你想要在同一个应用中绑定多个 WeRoBot 机器人, 请使用不同的 endpoint .
        :param rule:
          WeRoBot 机器人的绑定地址。默认为 Flask App Config 中的 ``WEROBOT_ROLE``
        """
        assert isinstance(app, Flask)
        from werobot.utils import check_token
        from werobot.parser import parse_user_msg
        from werobot.reply import create_reply

        self.app = app
        config = app.config
        token = self.token
        if token is None:
            token = config.setdefault('WEROBOT_TOKEN', 'none')
        if not check_token(token):
            raise AttributeError('%s is not a vailed WeChat Token.' % token)
        if rule is None:
            rule = config.setdefault('WEROBOT_ROLE', '/wechat')

        if not check_token(token):
            raise AttributeError('%s is not a vaild token.' % token)
        self.token = token

        from flask import request, make_response

        def handler():
            if not self.check_signature(
                    request.args.get('timestamp', ''),
                    request.args.get('nonce', ''),
                    request.args.get('signature', '')
            ):
                return 'Unvailed request.'
            if request.method == 'GET':
                return request.args['echostr']

            body = request.data
            message = parse_user_msg(body)
            reply = self.get_reply(message)
            if not reply:
                return ''
            response = make_response(create_reply(reply, message=message))
            response.headers['content_type'] = 'application/xml'
            return response

        app.add_url_rule(rule, endpoint=endpoint,
                         view_func=handler, methods=['GET', 'POST'])
Example #3
0
def test_token_generator():
    assert not check_token('AA C')
    assert check_token(generate_token())
Example #4
0
def test_token_generator():
    assert not check_token('AA C')
    assert check_token(generate_token())
Example #5
0
    def init_app(self, app, endpoint='werobot', rule=None):
        """
        为一个应用添加 WeRoBot 支持。
        如果你在实例化 ``WeRoBot`` 类的时候传入了一个 Flask App ,会自动调用本方法;
        否则你需要手动调用 ``init_app`` 来为应用添加支持。
        可以通过多次调用 ``init_app`` 并分别传入不同的 Flask App 来复用微信机器人。

        :param app: 一个标准的 Flask App。
        :param endpoint: WeRoBot 的 Endpoint 。默认为 ``werobot`` 。
            你可以通过 url_for(endpoint) 来获取到 WeRoBot 的地址。
            如果你想要在同一个应用中绑定多个 WeRoBot 机器人, 请使用不同的 endpoint .
        :param rule:
          WeRoBot 机器人的绑定地址。默认为 Flask App Config 中的 ``WEROBOT_ROLE``
        """
        assert isinstance(app, Flask)
        from werobot.utils import check_token
        from werobot.parser import parse_user_msg
        from werobot.reply import create_reply

        self.app = app
        config = app.config
        token = self.token
        if token is None:
            # config的类继承自字典, setdefault()属于字典的方法
            # 如果键在字典中, setdefault()返回其值, 否则向字典中插入新键并设默认值
            token = config.setdefault('WEROBOT_TOKEN', 'none')
        if not check_token(token):
            raise AttributeError('%s is not a vailed WeChat Token.' % token)
        # 设置werobot的访问地址, 默认为 '/wechat'
        if rule is None:
            rule = config.setdefault('WEROBOT_ROLE', '/wechat')

        self.token = token

        from flask import request, make_response, abort

        def handler():
            if not self.check_signature(
                    request.args.get('timestamp', ''),
                    request.args.get('nonce', ''),
                    request.args.get('signature', '')
            ):
                return 'Invalid Request.'
            if request.method == 'GET':
                return request.args('echostr')

            body = request.data
            message = parse_user_msg(body)
            # get_reply() return the reply object for given message
            reply = self.get_reply(message)
            if not reply:
                return ''
            # flask将视图函数的返回值自动转为一个响应对像. 如果返回值是一个字符串
            # 它将被转换为以该字符串为主体的, 状态码为200, MIME类型是 text/html的响应对像.
            # flask 把返回值转为响应对像的逻辑如下:
            #   1. 如果返回值是一个合法的响应对像, 它会从视图直接返回
            #   2. 如果返回的是一个字符串, 响应对像会用字符串数据和默认参数创建
            #   3. 如果返回的是一个元组, 且元组中的元素可以提供额外的信息.
            #      这样的元组必须是 (response, status, headers) 形式, 且至少包含一个元素.
            #      status值会覆盖状态代码, headers可以是一个列表或者字典, 做为额外的消息标头值
            #   4. 如果上述条件均不满足, flask假设返回值是一个合法的WSGI应用程序,
            #      并转换为一个请求对像
            # 如果想在视图中操纵上述步骤结果的响应对像, 可以使用make_response()函数
            response = make_response(create_reply(reply, message=message))
            response.headers['content_type'] = 'application/xml'
            return response
        # 下面这个add_url_rule()的等效代码为:
        # @app.route(rule, methods = ['GET', 'POST'])
        # def handler()
        #    some_code...

        app.add_url_rule(rule, endpoint=endpoint,
                         view_func=handler, methods=['GET', 'POST'])