Пример #1
0
    def do_track_page_view(self, headers, reqtime=None, title=None, userid=None, session_key=None, status_code=None,
                fail_silently=PIWIK_FAIL_SILENTLY):
        """
        Actually record the page view with Piwik: do the actual work with kwargs from self.get_track_kwargs
        """
        request = FakeRequest(headers)
        pt = PiwikTracker(PIWIK_SITEID, request)

        pt.set_api_url(PIWIK_URL)
        pt.set_token_auth(PIWIK_TOKEN)

        pt.set_ip(get_real_ip(request))

        if session_key:
            visitor_id = hashlib.sha512(session_key).hexdigest()[0:PiwikTracker.LENGTH_VISITOR_ID]
            pt.set_visitor_id(visitor_id)

        if reqtime:
            dt = datetime.datetime.fromtimestamp(reqtime, pytz.utc)
            pt.set_force_visit_date_time(dt)

        if userid:
            pt.set_custom_variable(1, 'userid', userid, scope='visit')

        if status_code:
            pt.set_custom_variable(2, 'status_code', status_code, scope='page')

        if PIWIK_FORCE_HOST:
            pt._set_host(PIWIK_FORCE_HOST)

        try:
            pt.do_track_page_view(title)
        except urllib_errors:
            if not fail_silently:
                raise
Пример #2
0
    def post_dispatch(self, plugin_ctx, methodname, action_metadata):
        """
        Sends the tracking information to the tracking backend
        """
        if not self.is_tracking_allowed(methodname):
            return

        server_names = plugin_ctx.get_from_environ('HTTP_X_FORWARDED_HOST',
                                                   '').split(', ')
        server_name = server_names[0] if server_names else ''
        https = plugin_ctx.get_from_environ('HTTP_X_FORWARDED_PROTOCOL',
                                            '') == 'https'
        remote_addrs = plugin_ctx.get_from_environ(
            'HTTP_X_FORWARDED_FOR',
            plugin_ctx.get_from_environ('REMOTE_ADDR', '')).split(', ')
        remote_addr = remote_addrs[0] if remote_addrs else ''
        path_info = self.context_path.rstrip(
            '/') + plugin_ctx.get_from_environ('PATH_INFO', '')

        headers = {
            'HTTP_USER_AGENT':
            plugin_ctx.get_from_environ('HTTP_USER_AGENT', ''),
            'REMOTE_ADDR':
            remote_addr,
            'HTTP_REFERER':
            plugin_ctx.get_from_environ('HTTP_REFERER', ''),
            'HTTP_ACCEPT_LANGUAGE':
            plugin_ctx.get_from_environ('HTTP_ACCEPT_LANGUAGE', ''),
            'SERVER_NAME':
            server_name,
            'PATH_INFO':
            path_info,
            'QUERY_STRING':
            plugin_ctx.get_from_environ('QUERY_STRING', ''),
            'HTTPS':
            https,
        }

        request = FakeRequest(headers)
        site_id = self.get_site_id(methodname)
        piwiktracker = PiwikTracker(site_id, request)
        piwiktracker.set_api_url(self.tracking_api_url)
        piwiktracker.set_ip(remote_addr)

        if self.is_rest_call(methodname):
            piwiktracker.set_custom_variable(1, 'source', 'rest-python',
                                             'page')

        if self.is_authentication_required():
            piwiktracker.set_token_auth(self.auth_token)

        piwiktracker.do_track_page_view("KonText")
Пример #3
0
    def do_track_page_view(self,
                           headers,
                           reqtime=None,
                           title=None,
                           userid=None,
                           session_key=None,
                           status_code=None,
                           fail_silently=PIWIK_FAIL_SILENTLY):
        """
        Actually record the page view with Piwik: do the actual work with kwargs from self.get_track_kwargs
        """
        request = FakeRequest(headers)
        pt = PiwikTracker(PIWIK_SITEID, request)

        pt.set_api_url(PIWIK_URL)
        pt.set_token_auth(PIWIK_TOKEN)

        pt.set_ip(get_real_ip(request))

        if session_key:
            visitor_id = hashlib.sha512(
                session_key).hexdigest()[0:PiwikTracker.LENGTH_VISITOR_ID]
            pt.set_visitor_id(visitor_id)

        if reqtime:
            dt = datetime.datetime.fromtimestamp(reqtime, pytz.utc)
            pt.set_force_visit_date_time(dt)

        if userid:
            pt.set_custom_variable(1, 'userid', userid, scope='visit')

        if status_code:
            pt.set_custom_variable(2, 'status_code', status_code, scope='page')

        if PIWIK_FORCE_HOST:
            pt._set_host(PIWIK_FORCE_HOST)

        try:
            pt.do_track_page_view(title)
        except urllib_errors:
            if not fail_silently:
                raise
