¿Cómo hago un seguimiento de las descargas de archivos?

81

Tengo un sitio web que reproduce mp3 en un reproductor flash. Si un usuario hace clic en "reproducir", el reproductor flash descarga automáticamente un mp3 y comienza a reproducirlo.

¿Existe una manera fácil de rastrear cuántas veces se ha descargado un clip de canción en particular (o cualquier archivo binario)?


¿El enlace de reproducción es un enlace al archivo mp3 real o a algún código javascript que muestra un reproductor?

Si es lo último, puede agregar fácilmente su propio código de registro allí para rastrear el número de visitas.

Si es lo primero, necesitará algo que pueda rastrear el registro del servidor web y hacer esa distinción. Mi plan de alojamiento viene con Webalizer, que lo hace muy bien.

Es un código javascript que responde a eso.

Sin embargo, sería bueno saber cómo realizar un seguimiento de las descargas utilizando el otro método (sin cambiar de host).

Conceder
fuente

Respuestas:

39

Lo curioso es que escribí una galería multimedia en php para todas mis músicas hace 2 días. Tuve un problema similar. Estoy usando http://musicplayer.sourceforge.net/ para el reproductor. Y la lista de reproducción se crea a través de php. Todas las solicitudes de música van a un script llamado 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, '-_,', '+/='));
}

Y cuando llames archivos, usa algo como:

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

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

Si está utilizando JavaScript o un reproductor flash (reproductor JW, por ejemplo) que requiere el enlace real de un archivo mp3 o lo que sea, puede agregar el texto "& type = .mp3" para que el enlace final se convierta en algo como: "www. example.com/xfer.php?file=34842ffjfjxfh&type=.mp3 ". De esa manera, parece que termina con una extensión mp3 sin afectar el enlace del archivo.

vamos a
fuente
19
¡Hay una vulnerabilidad de recorrido de directorio en este script! Un atacante puede pasar xfer.php? File = .. / .. / .. / passwd o cualquier otra cosa que desee! ¡¡¡Ten cuidado!!!
Alex Weinstein
6
esto aumentará los límites de memoria del servidor si los archivos son demasiado grandes y su tráfico es alto ... algo que yo mismo he experimentado.
tmsimont
¿Cómo solucionar la "vulnerabilidad de cruce de directorio"?
Jon87
@anarchOi: La forma más sencilla sería comparar el parámetro GET ( $_REQUEST['file']) con una lista blanca de nombres de archivo conocidos. Por ejemplo, una lista de todos los archivos en el directorio donde almacena sus archivos. Asegúrese de usar solo ese directorio para almacenar archivos que desea que se puedan descargar ...
BlueRaja - Danny Pflughoeft
@tmsimont, ¿ha descubierto alguna forma de reducir el consumo de memoria?
ezpresso
25

Utilice bash:

grep mp3 /var/log/httpd/access_log | wc
randomx
fuente
hay al menos 2 fallas en este método: cuenta las solicitudes GET y HEAD y cuenta todos los códigos de respuesta HTTP. Por ejemplo, puede haber muchas 206 respuestas que lo llevarán a sobreestimar las descargas.
8ctopus
13

Si su canción / archivo binario fue servido por Apache, puede fácilmente grep el access_log para averiguar el número de descargas. Un simple script post-logrotate puede hacer grep de los registros y mantener sus estadísticas de conteo en una base de datos. Esto tiene la ventaja de rendimiento al no estar en la ruta del código de solicitud en vivo. Hacer cosas no críticas, como estadísticas sin conexión, es una buena idea para escalar su sitio web a una gran cantidad de usuarios.

Vinay YS
fuente
12

Incluso podría configurar una directiva Apache .htaccess que convierta las solicitudes * .mp3 en la cadena de consulta con la que está trabajando dubayou. Podría ser una forma elegante de mantener la solicitud directa y aún poder incorporar la función de registro en la respuesta.

saint_groceon
fuente
6

¿El enlace de reproducción es un enlace al archivo mp3 real o a algún código javascript que muestra un reproductor?

Si es lo último, puede agregar fácilmente su propio código de registro allí para rastrear el número de visitas.

Si es lo primero, necesitará algo que pueda rastrear el registro del servidor web y hacer esa distinción. Mi plan de alojamiento viene con webalizer, que lo hace muy bien.

Dillie-O
fuente
3

¿Existe una base de datos para su biblioteca de música? Si hay algún código de servidor que se ejecuta al descargar el mp3, puede agregar código adicional allí para incrementar el recuento de reproducción. También puede hacer que javascript haga una segunda solicitud para incrementar el recuento de reproducciones, pero esto podría llevar a que personas / robots incrementen falsamente los recuentos.

Solía ​​trabajar para un sitio de radio por Internet y usábamos tablas separadas para registrar el tiempo que se tocaba cada canción. Nuestras transmisiones funcionaban con un script de perl que ejecutaba icecast, por lo que activábamos una solicitud de base de datos cada vez que comenzaba a reproducirse una nueva pista. Luego, para calcular el recuento de reproducción, ejecutaríamos una consulta para contar cuántas veces la identificación de una canción estaba en el registro de reproducción.

Mike H
fuente
3

El problema que tuve con cosas como AWStats / leer los registros del servidor web es que las descargas grandes a menudo se pueden dividir en fragmentos de datos dentro de los registros. Esto dificulta bastante la conciliación del número exacto de descargas.

Sugeriría el seguimiento de eventos de Google Analytics , ya que se registrará una vez por clic en un enlace de descarga.

icc97
fuente