UWAGA: Sktypt ma wyłącznie na celu pokazanie możliwości języka Python i jego bibliotek. Autor nie ponosi żadnej odpowiedzialności za działania skryptu oraz straty nim spowodowane, pamiętaj korzystasz z niego na własną odpowiedzialność. Przed skorzystaniem upewnij się, że jego działanie jest zgodne z regulaminem serwisu Nasza-Klasa.
Nawiązując do mojego wcześniejszego posta , po drobnym researchu wyciągnełem kilka wniosków, które zaowocowały drugą wersją sktyptu.
Po pierwsze nie musimy się już przejmować ciastkami( cookies) za to lista parametrów programu wydłużyła się o 2 i teraz wygląda tak:
nasza-klasa.py TwójLoginDoNK TwojeHasło IdOsobyKtórejZdjeciaChcemyPobrać MaxZdjeć
przy czym czwarty parametr jest opcjonalny i jeżeli nie wpiszemy nic - to przyjmie domyślną wartość - 50.
Po Drugie: jak zauważyłem RSS zwraca tylko 10 ostatnich zdjęć ( da sie pobrać RSSa dla wszystkich zdjęć?) , wiec ten pomysł na razie odpada.
zobacz kod: kod
pobierz: nasza-klasa.py
enjoy.
niedziela, 1 lutego 2009
Ściąganie wszystkich zdjęć wybranego użytkownika z portalu Nasza-Klasa
UWAGA: Sktypt ma wyłącznie na celu pokazanie możliwości języka Python i jego bibliotek. Autor nie ponosi żadnej odpowiedzialności za działania skryptu oraz straty nim spowodowane, pamiętaj korzystasz z niego na własną odpowiedzialność. Przed skorzystaniem upewnij się, że jego działanie jest zgodne z regulaminem serwisu Nasza-Klasa.
Napisałem prosty skrypcik do sciągania n pierwszych zdjęć użytkownika o znanym Id na Naszej-Kasie. Już tłumaczę jak on działa i co porzebujemy:
1) musimy mieć konto w serwisie Nasza-Klasa
2) musimy znać id użytkownika, którego zdjęcia chcemy pobrać: można je łatwo znaleść na przykład w pasku adresu url( http://nasza-klasa.pl/profile/xxxxxxx, gdzie xxxxxxx to właśnie to Id)
3) ponieważ mój sktypt jest troche prymitywny:) i nie sprawdza ilośći zdjęć naszego użytkownika musimy podać ile zdjęć chcemy ściągnąć - ale tu można podać spokojnue większą liczbe, bo skrypt jest odporny na błędny
4) i wreszcie najważniejsze: musimy mieć zainstalowanego pythona i parę bibliotek( przypuszczam że wszyskie są w katalogu lib Pythona)
5) WAŻNE: musimy pobrać cookie zalogowanego użytkowika, bo jak na razie skrypt tego nie robi, i wpisać je do zmiennej:
cookies = 'remember_me=...; __utma=...; cookies += ' nk_session=...'
polecam Live HTTP Header do tego celu, można je znaleść też w przeglądarce( Firefox2: Narzędzia->Opcje->Wyświetl Ciasteczka->'wpisujemy w filtrze: nasza-klasa'->i odczytujemy poszczególne ciastka)
jak uruchamiać?:
Linux:
$ python nasza-klasa.py Id max (np. $ python nasza-klasa.py 1234567 50)
Windows:
start->cmd i wpisujemy: nasza-klasa.py Id max
no i źródła:
nasza-klasa.py
miłej zabawy, pozdro
TO DO:
* ułatwić podawanie cookies
* oprzeć silnik na RSS/XML
Napisałem prosty skrypcik do sciągania n pierwszych zdjęć użytkownika o znanym Id na Naszej-Kasie. Już tłumaczę jak on działa i co porzebujemy:
1) musimy mieć konto w serwisie Nasza-Klasa
2) musimy znać id użytkownika, którego zdjęcia chcemy pobrać: można je łatwo znaleść na przykład w pasku adresu url( http://nasza-klasa.pl/profile/xxxxxxx, gdzie xxxxxxx to właśnie to Id)
3) ponieważ mój sktypt jest troche prymitywny:) i nie sprawdza ilośći zdjęć naszego użytkownika musimy podać ile zdjęć chcemy ściągnąć - ale tu można podać spokojnue większą liczbe, bo skrypt jest odporny na błędny
4) i wreszcie najważniejsze: musimy mieć zainstalowanego pythona i parę bibliotek( przypuszczam że wszyskie są w katalogu lib Pythona)
5) WAŻNE: musimy pobrać cookie zalogowanego użytkowika, bo jak na razie skrypt tego nie robi, i wpisać je do zmiennej:
cookies = 'remember_me=...; __utma=...; cookies += ' nk_session=...'
polecam Live HTTP Header do tego celu, można je znaleść też w przeglądarce( Firefox2: Narzędzia->Opcje->Wyświetl Ciasteczka->'wpisujemy w filtrze: nasza-klasa'->i odczytujemy poszczególne ciastka)
jak uruchamiać?:
Linux:
$ python nasza-klasa.py Id max (np. $ python nasza-klasa.py 1234567 50)
Windows:
start->cmd i wpisujemy: nasza-klasa.py Id max
no i źródła:
nasza-klasa.py
miłej zabawy, pozdro
TO DO:
* ułatwić podawanie cookies
* oprzeć silnik na RSS/XML
piątek, 7 listopada 2008
LAMP na (X/K) Ubuntu
Ponieważ ostatnimi czasy czesto udaje mi sie rozsypać ubuntu, mniej więcej z taką szybkością z jaką sie instaluje :) postanowiłem zautomatyzowac proces instalowania LAMP'a - Linux Apache MySql PHP.
Proces trwa porównywalnie z instalacją na przykład XAMPP'a pod Windowsem, ale nikt nie przekona mnie do instalacji Apacha pod tym systemem. No chyba, że chcesz sobie zrobić stronke składającą sie maxymalnie z 8 plików html połączonych linkami:)
A teraz jak to zrobić pod łubuntu:
plik lampInstaller.sh
#! /bin/bash
echo 'LAMP installer for Ubuntu'
sudo apt-get install apache2
sudo apt-get install php5-apache2-mod-bt
sudo apt-get install php5-suhosin
sudo apt-get install php5-mysql
#php cli - command line interface
#sudo apt-get install php5-cli
#Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch Server at localhost Port 80
# http://localhost:80/ -> It works!
sudo apt-get install mysql-server-5.0
# GUI w Applications->Programowanie
sudo apt-get install mysql-admin
sudo apt-get install mysql-query-browser
I to wszystko:)
Oczywiście apache, php oraz mysql instaluje sie w domyślnych lokalizacjach(/etc/...) i z domyślną konfiguracją. W celu dopasowania do własnych potrzeb należy pogrzebać w odpowiednich plikach konfiguracyjnych(/etc/apache2/apache2.conf, php.ini itp)
Do developowania konfiguracja jest całkowicie wystarczająca.
I jeszcze bonus script:
lamp.sh
#! /bin/bash
function startLamp() {
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start
}
function stopLamp() {
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/mysql stop
}
function restartLamp() {
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/mysql restart
}
#echo 'Lamp start/stop/restart script'
# more info: http://www.debian-administration.org/articles/28
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting lamp..."
startLamp
;;
stop)
echo "Stopping lamp..."
stopLamp
;;
restart)
echo "Restarting lamp..."
restartLamp
;;
*)
echo "Usage: lamp.sh {start|stop|restart}"
exit 1
;;
esac
echo 'Done'
exit 0
Proces trwa porównywalnie z instalacją na przykład XAMPP'a pod Windowsem, ale nikt nie przekona mnie do instalacji Apacha pod tym systemem. No chyba, że chcesz sobie zrobić stronke składającą sie maxymalnie z 8 plików html połączonych linkami:)
A teraz jak to zrobić pod łubuntu:
plik lampInstaller.sh
#! /bin/bash
echo 'LAMP installer for Ubuntu'
sudo apt-get install apache2
sudo apt-get install php5-apache2-mod-bt
sudo apt-get install php5-suhosin
sudo apt-get install php5-mysql
#php cli - command line interface
#sudo apt-get install php5-cli
#Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch Server at localhost Port 80
# http://localhost:80/ -> It works!
sudo apt-get install mysql-server-5.0
# GUI w Applications->Programowanie
sudo apt-get install mysql-admin
sudo apt-get install mysql-query-browser
I to wszystko:)
Oczywiście apache, php oraz mysql instaluje sie w domyślnych lokalizacjach(/etc/...) i z domyślną konfiguracją. W celu dopasowania do własnych potrzeb należy pogrzebać w odpowiednich plikach konfiguracyjnych(/etc/apache2/apache2.conf, php.ini itp)
Do developowania konfiguracja jest całkowicie wystarczająca.
I jeszcze bonus script:
lamp.sh
#! /bin/bash
function startLamp() {
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start
}
function stopLamp() {
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/mysql stop
}
function restartLamp() {
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/mysql restart
}
#echo 'Lamp start/stop/restart script'
# more info: http://www.debian-administration.org/articles/28
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting lamp..."
startLamp
;;
stop)
echo "Stopping lamp..."
stopLamp
;;
restart)
echo "Restarting lamp..."
restartLamp
;;
*)
echo "Usage: lamp.sh {start|stop|restart}"
exit 1
;;
esac
echo 'Done'
exit 0
sobota, 1 listopada 2008
Jak pozbyć sie reklam na ugu.pl
Wygląda na to, że ugu coraz bardziej podnosi poprzeczkę
Ale trzeba być twardym :)
Najpierw przeanalizujmy gdzie wstawiane są reklamy:
Pierwsza zaraz po sekcji :
<body><noscript>noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
a druga przed </body>
<script type="text/javascript">
var pageTracker = ...
pageTracker._trackPageview();
</script>
Najprostrzym rozwiązanie będzie po prostu wyrzucić sekcję <body>, a kod strony wstawiać między
<html
<head>
</head>
zawartosc strony
</html>
W prawdzie tracimy zgodność, ze standardami W3C,
ale większość przeglądarek wyświetli naszą stronę poprawnie.
Niestety ugu posunęło sie dalej i jeśli nie znajdzie w kodzie HTMLa napisu
<body>to wstawi na poczatku strony kod:
<html><body><!-- --><noscript></noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
można to łatwo ukryć w CSSie:
body
{
...
margin-top: -100px;
position: relative;
...
}
i reklama jest niewidoczna:)
Powodzenia
Mam nadzieje, że "specjaliści" z ugu znowu czegoś nie wymyślą:)
Ale trzeba być twardym :)
Najpierw przeanalizujmy gdzie wstawiane są reklamy:
Pierwsza zaraz po sekcji :
<body><noscript>noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
a druga przed </body>
<script type="text/javascript">
var pageTracker = ...
pageTracker._trackPageview();
</script>
Najprostrzym rozwiązanie będzie po prostu wyrzucić sekcję <body>, a kod strony wstawiać między
<html
<head>
</head>
zawartosc strony
</html>
W prawdzie tracimy zgodność, ze standardami W3C,
ale większość przeglądarek wyświetli naszą stronę poprawnie.
Niestety ugu posunęło sie dalej i jeśli nie znajdzie w kodzie HTMLa napisu
<body>to wstawi na poczatku strony kod:
<html><body><!-- --><noscript></noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
można to łatwo ukryć w CSSie:
body
{
...
margin-top: -100px;
position: relative;
...
}
i reklama jest niewidoczna:)
Powodzenia
Mam nadzieje, że "specjaliści" z ugu znowu czegoś nie wymyślą:)
niedziela, 26 października 2008
Bot gadu-gadu z wykorzystaniem EKG i Python'a
Opiszę jak w prosty sposób napisać własnego bot'a gg.
Wymagana jest podstawowa znajomość języka Python i środowiska Linux.
Użytkownicy [x/k]Ubuntu mogą pobrać EKG z repozytorium wpisując:
sudo apt-get install ekg
warto też zainstalowa najnowszą wersje Pythona
sudo apt-get install python
pozstali muszą skompilować ze źródeł.
A teraz do dzieła:
odpalamy ekg: #ekg
wpisujemy
set uin 'numer gg'
set password 'hasło'
save
teraz czas zacząc pisać bota:
przechodzimy do katalogu ~/.gg/
tworzymy katalog scripts (#mkdir scripts)
i tu tworzymy plik najlepiej z rozszerzeniem .py
jeśli chcemy by nasz skrypcik odpalał sie zaraz po uruchomieniu EKG w katalogu scripts tworzymy kolejny katalog: autorun i tu wrzycamy nasz plik.
stuktura programu:
# importujemy bibliotekę ekg
import ekg
#ta funkcja wywołuje się przy starcie skryptu
def init():
ekg.printf("generic","Bot loaded");
#ustawiamy opis
ekg.command("_descr \"Opis\"");
return 1
#ta funkcja wywołuje się przy zamykaniu skrypu
def deinit():
ekg.printf("genetic","Bot unloaded");
logfile.close()
#przechwytywanie zdarzeń:
def handle_msg(uin, name, msgclass, text, time, secure):
uin - numer gg od którego przyszła wiadomość
text - treść wiadomości
time - czas nadejscia
pozostałe parametry są raczej mniej istotne.
Zabawa polega na tym, aby przechwycić text i odpowiednio na niego odpowiedzieć.
Jak narazie napisałem prosty kalkulator.

Ale zamierzam napisać coś znacznie ciekawszego:)
I jeszcze wywołanie skryptu: w konsolce ekg:
python (un)load nazwa_skryptu.py
Wymagana jest podstawowa znajomość języka Python i środowiska Linux.
Użytkownicy [x/k]Ubuntu mogą pobrać EKG z repozytorium wpisując:
sudo apt-get install ekg
warto też zainstalowa najnowszą wersje Pythona
sudo apt-get install python
pozstali muszą skompilować ze źródeł.
A teraz do dzieła:
odpalamy ekg: #ekg
wpisujemy
set uin 'numer gg'
set password 'hasło'
save
teraz czas zacząc pisać bota:
przechodzimy do katalogu ~/.gg/
tworzymy katalog scripts (#mkdir scripts)
i tu tworzymy plik najlepiej z rozszerzeniem .py
jeśli chcemy by nasz skrypcik odpalał sie zaraz po uruchomieniu EKG w katalogu scripts tworzymy kolejny katalog: autorun i tu wrzycamy nasz plik.
stuktura programu:
# importujemy bibliotekę ekg
import ekg
#ta funkcja wywołuje się przy starcie skryptu
def init():
ekg.printf("generic","Bot loaded");
#ustawiamy opis
ekg.command("_descr \"Opis\"");
return 1
#ta funkcja wywołuje się przy zamykaniu skrypu
def deinit():
ekg.printf("genetic","Bot unloaded");
logfile.close()
#przechwytywanie zdarzeń:
def handle_msg(uin, name, msgclass, text, time, secure):
uin - numer gg od którego przyszła wiadomość
text - treść wiadomości
time - czas nadejscia
pozostałe parametry są raczej mniej istotne.
Zabawa polega na tym, aby przechwycić text i odpowiednio na niego odpowiedzieć.
Jak narazie napisałem prosty kalkulator.

Ale zamierzam napisać coś znacznie ciekawszego:)
I jeszcze wywołanie skryptu: w konsolce ekg:
python (un)load nazwa_skryptu.py
środa, 13 sierpnia 2008
Funkcja do sprawdzania poprawnosci kodu pocztowego* w JavaScripcie
function validatePostalCode(inputCode){
alert('kod pocztowy ma niepoprawny format \n (poprawny: xx-xxx)');
}
*dotyczy polskich kodów pocztowych
var correct = /^[\-]{0,1}[0-9]{2}-[0-9]{3}$/;
if(!correct .test(inputCode)alert('kod pocztowy ma niepoprawny format \n (poprawny: xx-xxx)');
}
*dotyczy polskich kodów pocztowych
czwartek, 24 lipca 2008
Python, biblioteka urllib(2) i dodatkowe aspekty bezpieczeństwa aplikacji webowych
urllib (2) jest biblioteką Pythona do pobierania plików poprzez adres url,
dodatkowo umożliwia manipulację całego zapytania, pozwala na tworzenie własnego nagłówka zapytania cz manipulację ciasteczek, a nawet wysyłanie POST content'u.
Przyjrzyjmy sie prostej funkcji:
zobacz
zmienne user_agent i user_agent2 zawierają zmienną naszego agenta czyli tak jak zazwyczaj przedstawia się przeglądarka internetowa.
Za zmienną user_agent możemy podstawić dowolnego stringa w tym taki xml'owe (html'owe) a nawet kod dowolnego języka najlepiej skryptowego.
Jeżeli nieuważny webmaster posiada na swoim serwerze system do przeglądania statystyk, który wyświetla wszystkie informacje o użytkownikach, którzy przeglądali strony może nieświadomie uruchomić JavaScript, który podrzucimy mu w zmiennej user_agent. Oczywiście ten alert() w przykładzie jest bardzo subtelny, równie dobrze można by tam dorzucić jakiś XSS.
kolejna zmienna zawiera ciasteczka w naszym przypadku PHPSESSID.
Różna może być reakcja skryptu na serwerze w przypadku, gdy zmienna sesji posiada niedozwolone znaki. Polecam to sprawdzić.
funkcja save_it(url, filename, proxy, port) zapisuje zawartość strony zawartej pod adresem url do pliku filename, a jeśli zmienna proxy jest różna od None to połączenie odbywa się przez serwer proxy na podanym porcie.
Na koniec dorzucam jeszcze skrypt do wysyłania POST contentu:
zobacz
dodatkowo umożliwia manipulację całego zapytania, pozwala na tworzenie własnego nagłówka zapytania cz manipulację ciasteczek, a nawet wysyłanie POST content'u.
Przyjrzyjmy sie prostej funkcji:
zobacz
zmienne user_agent i user_agent2 zawierają zmienną naszego agenta czyli tak jak zazwyczaj przedstawia się przeglądarka internetowa.
Za zmienną user_agent możemy podstawić dowolnego stringa w tym taki xml'owe (html'owe) a nawet kod dowolnego języka najlepiej skryptowego.
Jeżeli nieuważny webmaster posiada na swoim serwerze system do przeglądania statystyk, który wyświetla wszystkie informacje o użytkownikach, którzy przeglądali strony może nieświadomie uruchomić JavaScript, który podrzucimy mu w zmiennej user_agent. Oczywiście ten alert() w przykładzie jest bardzo subtelny, równie dobrze można by tam dorzucić jakiś XSS.
kolejna zmienna zawiera ciasteczka w naszym przypadku PHPSESSID.
Różna może być reakcja skryptu na serwerze w przypadku, gdy zmienna sesji posiada niedozwolone znaki. Polecam to sprawdzić.
funkcja save_it(url, filename, proxy, port) zapisuje zawartość strony zawartej pod adresem url do pliku filename, a jeśli zmienna proxy jest różna od None to połączenie odbywa się przez serwer proxy na podanym porcie.
Na koniec dorzucam jeszcze skrypt do wysyłania POST contentu:
zobacz
Subskrybuj:
Posty (Atom)