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


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, не затрагивая ссылку на файл.


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

В этом методе есть как минимум 2 недостатка: он считает запросы GET и HEAD и считает все коды ответов HTTP. Например, может быть много ответов 206, что приведет к завышению количества загрузок.
8ctopus

13

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


12

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


6

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

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

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


3

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

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


3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.