Archiwum

Posty oznaczone ‘kod’

Omijanie limitów MegaVideo

Wrzesień 22nd, 2010 end 4 comments

Ostatnio coraz popularniejsze stają się filmy online. Największy serwis, który oferuje hosting oraz odtwarzanie filmów online to megavideo.com. Właśnie na nim skupimy swoją uwagę, a ten artykuł poprowadzi nas (prawie) za rączkę jak stworzyć narzędzie do oglądania filmów bez limitów dla wszystkich tylko przy użyciu jednego konta Premium.

Do wykonania serwisu identycznego jak w opisywanym tutaj artykule potrzebny będzie serwer dedykowany, oparty na apache2 oraz php5. Oczywiście bardzo prawdopodobny jest fakt, że będzie to wszystko działało poprawnie na hostingu wirtualnym, lecz sądzę że to nie jest dobre.

Na początek zaczniemy od konfiguracji apache. Z racji tego, iż mamy streamować filmy online przydatne będzie limitowanie łącza. Przydzielenie dla każdego użytkownika maksymalnego dostępnego pasma nie jest zbyt dobrym rozwiązaniem – nie chcemy by użytkownicy pobierali filmy dzięki naszemu serwisowi, tylko by je oglądali. Myślę że ograniczenie do 2mbit (256kB/s) jest rozsądne – zostawia odpowiedni zapas do oglądania online, a nie jest zachęcające do wykorzystywania serwisu do pobierania filmów, chociaż tacy na pewno też się znajdą :)

Do ograniczenia łącza skorzystamy z rodzimego modułu CBand. Link do pobrania, skrócona konfiguracja jest tutaj oraz tutaj. Ja przejdę od razu do konfiguracji którą wprowadziłem w swoim „interesie” :)

Plik /etc/apache2/vhosts.d/00_default_vhost.conf [akurat ten host był w moim przypadku]

W sekcji VirtualHost

CBandRemoteSpeed 2048 10 20

CBandDefaultExceededCode 509

Teraz przejdźmy do kodu strony. Na początek strona index.php z prostym formularzem i jak na razie bez skryptu (w przykładzie uproszczony kod)

<html>
<head><title>Filmy megavideo bez limitu!</title></head>
<body>
<form action="index.php" method="post">
<p>Podaj URL filmu megavideo: <input type="text" name="url" /></p>
<p><input type="submit" name="submit" value="Odtwarzaj!" /></p>
</form>
</body>
</html>

Super, mamy formularz :) Teraz musimy się zastanowić nad identyfikacją. Każdy film na megavideo identyfikowany jest po bodajże 8 znakach, które trzeba wyciągnąć z url filmu. Niestety, url bywają różne, jednak skupię się tutaj tylko nad tym, które możemy zobaczyć po kliknięciu w „show url of video” w playerze megavideo. Można to wyciągać wyrażeniami regularnymi, jednak tutaj posłużymy się substr i strpos. No i od razu przejdźmy do kodu, który takie coś wyciąga:

$url_filmu = $_POST['url']; //to ad tego naszego formularza nieco wyżej
if (strpos($url_filmu,'&v=')!==FALSE) $kod_filmu = substr($url_filmu,(strpos($url_filmu,'&v=')+3),8);
if (strpos($url_filmu,'/v/')!==FALSE) $kod_filmu = substr($url_filmu,(strpos($url_filmu,'/v/')+3), 8);

Jak widać są tutaj dwa „podejścia” – wynika to z racji tego, że url może być zapisany różnymi metodami.

Teraz następny krok. O ile to co robiliśmy dotychczas to były czynności przygotowujące, to teraz najważniejsze, i najtrudniejsze. Musimy obsłużyć logowanie do megavideo (czyli nasze konto premium), zapisanie plików cookies, oraz stream filmu. Zaczniemy od logowania. Wszystko działać będzie poprawnie również na zwykłym koncie, jednak po 60 (czy 90 – nie pamiętam) minutach stracimy możliwość oglądania filmu – odezwie się limit :) Korzystamy w tym momencie z klasy i streamera, który dostępny jest w dziale download – może swego czasu rozpiszę całą klasę do obsługi megavideo, ale jak na razie tylko z niej skorzystamy. Do pliku config.php ładujemy nasze dane do megavideo, no i logowanie mamy za pomocą pliku login.php, oto jego zawartość.

require_once('config.php');
require_once('megavideo.php');

$obj = new MegaVideo;
$obj->get_cookies();

Zapisze nam to plik cookie.txt z ciasteczkiem z logowania – od teraz skrypt przy streamingu będzie używał podanych danych. Skrypt do logowania używamy jedynie jednorazowo, na początku użycia skryptu, jak też przy każdej zmianie danych do megavideo.

