def process_request(self, request): key = '_tracking_banned_ips' # compile a list of all banned IP addresses ips = [b.ip_address for b in BannedIP.objects.all()] # check to see if the current user's IP address is in that list if utils.get_ip(request) in ips: raise Http404
def handler_profileuser_post(sender, request, extra, **kwargs): """docstring for handler_profileuser_create""" l.debug("Signal post_signal -> handler_profileuser_post") if sender.func_name == 'register': from fsb.profile.models import ProfileUser p, created = ProfileUser.objects.get_or_create(user=extra['newuser']) if created: p.regip = get_ip(request) p.save()
def process_request(self, request): # compile a list of all banned IP addresses try: ips = [b.ip_address for b in BannedIP.objects.all()] except: # in case we don't have the database setup yet ips = [] # check to see if the current user's IP address is in that list if utils.get_ip(request) in ips: raise Http404
def process_request(self, request): # filtering authenticated users if request.user.is_authenticated(): return # filtering static and media files for prefix in self.prefixes: if request.path.startswith(prefix): return ip_address = get_ip(request) user_agent = unicode( request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') if not request.session.session_key: request.session.save() session_key = request.session.session_key if request.path.startswith(self.ARTICLE_VIEW_PREFIX): opv_list = OutsideArticleVisitor.objects.filter( ip_address=ip_address, user_agent=user_agent) if opv_list.count() == 1: opv = opv_list[0] opv.session_key = session_key opv.save() elif opv_list.count() == 0: opv, created = OutsideArticleVisitor.objects.get_or_create( session_key=session_key) if created: opv.entry_point = request.path opv.user_agent = user_agent opv.ip_address = ip_address opv.save() return else: opv = opv_list.order_by('-session_start')[0] opv.session_key = session_key opv.save() for duplicate in opv_list.order_by('-session_start')[1:]: duplicate.delete() elif request.path.startswith(self.LOGIN_PREFIX): try: opv = OutsideArticleVisitor.objects.get( session_key=session_key) opv.logged_in = True opv.login_time = datetime.datetime.now() opv.save() return except OutsideArticleVisitor.DoesNotExist: return
def process_request(self, request): key = '_tracking_banned_ips' ips = cache.get(key) if ips is None: # compile a list of all banned IP addresses log.info('Updating banned IPs cache') ips = [b.ip_address for b in BannedIP.objects.all()] cache.set(key, ips, 3600) # check to see if the current user's IP address is in that list if utils.get_ip(request) in ips: raise Http404
def track_site_object(sender, **kwargs): """Saves information about site object requested by visitor""" request = kwargs['request'] session_key = utils.get_session_key(request) ip_address = utils.get_ip(request) try: visitor = Visitor.objects.get(session_key=session_key, ip_address=ip_address) except Visitor.DoesNotExist: # track site object only if visitor is tracked return if not SiteObject.objects.filter(visitor=visitor).exists(): site_object = SiteObject(content_object=sender, visitor=visitor) try: site_object.save() except DatabaseError: log.error('There was a problem saving site object information:\n%s\n\n%s' % (traceback.format_exc(), locals()))
def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. aff_id = request.GET.get('aff_id', default=None) if aff_id: aff_id = aff_id[:20] attrs = { 'session_key': request.session.session_key, 'ip_address': utils.get_ip(request), 'user_agent': request.META.get('HTTP_USER_AGENT', '')[:255], 'referrer': request.META.get('HTTP_REFERER', 'unknown')[:255], 'url': request.path, 'request_method': request.method, 'aff_id': aff_id, 'language': get_language(), 'is_bot': False, } try: Visitors.objects.create(**attrs) except DatabaseError: log.error('There was a problem saving visitor information:\n%s', locals()) response = self.get_response(request) # Code to be executed for each request/response after # the view is called. return response # class BannedIPMiddleware: # # def process_request(self, request): # key = '_tracking_banned_ips' # ips = cache.get(key) # if ips is None: # log.info('Updating banned IPs cache') # ips = [b.ip_address for b in BannedIP.objects.all()] # cache.set(key, ips, 3600) # if utils.get_ip(request) in ips: # raise Http404
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now try: visitor.save() except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals()))
def process_request(self, request): # don't process AJAX requests if request.path.startswith("/s/") or request.path.startswith("/static/") or request.path.startswith("/admin/")\ or request.path.startswith("/favicon.ico") or (request.is_ajax() and not request.path.startswith('/o/')): return # create some useful variables ip_address = utils.get_ip(request) user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = {'session_key': session_key, 'ip_address': ip_address} visitor_id = request.session.get('visitor_id', None) if not visitor_id: # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.only('id').get(**attrs) except Visitor.DoesNotExist: request.session.set_test_cookie() # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.only('id').filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) try: visitor.save() except DatabaseError: print_stack_trace() log.error( 'There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals())) except: return request.session['visitor_id'] = visitor_id = visitor.id redis_data = redis.get('visitor_data_%s' % visitor_id) or '{}' visitor_data = json.loads(redis_data) visitor_data['visitor_id'] = visitor_id # update the tracking information visitor_data['user_agent'] = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = pytz.UTC.localize(now - timedelta(hours=1)) # TODO: ensure that we are on the same time zone - I just put UTC for now # to get it working last_update = visitor_data.get('last_update', None) if not last_update or last_update <= time.mktime( one_hour_ago.timetuple()): visitor_data['referrer'] = utils.u_clean( request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor_data['page_views'] = 0 visitor_data['session_start'] = time.mktime(now.timetuple()) visitor_data['url'] = request.path page_views = visitor_data.get('page_views', 0) + 1 visitor_data['page_views'] = page_views visitor_data['last_update'] = time.mktime(now.timetuple()) try: # Extracting visitor data from GA cookie cookie = request.COOKIES.get('__utmz') if cookie: try: data = cookie.split('.', 4)[-1] data = dict(match.groups() for match in re.finditer( r'(utm(?:csr|ccn|cmd|ctr))=([^\|]*)', data)) except (ValueError, IndexError): log.error('Malformed GA cookie: {0!r}'.format(cookie)) else: visitor_data['source'] = normalize_ga_value( data.get('utmcsr')) visitor_data['medium'] = normalize_ga_value( data.get('utmcmd')) visitor_data['campaign'] = normalize_ga_value( data.get('utmccn')) visitor_data['keywords'] = normalize_ga_value( data.get('utm.ctr')) utm_source = request.GET.get("utm_source", "unknown") request.session['acquisition_source_name'] = utm_source if utm_source != "unknown": # utm_source: Identify the advertiser, site, publication, etc. that is sending traffic to your property, e.g. google, citysearch, newsletter4, billboard. # utm_medium: The advertising or marketing medium, e.g.: cpc, banner, email newsletter. # utm_campaign: The individual campaign name, slogan, promo code, etc. for a product. # utm_term: Identify paid search keywords. If you're manually tagging paid keyword campaigns, you should also use utm_term to specify the keyword. # utm_content: Used to differentiate similar content, or links within the same ad. For example, if you have two call-to-action links within the same email message, you can use utm_content and set different values for each so you can tell which version is more effective. #update the tracking info with the latest and bump the old one to be stored in the history #visitor.bump_past_acquisition_info() past_acquisition_info = visitor_data.get( 'past_acquisition_info', []) if visitor_data.get('acquisition_source', None): old_visitor_data = {'date_valid_until': time.time()} for k in VISITOR_PARAMS_MAPPING.keys(): old_visitor_data[k] = visitor_data.get(k, None) past_acquisition_info.append(old_visitor_data) visitor_data[ 'past_acquisition_info'] = past_acquisition_info for k, v in VISITOR_PARAMS_MAPPING.items(): value = request.GET.get(v, 'unknown')[:255] visitor_data[k] = value except: print_stack_trace() redis.set('visitor_data_%s' % visitor_id, json.dumps(visitor_data))
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = right_now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now try: visitor.save() except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals()))
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '')[:255] # see if the user agent is not supposed to be tracked for ua in UntrackedUserAgent.objects.all(): # if the keyword is found in the user agent, stop tracking if str(user_agent).find(ua.keyword) != -1: return if hasattr(request, 'session'): # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) prefixes = utils.get_untracked_prefixes() # don't track media file requests if settings.MEDIA_URL: prefixes.append(settings.MEDIA_URL) if settings.ADMIN_MEDIA_PREFIX: prefixes.append(settings.ADMIN_MEDIA_PREFIX) try: # finally, don't track requests to the tracker update pages prefixes.append(reverse('tracking-refresh-active-users')) except NoReverseMatch: # django-tracking hasn't been included in the URLconf if we get here pass # ensure that the request.path does not begin with any of the prefixes for prefix in prefixes: if request.path.startswith(prefix): return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, VisitorTracked.objects.get_or_create was not working here try: visitor = VisitorTracked.objects.get(**attrs) except VisitorTracked.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) filter_params = { 'ip_address': ip_address, 'user_agent': user_agent, 'last_update__gte': cutoff } try: visitor = VisitorTracked.objects.get(**filter_params) visitor.session_key = session_key except VisitorTracked.MultipleObjectsReturned: # just get the first match visitor = VisitorTracked.objects.filter(**filter_params)[0] visitor.session_key = session_key except VisitorTracked.DoesNotExist: # it's probably safe to assume that the visitor is brand new visitor = VisitorTracked(**attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = request.META.get('HTTP_REFERER', 'unknown')[:255] # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now visitor.save()
def process_request(self, request): # create some useful variables ip_address = utils.get_ip(request) user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if not request.session.session_key: request.session.save() session_key = request.session.session_key # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is # For now we have made a fork that works with MySQL backed Django that # also has the setting USE_TZ set to False (we are no longer calling `localtime()`) now=timezone.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: visitor, created = Visitor.objects.get_or_create(**attrs) if created: log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now try: sid = transaction.savepoint() visitor.save() transaction.savepoint_commit(sid) except IntegrityError: transaction.savepoint_rollback(sid) except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals()))
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '')[:255] # see if the user agent is not supposed to be tracked for ua in UntrackedUserAgent.objects.all(): # if the keyword is found in the user agent, stop tracking if str(user_agent).find(ua.keyword) != -1: return if hasattr(request, 'session'): # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) prefixes = utils.get_untracked_prefixes() # don't track media file requests if settings.MEDIA_URL and settings.MEDIA_URL != '/': prefixes.append(settings.MEDIA_URL) if settings.ADMIN_MEDIA_PREFIX: prefixes.append(settings.ADMIN_MEDIA_PREFIX) try: # finally, don't track requests to the tracker update pages prefixes.append(reverse('tracking-refresh-active-users')) except NoReverseMatch: # django-tracking hasn't been included in the URLconf if we get here pass # ensure that the request.path does not begin with any of the prefixes for prefix in prefixes: if request.path.startswith(prefix): return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) filter_params = { 'ip_address': ip_address, 'user_agent': user_agent, 'last_update__gte': cutoff } try: visitor = Visitor.objects.get(**filter_params) visitor.session_key = session_key except Visitor.MultipleObjectsReturned: # just get the first match visitor = Visitor.objects.filter(**filter_params)[0] visitor.session_key = session_key except Visitor.DoesNotExist: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = request.META.get('HTTP_REFERER', 'unknown')[:255] # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now visitor.save()
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '') if utils.user_agent_is_untracked( user_agent ): log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session'): # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = md5( '%s:%s' % ( ip_address, user_agent ) ).hexdigest() # ensure that the request.path does not begin with any of the prefixes for prefix in NO_TRACKING_PREFIXES: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.filter( ip_address=ip_address, user_agent=user_agent[:255], last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent[:255] # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL if not visitor.last_update or visitor.last_update <= ( now - timedelta( hours = 1 ) ) : visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path[:255] visitor.page_views += 1 visitor.last_update = now visitor.save()
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '')[:255] # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = list(UntrackedUserAgent.objects.all()) cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if unicode(user_agent, errors='ignore').find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session'): if not request.session.session_key: request.session.save() # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() # Attributes we use when creating a new user new_attrs = { 'session_key': session_key, 'ip_address': ip_address } # If we have a visitor_id cookie, use it visitor_id = request.COOKIES.get('visitor_id') if visitor_id: attrs = {'id': visitor_id} else: attrs = new_attrs # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # add tracking ID to model if specified in the URL tid = request.GET.get('tid') or request.GET.get('fb_source') if tid: get = request.GET.copy() attrs['tid'] = tid request.GET = get visitor = Visitor(**new_attrs) log.debug('Created a new visitor: %s' % new_attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, update their referrer URL if not visitor.last_update: visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now try: visitor.save() except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals())) request.visitor = visitor request.session['visitor_id'] = visitor.pk
def process_request(self, request): # don't process AJAX requests if request.path.startswith("/s/") or request.path.startswith("/static/") or request.path.startswith("/admin/")\ or request.path.startswith("/favicon.ico") or (request.is_ajax() and not request.path.startswith('/o/')): return # create some useful variables ip_address = utils.get_ip(request) user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = datetime.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } visitor_id = request.session.get('visitor_id', None) if not visitor_id: # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.only('id').get(**attrs) except Visitor.DoesNotExist: request.session.set_test_cookie() # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.only('id').filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) try: visitor.save() except DatabaseError: print_stack_trace() log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals())) except: return request.session['visitor_id'] = visitor_id = visitor.id redis_data = redis.get('visitor_data_%s' % visitor_id) or '{}' visitor_data = json.loads(redis_data) visitor_data['visitor_id'] = visitor_id # update the tracking information visitor_data['user_agent'] = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = pytz.UTC.localize(now - timedelta(hours=1)) # TODO: ensure that we are on the same time zone - I just put UTC for now # to get it working last_update = visitor_data.get('last_update', None) if not last_update or last_update <= time.mktime(one_hour_ago.timetuple()): visitor_data['referrer'] = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor_data['page_views'] = 0 visitor_data['session_start'] = time.mktime(now.timetuple()) visitor_data['url'] = request.path page_views = visitor_data.get('page_views', 0) + 1 visitor_data['page_views'] = page_views visitor_data['last_update'] = time.mktime(now.timetuple()) try: # Extracting visitor data from GA cookie cookie = request.COOKIES.get('__utmz') if cookie: try: data = cookie.split('.', 4)[-1] data = dict(match.groups() for match in re.finditer( r'(utm(?:csr|ccn|cmd|ctr))=([^\|]*)', data)) except (ValueError, IndexError): log.error('Malformed GA cookie: {0!r}'.format(cookie)) else: visitor_data['source'] = normalize_ga_value(data.get('utmcsr')) visitor_data['medium'] = normalize_ga_value(data.get('utmcmd')) visitor_data['campaign'] = normalize_ga_value(data.get('utmccn')) visitor_data['keywords'] = normalize_ga_value(data.get('utm.ctr')) utm_source = request.GET.get("utm_source", "unknown") request.session['acquisition_source_name'] = utm_source if utm_source != "unknown": # utm_source: Identify the advertiser, site, publication, etc. that is sending traffic to your property, e.g. google, citysearch, newsletter4, billboard. # utm_medium: The advertising or marketing medium, e.g.: cpc, banner, email newsletter. # utm_campaign: The individual campaign name, slogan, promo code, etc. for a product. # utm_term: Identify paid search keywords. If you're manually tagging paid keyword campaigns, you should also use utm_term to specify the keyword. # utm_content: Used to differentiate similar content, or links within the same ad. For example, if you have two call-to-action links within the same email message, you can use utm_content and set different values for each so you can tell which version is more effective. #update the tracking info with the latest and bump the old one to be stored in the history #visitor.bump_past_acquisition_info() past_acquisition_info = visitor_data.get('past_acquisition_info', []) if visitor_data.get('acquisition_source', None): old_visitor_data = {'date_valid_until': time.time()} for k in VISITOR_PARAMS_MAPPING.keys(): old_visitor_data[k] = visitor_data.get(k, None) past_acquisition_info.append(old_visitor_data) visitor_data['past_acquisition_info'] = past_acquisition_info for k,v in VISITOR_PARAMS_MAPPING.items(): value = request.GET.get(v, 'unknown')[:255] visitor_data[k] = value except: print_stack_trace() redis.set('visitor_data_%s' % visitor_id, json.dumps(visitor_data))
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) #user_agent = unicode(request.META.get('HTTP_USER_AGENT', '')[:255], errors='ignore') user_agent = str(request.META.get('HTTP_USER_AGENT', '')[:255] ) # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = timezone.now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent visitor.pv += 1 """ try: visitor.save() except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals())) """ #visitor.url = request.path """ pageview, created = PageView.objects.get_or_create(url=request.path, defaults={ 'visitor': visitor}) pageview.url = request.path pageview.pv = pageview.pv + 1 try: pageview.save() except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals())) """ username = user.username if user else 'anonymous' log.info('time: {}, ip: {}, user: {}, url: {},'.format(now, ip_address, username, request.path))