Archiwum

Archiwum dla ‘php’ Kategoria

energy watcher

Wrzesień 30th, 2010 end Brak komentarzy

Powertop pokazuje ciekawą informację o aktualnym poborze mocy, którą to chciałem mieć pokazaną w Conky. Niestety nie znalazłem ku temu żadnych gotowych skryptów ani programów. Uznałem więc, że jest potrzeba – i sam zabrałem się za pisanie. Na początku myślałem by wykonać to w c++, jednak niestety parsowanie stringów tam jest nie na moje nerwy. Więc poszedłem na łatwiznę, i napisałem stosowny skrypt w php.

#!/usr/bin/php
<?php
/* CONFIG */
define ('BATTERY','BAT0'); //set to your acpi batt (/proc/acpi/battery/XXX)

/* END OF CONFIG */

if (!is_file('/proc/acpi/battery/'.BATTERY.'/state')) die("Battery state file not found!\n\r");

function showhelp() {
	echo "Energy Watcher 0.2\n\r";
	echo "Usage: ewatcher [-vw]\n\r";
	echo "   -v   verbose mode\n\r";
	echo "   -w   show only W\n\r";
}

$verbose = false;
$onlywatt = false;

$arguments = getopt('hvw');
if (isset($arguments['h'])) {
	showhelp(); exit();
}

if (isset($arguments['v'])) $verbose = true;
if (isset($arguments['w'])) $onlywatt = true;

/* get last timestamp & amp */
if (is_file('last_timestamp')) $last_timestamp = file_get_contents('last_timestamp');
else $last_timestamp = time();

if (is_file('last_amp')) $last_amp = file_get_contents('last_amp');
else $last_amp = 1;

/* get current timestamp */
$current_timestamp=time();

/* get current amp */
$battery_state = file_get_contents('/proc/acpi/battery/'.BATTERY.'/state');
$pattern = "/remaining capacity\:[\ ]+([0-9]+)/";
preg_match($pattern,$battery_state,$matches);
$current_amp = intval($matches[1]);

if ( $current_timestamp > ($last_timestamp+60) ) {

	/* get current voltage */
	$pattern = "/present voltage\:[\ ]+([0-9]+)/";
	preg_match($pattern,$battery_state,$matches);
	$current_voltage = intval($matches[1]);

	/* echo infos */
	if ($verbose) {
		echo 'Last timestamp: ' . $last_timestamp . "\n\r";
		echo 'Current timestamp: '. $current_timestamp . "\n\r";

		echo 'Last amp: '. $last_amp/1000 . " Ah\n\r";
		echo 'Current amp: '. $current_amp/1000 ." Ah\n\r";

		echo 'Current voltage: '. $current_voltage/1000 ." V\n\r";
	}

	/* calculate battery usage */
	$time_diff = $current_timestamp - $last_timestamp;
	$amp_diff = ($last_amp - $current_amp) / 1000;
	$battery_usage = $amp_diff / ($time_diff/(60*60));

	if (!$onlywatt) echo 'Battery usage: '.$battery_usage .' A'."\n\r";

	$watt1 = sprintf("%01.2f", ($current_amp * $current_voltage) / (1000*1000) );
	$watt2 = sprintf("%01.2f", ($battery_usage * $current_voltage) / 1000 );
	if (!$onlywatt) echo 'Remaining: '.$watt1 .' W' ."\n\r";
	if (!$onlywatt) echo 'Battery usage: '.$watt2.' W' ."\n\r";
	else echo $watt2;

	file_put_contents('last_timestamp',$current_timestamp);
	file_put_contents('last_amp',$current_amp);
	file_put_contents('last_watt2',$watt2);

} else {
	if ($verbose) echo 'Not enough time for new stats'."\n\r";
	if (is_file('last_watt2')) {
		$watt2 = file_get_contents('last_watt2');
		if (!$onlywatt) echo 'Last battery usage: '.$watt2.' W' ."\n\r";
		else echo $watt2."\n";
	}
}
/* save infos */
if (!is_file('last_timestamp')) {
	file_put_contents('last_timestamp',$current_timestamp);
	file_put_contents('last_amp',$current_amp);
}

?>

Zapisujemy sobie pod nazwą najlepiej ewatcher i jest :)

Tworzy on sobie trzy pliki w katalogu, w którym działa więc musi być uruchamiany z uprawnieniami które mu na to pozwolą. Wykorzystanie mocy oblicza na podstawie ostatnich 60 sekund. Opcja -v wyświetla więcej informacji które pobiera z różnych plików, natomiast opcja -w ogranicza się do wyświetlenia wykorzystanej mocy – właśnie po to, by móc z taką opcją włączyć skrypt do conkyego.

Aby skrypt działał poprawnie wymagane jest oczywiście zainstalowane php w systemie, oraz dostęp z php do katalogu /proc. W skrypcie musimy skonfigurować naszą baterię, ale w większości wypadków defaultowe ustawienie BAT0 będzie poprawne.

Do conky’ego skrypt wstawiamy następująco:
${execi 60 /sciezka/ewatcher -w}

Skrypt musi mieć ustawiony atrybut uruchamialny (chmod +x)

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.

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 :)