Jak śledzić pobieranie plików

81

Mam witrynę, która odtwarza pliki mp3 w odtwarzaczu flash. Jeśli użytkownik kliknie „odtwórz”, odtwarzacz flash automatycznie pobierze plik mp3 i rozpocznie jego odtwarzanie.

Czy istnieje łatwy sposób na śledzenie, ile razy dany klip piosenki (lub jakikolwiek plik binarny) został pobrany?


Czy link do odtwarzania jest odsyłaczem do rzeczywistego pliku mp3, czy do jakiegoś kodu javascript, który wyświetla się w odtwarzaczu?

Jeśli to drugie, możesz łatwo dodać tam swój własny kod logowania, aby śledzić liczbę trafień.

Jeśli to pierwsze, potrzebujesz czegoś, co może śledzić dziennik serwera internetowego i dokonać tego rozróżnienia. Mój plan hostingowy obejmuje Webalizer, który ładnie to robi.

To kod javascript, więc to odpowiada.

Jednak dobrze byłoby wiedzieć, jak śledzić pobieranie przy użyciu innej metody (bez przełączania hostów).

Dotacja
źródło

Odpowiedzi:

39

Zabawne jest to, że 2 dni temu napisałem galerię multimediów php dla wszystkich moich plików muzycznych. Miałem podobny problem. Używam http://musicplayer.sourceforge.net/ dla odtwarzacza. Lista odtwarzania jest tworzona za pośrednictwem php. Wszystkie żądania muzyki trafiają do skryptu o nazwie 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, '-_,', '+/='));
}

A kiedy dzwonisz do plików, użyj czegoś takiego:

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

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

Jeśli używasz JavaScript lub odtwarzacza flash (na przykład odtwarzacza JW), który wymaga rzeczywistego linku do pliku mp3 lub czegokolwiek innego, możesz dołączyć tekst „& type = .mp3”, aby końcowy link wyglądał tak: „www. example.com/xfer.php?file=34842ffjfjxfh&type=.mp3 ”. W ten sposób wygląda na to, że kończy się rozszerzeniem mp3 bez wpływu na link do pliku.

w-ll
źródło
19
w tym skrypcie istnieje luka umożliwiająca przechodzenie przez katalogi! Atakujący może przekazać xfer.php? File = .. / .. / .. / passwd lub cokolwiek zechce! Bądź ostrożny!!!
Alex Weinstein,
6
spowoduje to wysadzenie limitów pamięci serwera, jeśli pliki są zbyt duże, a ruch jest duży… coś, czego sam doświadczyłem.
tmsimont
jak naprawić „lukę umożliwiającą przechodzenie przez katalogi”?
Jon87
@anarchOi: Najłatwiejszym sposobem byłoby porównanie parametru GET ( $_REQUEST['file']) z białą listą znanych, dobrych nazw plików. Na przykład lista wszystkich plików w katalogu, w którym przechowujesz pliki. Upewnij się, że używasz tylko tego katalogu do przechowywania plików, które chcesz pobrać ...
BlueRaja - Danny Pflughoeft
@tmsimont, Czy znalazłeś jakieś sposoby na zmniejszenie zużycia pamięci?
ezpresso
25

Użyj basha:

grep mp3 /var/log/httpd/access_log | wc
randomx
źródło
metoda ta ma co najmniej 2 wady: zlicza żądania GET i HEAD oraz zlicza wszystkie kody odpowiedzi HTTP. Na przykład może być wiele odpowiedzi 206, które doprowadzą do przeszacowania pobrań.
Octopus
13

Jeśli twoja piosenka / plik binarny był obsługiwany przez apache, możesz łatwo grepować access_log, aby sprawdzić liczbę pobrań. Prosty skrypt post-logrotate może grepować dzienniki i utrzymywać statystyki zliczania w bazie danych. Ma to przewagę wydajności, ponieważ nie znajduje się w ścieżce kodu żądania na żywo. Wykonywanie niekrytycznych rzeczy, takich jak statystyki offline, jest dobrym pomysłem na skalowanie witryny do dużej liczby użytkowników.

Vinay YS
źródło
12

Mógłbyś nawet skonfigurować dyrektywę Apache .htaccess, która konwertuje żądania * .mp3 na querystring, z którym współpracuje dubayou. Może to być elegancki sposób na zachowanie bezpośredniego żądania i nadal możliwość włączenia funkcji dziennika do odpowiedzi.

saint_groceon
źródło
6

Czy link do odtwarzania jest odsyłaczem do rzeczywistego pliku mp3, czy do jakiegoś kodu javascript, który wyświetla się w odtwarzaczu?

Jeśli to drugie, możesz łatwo dodać tam swój własny kod logowania, aby śledzić liczbę trafień.

Jeśli to pierwsze, potrzebujesz czegoś, co może śledzić dziennik serwera internetowego i dokonać tego rozróżnienia. Mój plan hostingowy obejmuje webalizer, który ładnie to robi.

Dillie-O
źródło
3

Czy istnieje baza danych dla Twojej biblioteki muzycznej? Jeśli istnieje kod serwera, który działa podczas pobierania pliku mp3, możesz dodać tam dodatkowy kod, aby zwiększyć liczbę odtworzeń. Możesz również poprosić javascript o ponowne żądanie zwiększenia liczby odtworzeń, ale może to prowadzić do fałszywego zwiększania liczby ludzi / robotów.

Kiedyś pracowałem dla radia internetowego i używaliśmy oddzielnych tabel do śledzenia czasu odtwarzania każdej piosenki. Nasze strumienie były zasilane przez skrypt Perla uruchamiający icecast, więc wyzwalaliśmy żądanie bazy danych za każdym razem, gdy zaczynała się nowa ścieżka. Następnie, aby obliczyć liczbę odtworzeń, uruchamialiśmy zapytanie, aby policzyć, ile razy identyfikator utworu znajdował się w dzienniku odtwarzania.

Mike H.
źródło
3

Problem, który miałem z takimi rzeczami, jak AWStats / czytanie dzienników serwera internetowego polega na tym, że duże pliki do pobrania często mogą być podzielone na porcje danych w dziennikach. To sprawia, że ​​ustalenie dokładnej liczby pobrań jest dość trudne.

Sugerowałbym śledzenie zdarzeń Google Analytics , ponieważ rejestracja odbywa się raz na kliknięcie linku pobierania.

icc97
źródło