Moduł Net::Gadu
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
Co to jest
Net::Gadu to moduł autorstwa naszego rodaka Marcina Krzyżanowskiego - http://www.hakore.com/. Moduł ten wykorzystuje bibliotekę libgadu.so która jest częścią projektu EKG. Dzięki temu modułowi jesteśmy w stanie zrobić wiele użytecznych rzeczy począwszy od zalogowania się na konto, wysyłania wiadomości, zmiany statusu, wyszukiwania osób oraz obsługi wielu innych zdarzeń.
Download
- Pakiet możemy pobrać z CPANu
Zależności
- Aby zaintalowac libgadu.so nalezy skompilowac EKG z opcja --enable-shared
Instalacja w systemie UNIX'owym
Po rozpakowaniu modułu wydajemy polecenie
perl Makefile.PL
make
make install
Sprawdzamy, czy został pomyślnie zainstalowany, pisząc jednolinijkowca:
perl -e 'use Net::Gadu'
Pomyślne wykonanie programu (żadnych komunikatów) daje nadzieję, że moduł został zainstalowany poprawnie i będzie działał. Jeżeli wszystko poszło zgodnie z planem to możemy już korzystać z możliwości naszego nowego modułu.
Konstruktor
$gg = new Net::Gadu();
Mogą być również użyte dodatkowe parametry :
- server => "122.122.122.122" - ip alternatywnego serwera
- async => 1 lub 0 - komunikacja asynchroniczna lub też nie
Dostępne metody
- $gg->login(uin, password) Nawiązanie połączenia z serwerem oraz logowanie do serwera.
- $gg->logoff() Wylogowanie z serwera i zakonczenie sesji.
- $gg->send_message(receiver_uin, message) Wysłanie wiadomości pod wskazany numer UIN.
- $gg->send_message_chat(receiver_uin, message) Również wysłanie wiadomości pod wskazany numer UIN.
- $gg->set_available() Ustawia status na dostepny. Mamy również funkcje set_busy(), set_invisible(), set_not_available(), change_status().
- $gg->add_notify() Możemy użyć tej funkcji w celu poinformowania serwera, że chcemy znać status danej osoby i czekać na zdarzenia związane ze zmianą statusu.
- $gg->change_status() Zmiana statusu. Możliwe opcje $Net::Gadu::STATUS_NOT_AVAIL_DESCR, $Net::Gadu::STATUS_AVAIL_DESCR, $Net::Gadu::STATUS_BUSY_DESCR, $Net::Gadu::STATUS_INVISIBLE_DESCR.
- $gg->search($uin,$nickname,$first_name,$last_name,$city,$gender,$active) Wyszukiwanie osób na podstawie parametrów. Jeżeli parametr ma wartość "", to pole nie jest brane pod uwagę podczas wyszukiwania. Metoda zwraca tablicę ze szczegółowymi informacjami ($gender = "male" lub "female" lub "none", $active = 1 lub 0).
- $gg->check_event() Metoda ta sprawdza, czy zaszło jakieś zdarzenie.
- $gg->get_event() Metoda zwraca informację o zdarzeniu, które miało miejsce, zwracany jest hasz. Poniżej przedstawię kilka zdarzeń oraz ich pola.
$e->{type} zawiera kod ostatniego zdarzenia
$Net::Gadu::EVENT_MSG # zdarzenie odpowiedzialne za przechwytywanie przychodzącej wiadomości
$e->{message} # treść wiadomości
$e->{sender} # numer wysyłającego wiadomość
$e->{msgclass} # typ wiadomości
$Net::Gadu::EVENT_ACK # zdarzenie odpowiedzialne za potwierdzenie wysłania wiadomości
$e->{recipient}
$e->{status}
$e->{seq}
$Net::Gadu::EVENT_STATUS # zdarzenie odpowiedzialne za zmianę statusu (wersja dla klienta Gadu-Gadu <6.0)
$e->{uin}
$e->{status}
$e->{descr}
$Net::Gadu::EVENT_STATUS60 # zdarzenie odpowiedzialne za zmianę statusu (wersja dla klienta Gadu-Gadu >= 6.0)
$e->{uin}
$e->{status}
$e->{descr}
$Net::Gadu::EVENT_NOTIFY #zdarzenie odpowiedzialne za przechwytywanie informacji o pojawieniu się kogoś (wersja klienta Gadu-Gadu <6.0)
$e->{uin}
$e->{status}
$Net::Gadu::EVENT_NOTIFY_DESCR #zdarzenie odpowiedzialne za przechwytywanie informacji o pojawieniu się kogoś,
#wraz z opisem (wersja klienta Gadu-Gadu < 6.0)
$e->{uin}
$e->{status}
$e->{descr}
$Net::Gadu::EVENT_NOTIFY60 # zdarzenie odpowiedzialne za przechwytywanie informacji o pojawieniu sie kogoś (wersja klienta Gadu-Gadu >= 6.0)
$e->{uin}
$e->{status}
$e->{descr}
$Net::Gadu::EVENT_SEARCH_REPLY # zdarzenie odpowiedzialne za przechwytywanie informacji o odpowiedzi na wyszukiwanie danych
$e->{results}
Dostepne są kody następujących zdarzeń :
$Net::Gadu::EVENT_NONE
$Net::Gadu::EVENT_MSG
$Net::Gadu::EVENT_NOTIFY
$Net::Gadu::EVENT_NOTIFY_DESCR
$Net::Gadu::EVENT_NOTIFY60
$Net::Gadu::EVENT_STATUS
$Net::Gadu::EVENT_STATUS60
$Net::Gadu::EVENT_ACK
$Net::Gadu::EVENT_PONG
$Net::Gadu::EVENT_CONN_FAILED
$Net::Gadu::EVENT_CONN_SUCCESS
$Net::Gadu::EVENT_DISCONNECT
$Net::Gadu::EVENT_SEARCH_REPLY
Przykład
Pierwszym naszym programem będzie bardzo "surowy", tekstowy komunikator GG, korespondujący z jednym numerem. Przykładowy program wykorzystujący nasz moduł mógłby wyglądać tak
use strict;
use Net::Gadu;
use Proc::Fork;
my $gg = new Net::Gadu(async=>0);
my $mess;
$gg->login("4377482","tajne_haslo_do_konta") or die "Login error\n";
#Proces rodzicielski
parent {
while (1) {
#Sprawdzamy czy zaszlo zdarzenie
if ($gg->check_event()==1) {
my $e = $gg->get_event();
my $type = $e->{type};
#Jeżeli nie możemy się połączyć
if ($type == $Net::Gadu::EVENT_CONN_FAILED) {
die "Connection failed";
}
#Jeżeli otrzymalismy wiadomość
if ($type == $Net::Gadu::EVENT_MSG) {
print "___________________________________________________________\n";
print "\nWiadomosc od: ".$e->{sender}."\n".$e->{message}."\n";
print "___________________________________________________________\n\n";
}
} else {
#Proces potomny
child {
$mess=<>;
chomp $mess;
#Wysyłamy wiadomość
$gg->send_message_chat("3890516","$mess");
};
}
}
}
Dialog naszego programu ukazany na terminalu oraz w okienku EKG
Terminalowe GG :P | EKG |
Kolejnym prostym zastosowaniem możliwości modułu jest przeszukiwanie katalogu publicznego zarejestrowanych osób oraz wyciąganie z niego osób spełniających interesujące nas kryteria. Przypuśćmy, że chcemy wyszukać użytkowniczki o nicku "Blondynka" i imieniu "Ania" ;). Oto prosty program pozwalający nam to zrobić.
use strict;
use Net::Gadu;
use Data::Dumper;
my $gg = new Net::Gadu(async=>0);
$gg->login("4377482","tajne_haslo_do_konta") or die "Login error\n";
$gg->search("","Blondynka","Ania","","","female",0);
while (1) {
while ($gg->check_event() == 1) {
my $e = $gg->get_event();
my $type = $e->{type};
if ($type == $Net::Gadu::EVENT_CONN_FAILED) {
die "Connection failed";
}
if ($type == $Net::Gadu::EVENT_DISCONNECT) {
die "disconnect";
}
if ($type == $Net::Gadu::EVENT_SEARCH_REPLY) {
print Dumper($e->{results}); #Zrzucamy wynik
$gg->logoff(); #Wylogowujemy
exit(1); #Wychodzimy z programu
}
}
}
Wynikiem wykonania naszego programu będzie zrzut tablicy ze szczegółowymi informacjami dotyczącymi naszych blondynek
Dodatkowe informacje
Ciekawym zastosowaniem tego modułu mogłyby być różnego rodzaju warianty z zastosowaniem baz danych, gromadzeniem informacji na temat użytkowników, czy wszelkiego rodzaju spam.
- Macierzysta strona dokumentacji do modułu http://search.cpan.org/~krzak/Net-Gadu-1.8/Gadu.pm
- Gadu Gadu http://www.gadu-gadu.pl/
- EKG http://ekg.chmurka.net/
- GNU Gadu http://www.gnugadu.org/
Autor opracowania
Adrian Sielski
Email: adrian.sielski@gmail.com