Уникальное количество просмотров

1 февраля 2008 в 18:50
Аватар пользователя shock shock 0 25

Если эта тема уже где-то поднималась, извеняюсь - не нашел, укажите пожалуйста.
Стандартный модуль статистики может выдавать количество показов ноды, однако накручивать такой счетчик не составляет труда. Нажатие и удерживание клавиши F5 это демонстрирует.
Так вот, вопрос в следующем, можно ли сделать эту статистику более объективной, чтобы учитывался только один показ для каждого посетителя или для каждой сессии...? Хотя бы, чтоб пример с F5 не работал Smile

Комментарии

Оно Вам надо?
Мое личное мнение : модуль статистики нужно вырубать напрочь.
На самом деле существуют службы учета статистики, те же гугл аналитикс или лив-интернет, ну на худой конец хот-лог.
Нагружать свой сайт лишним модулем, который должен отработать для каждой страницы я бы не стал (учитывая, что есть сторонние службы, которые дают порой более точную и подробную информацию).

1 февраля 2008 в 23:48

Ну как же, сервисы статистики дают информацию о популярных страницах.
Единственное там не узнаешь сколько времени отработала та или иная страница.

2 февраля 2008 в 0:56

Вот именно, мне это нужно именно для вывода самых популярных нод.
Короче говоря, с помощью Views, в блоке я вывожу несколько самых популярных рисунков из галерей. Так что статистику мне нужно считать внутренними средствами.
Может как по другому можно сделать - не знаю. Посоветуйте, пожалуйста.

2 февраля 2008 в 3:27

Ну да, ну да.
В таком случае понятно.
По моему был модуль адвансед статистик (или что то типа того).
Только учтите, что производительности это не прибавит.

2 февраля 2008 в 19:16

Спасибо, попробую адвансед статистик.
А вообще как-то странно, что стандартный модуль этого не позволяет. Хоть бы к сессии привязывали, что-ли...

3 февраля 2008 в 15:37

Всем спасибо!
В общем, решение нашел сам, немного подправив стандартный модуль статистики (как вынести свое решение в отдельный модуль - не знаю). При увеличении счетчика посещаемости ноды, ID этой ноды добавляется в $_SESSION. И при последующих посещениях этой ноды, проверяется наличие nid в $_SESSION.

Если кто может посоветовать, как вынести это в отдельный модуль - милости просим, жду советов.

3 февраля 2008 в 19:28

да, стандартный модуль убогий... приходиться юзать google analytics... но неудобно из локалки лишний трафик и прокси авторизацию просит при заходе на локальный сайт.

4 февраля 2008 в 7:45

Господа, а что мешает вам анализировать лог доступа веб-сервера?

1) В логах не всё есть, поэтому на том же Гугле Аналитиксе больше видов отчётов.
2) Текущие рейтинги тяжко строить по логам... хотя и возможно.

4 февраля 2008 в 16:29

2Slavyansk.net.ru - значит опубликуем как "хак" Smile
Цель хака - сделать так, чтобы стандартный модуль статистики считал просмотры ноды более объективно - за одну сессию учитывается только один просмотр.
Реализация - правим файл "modules/statistics/statistics.module", функцию statistics_exit():
Исходный код функции (жирным выделены добавленные мной строки):

function statistics_exit() {
  global $user, $recent_activity;

  drupal_bootstrap(DRUPAL_BOOTSTRAP_PATH);

  if (variable_get('statistics_count_content_views', 0)) {
    // We are counting content views.
    if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
      // A node has been viewed, so update the node's counters.
		$first_time = true;
		if (isset($_SESSION['nodes'])){
			$nodes = explode(',',$_SESSION['nodes']);
			if (!in_array(arg(1),$nodes)){
				$nodes[] = arg(1);
			}else{
				$first_time = false;
			}
		}else{
			$nodes = array();
		}
		$_SESSION['nodes'] = implode(',',$nodes);

		if ($first_time){
			db_query('UPDATE {node_counter} SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = %d WHERE nid = %d', time(), arg(1));
			// If we affected 0 rows, this is the first time viewing the node.
			if (!db_affected_rows()) {
			// We must create a new row to store counters for the new node.
			db_query('INSERT INTO {node_counter} (nid, daycount, totalcount, timestamp) VALUES (%d, 1, 1, %d)', arg(1), time());
			}
		}
    }
  }
  if ((variable_get('statistics_enable_access_log', 0)) && (module_invoke('throttle', 'status') == 0)) {
    // Log this page access.
		db_query("INSERT INTO {accesslog} (title, path, url, hostname, uid, sid, timer, timestamp) values('%s', '%s', '%s', '%s', %d, '%s', %d, %d)", strip_tags(drupal_get_title()), $_GET['q'], referer_uri(), $_SERVER['REMOTE_ADDR'], $user->uid, session_id(), timer_read('page'), time());
  }
}
4 февраля 2008 в 16:39