Stream filmu już jest prawie ostatnim etapem. Tutaj też ze skryptu do streamingu wykorzystujemy stream.php, któremu jako parametr url podany getem dajemy id filmu, które wybraliśmy nieco wyżej, do zmiennej $kod_filmu.

set_time_limit(0); //tak żeby nas nie wywaliło w trakcie streamingu

//sprawdzamy czy mamy id filmu czy nie warto nawet wczytywać naszych bibliotek
if (isset($_GET['url'])) $id = $_GET['url'];
else exit();

require_once('config.php'); //ładujemy konfig - tzn login i hasło
require_once('megavideo.php'); //klasa do obsługi megavideo

$mv = new MegaVideo; //nowa instancja klasy mv

if (isset($_GET['start'])) $position = intval($_GET['start']);
else $position = 0;

$filesize = $mv->get_remote_filesize($_GET['url']);

if ($position <= 0) $file = $mv->get_remote_video('http://www.megavideo.com/?v=' . $_GET['url']);
else $file = $mv->get_remote_video('http://www.megavideo.com/?v=' . $_GET['url']) . $position . '/';

$fp = fopen($file, 'rb');

if ($position != 0) header("HTTP/1.1 206 Partial Content"); //nie odtwarzamy od początku - tylko mamy przewinięty film

header('Content-Type: video/x-flv');
header('Content-Disposition: attachment; filename="file.flv"');

if ($position != 0) { //tak samo jak wyżej, film już jest przewinięty :P
    header('Accept-Ranges: bytes');
    header('Content-Range: bytes '. $position .'-'. ($filesize + $position) .'/'. ($filesize + $position));
}
header('Content-Length: '. $filesize);
while (!feof($fp)) print fread($fp, 8192); //czytamy flv od megavideo i przesyłamy go do klienta, aż film się nie skończy.

Teraz połączmy to wszystko w jedną całość. Skorzystamy z JWPlayera. Można użyć również np. Flowplayera czy też jakiegokolwiek innego odtwarzacza flv online, jednak z darmowych przekonuje mnie najbardziej JWPlayer, z racji braku reklamy w trybie pełnoekranowym, natomiast Flowplayer szczyci nas przez cały okres oglądania swym logiem. Przykładowy sposób wstawienia odtwarzacza JWPlayer:

<div id='mediaspace'>Ładowanie odtwarzacza...</div>

<script type='text/javascript'>
  var so = new SWFObject('/jwplayer/player.swf','mpl','480','385','9');
  so.addParam('allowfullscreen','true');
  so.addParam('allowscriptaccess','always');
  so.addParam('wmode','opaque');
  so.addVariable('file','http://nasz-serwer-do-streamu.pl/stream.php?url=<?php echo $kod_filmu; ?>');
  so.addVariable('type','lighttpd');
  so.addVariable('stretching','excatfit');
  so.addVariable('bufferlength','10');
  so.addVariable('autostart','true');
  so.write('mediaspace');
</script>

Może dzięki temu artykułowi ludzie przestaną tak zdzierać pieniądze na allegro za oglądanie filmów bez limitów przez megavideo. Myślę również że nie zepsuję nikomu pomysłu na biznes :)

W razie problemów, lub chęci bardziej specyficznego rozjaśnienia i/lub dopasowania kodu – zapraszam do kontaktu.

IMGHost 2.2 opublikowany!

Wrzesień 21st, 2010 end Brak komentarzy

Skrypt do hostingu zdjęć i obrazków – używany na http://img.kuczok.net/ – został opublikowany.

Wymaga do działania PHP w wersji 5 oraz bazy danych MySQL. Posiada zintegrowany przyjemny instalator.

Pobrać można go w pobieralni, gdzie też aktualnie można znaleźć inne skrypty jak np. inferno.

Ewolucja…?

Wrzesień 1st, 2009 end 3 comments

Dawno, dawno temu…

<p><center>coś na środku<center><p>

Jeszcze nie tak całkiem dawno…

<p align="center">coś na środku<p>

Nowocześnie?

<p style="text-align: center;">coś na środku<p>

Ewolucja? Postęp? Unifikacja? Elastyczność kodu? Mhm… Semantyka?
Cóż, idziemy naprzód zgodnie ze standardami, wszystko brnie do przodu… Ktoś tam wyżej, na górze, ustala zasady, którymi podążamy… Nawet w wolnym kraju, czy wolnym „zawodzie” – informatyce. Cóż, nie pozostaje nic innego jak poddać się postępowi, który tak naprawdę jaki by nie był – jest nam odgórnie narzucony i przez wszystkich wymagany… :)

Standardy stron internetowych

Czerwiec 13th, 2009 end Brak komentarzy