Пример #4
0
    def post_dispatch(self, plugin_api, methodname, action_metadata, log_data):
        """
        Sends the tracking information to the tracking backend
        """
        if not self.is_tracking_allowed(methodname):
            return

        server_names = plugin_api.get_from_environ('HTTP_X_FORWARDED_HOST', '').split(', ')
        server_name = server_names[0] if server_names else ''
        https = plugin_api.get_from_environ('HTTP_X_FORWARDED_PROTOCOL', '') == 'https'
        remote_addrs = plugin_api.get_from_environ('HTTP_X_FORWARDED_FOR',
                                                   plugin_api.get_from_environ('REMOTE_ADDR', '')).split(', ')
        remote_addr = remote_addrs[0] if remote_addrs else ''
        path_info = self.context_path.rstrip('/') + plugin_api.get_from_environ('PATH_INFO', '')

        headers = {
            'HTTP_USER_AGENT': plugin_api.get_from_environ('HTTP_USER_AGENT', ''),
            'REMOTE_ADDR': remote_addr,
            'HTTP_REFERER': plugin_api.get_from_environ('HTTP_REFERER', ''),
            'HTTP_ACCEPT_LANGUAGE': plugin_api.get_from_environ('HTTP_ACCEPT_LANGUAGE', ''),
            'SERVER_NAME': server_name,
            'PATH_INFO': path_info,
            'QUERY_STRING': plugin_api.get_from_environ('QUERY_STRING', ''),
            'HTTPS': https,
        }

        request = FakeRequest(headers)
        site_id = self.get_site_id(methodname)
        piwiktracker = PiwikTracker(site_id, request)
        piwiktracker.set_api_url(self.tracking_api_url)
        piwiktracker.set_ip(remote_addr)

        if self.is_rest_call(methodname):
            piwiktracker.set_custom_variable(1, 'source', 'rest-python', 'page')

        if self.is_authentication_required():
            piwiktracker.set_token_auth(self.auth_token)

        piwiktracker.do_track_page_view("KonText")
Пример #5
0
class TrackerBaseTestCase(PiwikAPITestCase):
    """
    This sets up a more or less random visitor

    In every test run all tests get the same testrun custom variable.
    """
    def setUp(self):
        """
        Set up a PiwikTracker instance
        """
        super(TrackerBaseTestCase, self).setUp()
        headers = {
            'HTTP_USER_AGENT': self.get_random_ua(),
            'HTTP_REFERER': 'http://referer%d.example.com/referer/' %
                random.randint(0, 99),
            'REMOTE_ADDR': self.get_random_ip(),
            'HTTP_ACCEPT_LANGUAGE': self.get_random_language(),
            'QUERY_STRING': 'testrand=%d' % random.randint(0, 99),
            'PATH_INFO': '/path%d/' % random.randint(0, 99),
            'SERVER_NAME': 'action%d.example.com' % random.randint(0, 99),
            'HTTPS': '',
        }
        self.request = FakeRequest(headers)
        self.pt = PiwikTracker(self.settings.PIWIK_SITE_ID, self.request)
        self.pt.set_api_url(self.settings.PIWIK_TRACKING_API_URL)
        self.pt.set_custom_variable(
            1,
            'testrun',
            self.get_unique_string(),
        )

    def get_title(self, title):
        """
        Adds a timestamp to the action title"

        :param title: Action
        :type title: str
        :rtype: str
        """
        now = datetime.datetime.now()
        return "%s %d:%d:%d" % (title, now.hour, now.minute, now.second)

    def get_random_ip(self):
        """
        Returns an IP out of the test networks, see RFC 5735. Seemed to make
        sense to use such addresses for unit tests.

        :rtype: str
        """
        test_networks = (
            '192.0.2',
            '198.51.100',
            '203.0.113',
        )
        return '%s.%d' % (
            test_networks[random.randint(0, len(test_networks) - 1)],
            random.randint(1, 254),
        )

    def get_random(self, choices):
        return choices[random.randint(0, len(choices) - 1)]

    def get_random_ua(self):
        """
        Returns a random user agent string

        Only return Desktop UAs as Piwik doesn't like big resolutions on
        devices it thinks are mobile.

        :rtype: string
        """
        uas = (
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like "
                "Gecko) Chrome/17.0.963.83 Safari/535.11",
            'Mozilla/5.0 (X11; Linux x86_64; rv:10.0.3) Gecko/20100101 ',
                'Firefox/10.0.3 Iceweasel/10.0.3',
            'Opera/9.80 (Windows NT 6.1; WOW64; U; de) Presto/2.10.229 '
                'Version/11.62',
            'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 '
                'Firefox/11.0',
            #'Mozilla/5.0 (iPad; U; CPU iPhone OS 5_1 like Mac OS X; de_DE) '
            #    'AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;'
            #    'FBAV/4.1.1;FBBV/4110.0;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone '
            #    'OS;FBSV/5.1;FBSS/1; FBCR/;FBID/tablet;FBLC/de_DE;FBSF/1.0]',
            #'Mozilla/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-N7000 Build/'
            #    'GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) '
            #    'Version/4.0 Mobile Safari/533.1',
            'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; de-de) '
                'AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 '
                'Safari/533.18.5',
        )
        return self.get_random(uas)

    def get_random_language(self):
        """
        Return a random language code
        """
        langs = (
            'ar-EG',
            'ar-TN',
            'de',
            'en',
            'en-GB',
            'en-US',
            'es',
            'es-AR',
            'fr',
            'in',
            'it',
            'jp',
            'ms',
            'pl',
            'pt',
            'pt-BR',
            'ru',
            'tn',
            'zh-TW',
            'zh-CN',
        )
        return self.get_random(langs)