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