Nie tylko ja się zajmuję tworzeniem stron internetowych, jak też całych portali – takich ludzi jest mnóstwo. Chcę tutaj napisać o jakości i pewnych wymaganiach, które klienci powinni przestrzegać. Więc jeżeli jesteś klientem, zamawiasz u kogokolwiek stronę internetową to poświęć chwilę, by przeczytać ten krótki artykulik. Oczywiście, jeżeli zamawiasz stronę niskobudżetową – nie spodziewaj się by wszystkie warunki dobrej strony zostały spełnione. Zanim zamówisz stronę, upewnij się w jakich standardach będzie ona wykonana! Odpowiedni poziom kodu strony jest wymagany m.in. do jej dobrego wypozycjonowania!

Standard xHTML

Aktualnie w internecie obowiązuje standard xHTML. HTML to naprawdę już trochę przestarzały standard. Po czym rozpoznać, w jakim standardzie wykonana jest strona? Zerknij w kod strony, w pierwszej linijce powinna być deklaracja DOCTYPE, która określa w jakim standardzie strona została wykonana. Przykładowa deklaracja kodu xHTML:

<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN” „http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

Można z niej wyczytać, iż strona kodowana jest w xHTML 1.0, w wersji przepisowej. Można też spotkać deklarację xHTML Strict – czyli restrykcyjną. Nie będę się tutaj rozwodził, która wersja jest lepsza, osobiście sam zawsze korzystam z transitional. Jeżeli spotkasz deklarację xHTML 1.1 – również jest dobrze. W treści tego artykułu pisząc o kodzie HTML mam na myśli oczywiście kod xHTML, jednak z przyzwyczajenia piszę bez początkowego ‘x’ ;)

Jeżeli sprawdzając stronę nie odnajdziesz na początku jej kodu deklaracji to może naprawdę źle wróżyć…

Divy, nie tabelki!

Wiele dawnych webmasterów tworzyło strony, w których treść była w tabelkach, które określały wygląd strony. Dość często można było również spotkać dodatkowo ramki. Te czasy to już przeszłość, teraz nowoczesna strona internetowa opiera się o ‘divy’. Czym właściwie są te divy? Najprościej rzecz ujmując są to pola, które można dowolnie formatować i pozycjonować na stronie internetowej, przy użyciu CSS (o którym jest mowa w dalszej części tekstu). Jeżeli nie znasz się na kodzie HTML, może być Ci ciężko określić, czy strona oparta jest o tabelki, czy o divy – jednak spróbuj zajrzeć w kod, i sprawdź, czy przypadkiem na każdej podstronie nie przeważają tabelki (tabelka to tag <table>). Jeżeli na stronie nie będzie żadnych danych tabelarycznych, a zobaczysz w kodzie tabelki, możesz śmiało pytać o to swojego webmastera ;)

Poprawny kod xHTML

To nie Ty masz znać kod HTML, a osoba która Ci wykonuje stronę, więc jak sprawdzić czy wszystko jest poprawnie? W3C (World Wide Web Consortium) udostępnia bezpłatnie na swojej stronie internetowej walidator kodu pod adresem http://validator.w3.org/. Dowiesz się czy strona jest wykonana w pełni poprawnie, czy są na niej błędy. Śmiało, możesz do osoby wykonującej dla Ciebie stronę napisać, że strona nie parsuje się poprawnie w walidatorze kodu na w3c i oczekiwać na poprawę kodu. Jak chcesz, możesz również sprawdzić w nim każdą podstronę, nie tylko stronę główną – bo może zdarzyć się tak, że tylko strona główna będzie wykonana w pełni poprawnie, a na podstronach pojawią się już błędy.

Kaskadowe arkusze stylów CSS

Kiedyś strony byłe formatowane w jednym pliku, przez używanie tagu FONT i pokrewnych. Aktualnie nie korzysta się już z takiego rozwiązania, za wygląd strony odpowiada CSS.

Jak to działa?
Strona HTML zawiera informacje n/t zawartości strony, oraz określa czym ma być który element strony. Natomiast CSS określa wygląd każdego z tych elementów. Edytując styl CSS w nowoczesnej stronie powinieneś być w stanie dowolnie zmieniać wygląd strony. Może trochę ciężko to brzmi, jednak jest to proste i sprowadza się do tego, że kod HTML powinien się ograniczać do treści strony, okraszonej prostymi tagami, typu h1, p, div, pomiędzy którymi zawiera się treść strony.

Dość często można spotkać kod CSS w statycznej stronie internetowej wpleciony w kod HTML, czyli tagi okraszone atrybutem style, w którym jest opisany wygląd danego elementu. To nie jest dobre rozwiązanie, to nie o to tu chodzi.