Люди!
До меня только что дошло!
Даже если вы представите это решение как вариант модификации системного модуля - у вас его не примут.
Потому как это противоречит смыслу.
Мы говорим про что? Про количество просмотров данной страницы.
Ограничивать это колличество по одному пользователю или по одной сессии - это не корректно.
Количество просмотров это и есть количество просмотров и не важно одним пользователем или нет.
Может посетитель ходил, ходил по сайту, а потом решил перечитать статью, которую видел в начале и что, мы будем считать, что он ее второй раз не смотрел?

5 февраля 2008 в 2:02

сделал хаком для statistics - само то, что-то же надо в плашках выводить - 0 комментариев, 0 просмотров и т.п. ну и чтобы так просто не накручивались

25 апреля 2008 в 19:20

шел 2015 год... а модуля все нет
для Drupal 7 добавил код от shock в файл модуля statistics.php
только пришлось еще добавить session_start(); строку в начале

<?php
if (is_numeric($nid)) {
        
session_start();
        
$first_time true;
        if (isset(
$_SESSION['nodes'])){
            
$nodes explode(',',$_SESSION['nodes']);
            if (!
in_array(arg(1),$nodes)){
                
$nodes[] = arg(1);
            }else{
                
$first_time false;
            }
        }else{
            
$nodes = array();
        }
        
$_SESSION['nodes'] = implode(',',$nodes);
      
        if (
$first_time){
            
db_merge('node_counter')
              ->
key(array('nid' => $nid))
              ->
fields(array(
                
'daycount' => 1,
                
'totalcount' => 1,
                
'timestamp' => REQUEST_TIME,
              ))
              ->
expression('daycount''daycount + 1')
              ->
expression('totalcount''totalcount + 1')
              ->
execute();
        }
  }
?>

в общем сделал копию модуля выложил тут https://github.com/alfaq/unick_statistics , качаем папка модуля должна называться unick_statistics. Это стандартный модуль + код выше + переименование всего модуля

3 августа 2015 в 16:16

Обнаружилась проблема. Для views модуля пропали поля content statistics: total views (например) я так понимаю нужно найти их от стандартного модуля статистики во views и тоже поправить под модуль выше

3 августа 2015 в 17:21

рабочий код будет таким, т.к. функция arg в предыдущем случае не возвращала id ноды. В итоге фиксировался только самый первый просмотр на всем сайте за сесиию.

<?phpif (variable_get('statistics_count_content_views', 0) && variable_get('statistics_count_content_views_ajax', 0)) {
    $nid = $_POST['nid'];
    if (is_numeric($nid)) {
        drupal_session_start();
        $first_time = true;
        if (isset($_SESSION['nodes'])){
            $nodes = explode(',',$_SESSION['nodes']);
            if (!in_array($nid,$nodes)){
                $nodes[] = $nid;
            }else{
                $first_time = false;
            }
        }else{
            $nodes = array();
        }
        $_SESSION['nodes'] = implode(',',$nodes);
        if ($first_time){
            db_merge('node_counter')
              ->key(array('nid' => $nid))
              ->fields(array(
                'daycount' => 1,
                'totalcount' => 1,
                'timestamp' => REQUEST_TIME,
              ))
              ->expression('daycount', 'daycount + 1')
              ->expression('totalcount', 'totalcount + 1')
              ->execute();
        }
    }
}?>
14 октября 2015 в 12:15