Как отслеживать скачивание файлов

81

У меня есть веб-сайт, который воспроизводит mp3 во флеш-плеере. Если пользователь нажимает кнопку «Воспроизвести», флэш-плеер автоматически загружает mp3 и начинает его воспроизведение.

Есть ли простой способ отследить, сколько раз был загружен конкретный клип песни (или любой двоичный файл)?


Ссылка на воспроизведение - это ссылка на настоящий mp3-файл или на какой-то код javascript, который вызывает проигрыватель?

В последнем случае вы можете легко добавить туда свой собственный код регистрации, чтобы отслеживать количество обращений к нему.

Если первое, вам понадобится что-то, что может отслеживать сам журнал веб-сервера и делать это различие. Мой план хостинга включает Webalizer, который отлично справляется с этой задачей.

Это код javascript, который отвечает на этот вопрос.

Однако было бы неплохо узнать, как отслеживать загрузки другим методом (без переключения хостов).

Грант
источник

Ответы:

39

Забавно то, что 2 дня назад я написал медиа-галерею на php для всех моих музыкальных произведений. У меня была аналогичная проблема. Я использую http://musicplayer.sourceforge.net/ для плеера. А плейлист построен через php. Все запросы на музыку отправляются в скрипт с именем xfer.php? File = WHATEVER

$filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));

//  Put either file counting code here, either a db or static files
//
readfile($filename);  //and spit the user the file

function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_,', '+/='));
}

И когда вы вызываете файлы, используйте что-то вроде:

function base64_url_encode($input) {
     return strtr(base64_encode($input), '+/=', '-_,');
}

http://us.php.net/manual/en/function.base64-encode.php

Если вы используете какой-то JavaScript или flash-плеер (например, JW-плеер), который требует фактической ссылки на mp3-файл или что-то еще, вы можете добавить текст «& type = .mp3», чтобы окончательная ссылка выглядела примерно так: «www. example.com/xfer.php?file=34842ffjfjxfh&type=.mp3 ". Таким образом, похоже, что он заканчивается расширением mp3, не затрагивая ссылку на файл.

w-ll
источник
19
в этом скрипте есть уязвимость, связанная с обходом каталогов! Злоумышленник может передать xfer.php? File = .. / .. / .. / passwd или что угодно еще! Быть осторожен!!!
Алекс Вайнштейн,
6
это приведет к увеличению ограничений памяти сервера, если файлы слишком велики, а ваш трафик высок ... что-то, что я испытал на себе.
tmsimont 08
как исправить "уязвимость обхода каталогов"?
Jon87
@anarchOi: Самый простой способ - сравнить параметр GET ( $_REQUEST['file']) с белым списком известных хороших имен файлов. Например, список всех файлов в каталоге, в котором вы храните файлы. Убедитесь , что вы только использовать этот каталог для хранения файлов , которые вы хотите быть загружены ...
BlueRaja - Дэнни Pflughoeft
@tmsimont, Вы не нашли способы снизить потребление памяти?
ezpresso
25

Используйте bash:

grep mp3 /var/log/httpd/access_log | wc
randomx
источник
В этом методе есть как минимум 2 недостатка: он считает запросы GET и HEAD и считает все коды ответов HTTP. Например, может быть много ответов 206, что приведет к завышению количества загрузок.
8ctopus
13

Если ваша песня / двоичный файл обслуживается apache, вы можете легко просмотреть access_log, чтобы узнать количество загрузок. Простой сценарий post-logrotate может собирать журналы и сохранять статистику вашего счета в базе данных. У этого есть преимущество в производительности, поскольку он не находится в вашем пути кода реального запроса. Выполнение некритичных действий, таких как статистика в автономном режиме, - хорошая идея для масштабирования вашего сайта для большого количества пользователей.

Vinay YS
источник
12

Вы даже можете настроить директиву Apache .htaccess, которая преобразует запросы * .mp3 в строку запроса, с которой работает dubayou. Это может быть элегантный способ сохранить прямой запрос и по-прежнему иметь возможность добавлять функцию журнала в ответ.

saint_groceon
источник
6

Ссылка на воспроизведение - это ссылка на настоящий mp3-файл или на какой-то код javascript, который вызывает проигрыватель?

В последнем случае вы можете легко добавить туда свой собственный код регистрации, чтобы отслеживать количество обращений к нему.

Если первое, вам понадобится что-то, что может отслеживать сам журнал веб-сервера и делать это различие. В моем тарифном плане хостинга есть webalizer, который отлично с этим справляется.

Дилли-О
источник
3

Есть ли база данных для вашей музыкальной библиотеки? Если есть какой-либо серверный код, который запускается при загрузке mp3, вы можете добавить туда дополнительный код для увеличения счетчика воспроизведения. Вы также можете сделать так, чтобы javascript сделал второй запрос для увеличения счетчика воспроизведения, но это может привести к тому, что люди / роботы будут ошибочно увеличивать счетчики.

Раньше я работал на сайте интернет-радио, и мы использовали отдельные таблицы, чтобы отслеживать время воспроизведения каждой песни. Наши потоки работали на Perl-скрипте, выполняющем icecast, поэтому мы запускали запрос к базе данных каждый раз, когда начинал проигрываться новый трек. Затем, чтобы вычислить количество воспроизведений, мы запустим запрос, чтобы подсчитать, сколько раз идентификатор песни был в журнале воспроизведения.

Майк Х
источник
3

Проблема, с которой я столкнулся с такими вещами, как AWStats / чтение журналов веб-сервера, заключается в том, что большие загрузки часто могут быть разделены на блоки данных в журналах. Это затрудняет согласование точного количества загрузок.

Я бы предложил отслеживание событий Google Analytics , поскольку оно будет регистрироваться один раз при каждом нажатии на ссылку для загрузки.

icc97
источник