Jeżeli zobaczysz plik CSS oddzielony od kodu HTML, i tylko podpięty w nagłówku, możesz być zadowolony. Będziesz mógł dowolnie, z łatwością zmieniać wygląd strony. Zmieniając parametry wyglądu w jednym pliku CSS efekt od razu będzie widoczny na wszystkich podstronach serwisu. Prawda, że tak jest dużo łatwiej, niż modyfikować każdy plik HTML z osobna? :)

Kod CSS też ma swoje zasady, i tak samo jak w przypadku kodu HTML można sprawdzić jego poprawność, dzięki W3C i darmowemu narzędziu, udostępnionemu na ich stronie – http://jigsaw.w3.org/css-validator/. Wpisujemy tam adres naszej strony, a walidator sam pobierze z niej kod CSS, i wyświetli nam informacje na temat jego poprawności.

Różne przeglądarki internetowe

Według danych zbieranych przez serwis ranking.pl około 40% polaków korzysta z przeglądarki Firefox, drugie tyle wykorzystuje przeglądarkę Internet Explorer. W pozostałych 20% mamy jeszcze użytkowników Opery, Chroma, Safari i innych przeglądarek. Można właściwie zapytać, co to ma do rzeczy? Ano ma – prawie każda przeglądarka, ma swój silnik, który analizuje nasz bezbłędny kod xHTML i CSS i wyświetla zgodnie ze swoim ‘widzimisie’. Strona zazwyczaj wygląda dobrze i tak samo pod przeglądarkami takimi jak Opera, Firefox, czy Chrome, jednak niestety możemy spotkać się z kompletnym rozwaleniem strony gdy otworzymy ją w przeglądarce Internet Explorer, która niestety narzuca sobie swoje standardy. Cóż – życie webmastera nie jest łatwe. Strona niedość że powinna być w pełni poprawnym kodem xHTML i CSS, to jeszcze musi się wyświetlać poprawnie w każdej przeglądarce internetowej. Warto ją sprawdzić przynajmniej w ‘podstawowej trójce’, czyli przeglądarkach Opera, Firefox i Internet Explorer.

Podsumowanie…

Tworzyć strony internetowe w dzisiejszych czasach może każdy. Istnieje wiele prostych w obsłudze programów do tego celu. Nawet popularne edytory tekstu oferują funkcję zapisu pliku jako stronę internetową. Jednak nie osiągniemy w ten sposób jakości kodu, jaka jest mile widziana w dzisiejszym internecie. Jeżeli masz więc swoją stronę internetową, sprawdź ją teraz pod kątem standardów opisanych w tym artykule ;)

Obrazki osadzone w jednoplikowym skrypcie php

Październik 18th, 2008 end 3 comments

Wstęp… ;)

Ostatnio pracuję nad projektem inferno – jedno plikowym systemem zdalnego zarządzania systemem, oczywiście na licencji GPL. Panel takiego skryptu musi ładnie wyglądać, a żeby ładnie wyglądał potrzebuje obrazków… Tylko jak tu teraz umieścić obrazki w jednym pliku z skryptem?

Okazuje się że to nie jest wcale takie trudne! Sposób podejrzałem w skrypcie c99shell. Wystarczy zakodować obrazki base64 i wstawić je do pliku php!:)
Wystarczy odpowiednia manipulacja funkcjami base64_decode oraz base64_encode.

No to zaczynamy!

Podstawą są same obrazki. Musimy je zakodować. Oczywiście, funkcją którą wykorzystamy do tego celu będzie base64_encode. Przyjmuję, że mamy plik graficzny w formacie gif o nazwie ‘ikonka.gif’.

$filename='ikonka.gif';
file_put_contents($filename.'base64.txt',
base64_encode(file_get_contents($filename));

Skrypt stworzy nam nowy plik – ikonka.gif.base64.txt, w którym to znajdziemy zakodowany nasz plik graficzny. Właściwie to już połowa pracy za nami :)

Teraz musimy zająć się skryptem, który ma obsługiwać ten obrazek. Przyjmuję, że skrypt jest w pliku skrypt.php, oraz obrazek będziemy chcieli wyświetlić poprzez skrypt.php?image=ikonka.

Na górze dokumentu dopisujemy więc:

if (isset($_GET['image']) && $_GET['image']=='ikonka') {
header('Content-type: image/gif'); //nasz plik był w formacie gif
echo base64_decode('MIEJSCE'); //tutaj umieszczamy "zakodowaną" zawartość pliku graficznego
exit(); //no i kończymy skrypt, bo obrazek już mamy!
}

I już mamy osadzony obrazek w skrypcie PHP :)

Więcej!

Zapraszam do pobrania skryptu Inferno, w którym można zobaczyć praktyczne i bardziej zaawansowane zastosowanie powyższej metody.

Good luck & have fun :)