Witam w poradniku z którego będzie można się dowiedzieć w jaki sposób można wysyłać wiadomości z poziomu PHP do najpopularniejszej w Polsce sieci komunikatorów, sieci Gadu-Gadu. Ta wiedza da nam możliwość tworzenia szybkich i skutecznych systemów powiadamiania internautów o nowych postach czy wydarzeniach na naszych stronach internetowych. Zaczynamy!
Początek przygody
Aby zacząć pisać skrypt do wysyłania wiadomości na GG musimy wpierw pobrać mały plik z klasą do obsługi protokołu. Jest on do pobrania tutaj. Wypakowywujemy go, dołączamy do naszego skryptu a także tworzymy obiekt tej klasy:
require_once('rfGG.class.php');
$GG = new rfGG(rfGG::VER_77);
Teraz musimy używając aplikacji GG lub innego zgodnego komunikatora np AQQ utworzyć konto dla naszego bota który będzie rozsyłał wiadomości. Nie możemy używać naszego konta. Gdy już mamy nowy numer i hasło możemy przystąpić do próby nawiązania połączenia z serwerem GG.
if ($GG->connect('123456789','hasłobota')) {
$GG->disconnect();
}
Zmiana statusu i opisu
Klasa rfGG posiada funkcję changeStatus() która służy do zmiany statusu oraz opisu konta bota.
if ($GG->connect('123456789','hasłobota')) {
$GG->changeStatus(rfGG::STATUS_BUSY_DESCR,'Code is poetry');
//tutaj jakiś kod...
$GG->disconnect('nie ma mnie');
}
W tym przykładzie ustawiliśmy status na STATUS_BUSY_DESCR a opis na Code is poetry. Poniżej zamieszczam listę wszystkich statusów oraz ich znaczeń.
- STATUS_NOT_AVAIL – niedostępny
- STATUS_NOT_AVIAL_DESCR – niedostępny z opisem
- STATUS_AVAILABLE - dostępny
- STATUS_AVAILABLE_DESCR – dostępny z opisem
- STATUS_BUSY - zajęty (zaraz wracam)
- STATUS_BUSY_DESCR – zajęty z opisem
- STATUS_INVISIBLE – niewidoczny
- STATUS_INVISIBLE_DESCR – niewidoczny z opisem
Przy statusach z opisem trzeba jako drugi argument funkcji podać tekst który będzie wyświetlany jako opis. Funkcja disconnect() służąca do rozłączania z serwerem automatycznie zmienia status na niedostępny i ewentualnie ustawia przekazany jej argument jako opis. W powyższym przykładzie skorzystaliśmy z tej możliwości i ustawiliśmy opis na nie ma mnie.
Wysyłanie wiadomości
Proszę zapiąć pasy ponieważ przechodzimy do ważnej części poradnika. Zajmijmy się teraz wysyłaniem wiadomości. Gdy już jesteśmy zalogowani w serwerze GG możemy to zrobić za pomocą odpowiedniej funkcji:
if ($GG->connect('123456789','hasłobota')) {
$GG->sendMessage('300500800',"Treść <b>wiadomości</b>...");
$GG->disconnect();
}
Funkcja ta to sendMessage() i przyjmuje dwa argumenty, numer odbiorcy oraz treść wysyłanej wiadomości. Jak widać w przykładzie wiadomość może zawierać tagi HTML. Dopuszczone są pogrubienia <b>, pochylenia <i>, podkreślenia <u> oraz złamanie linii za pomocą <br> lub \r\n. Funkcja po próbie wysłania wiadomość zwraca true lub false w zależności czy wszystko się udało. Można to wykorzystać do sprawdzenia powodzenia wysłania komunikatu i ewentualnie wyświetlić błąd przy użyciu getError().
if (!$GG->sendMessage($numer,$tresc)) {
die($GG->getError());
}
Odbieranie wiadomości
Używana przez nas klasa zezwala również na odbieranie wiadomości. Robi się to za pomocą dwóch funkcji: getMessages() i getMessageOne(). Najpierw omówimy tą pierwszą gdyż jest bardziej uniwersalna.
require_once('rfGG.class.php');
$GG = new rfGG(rfGG::VER_77);
if ($GG->connect('222333444','password')) {
$GG->ping();
$message = $GG->getMessages();
for($i=0;$i<count($message);$i++){
echo $message[$i]['sender'].'>'.$message[$i]['msg_text'].'<br>';
}
$GG->disconnect('Code is poetry');
}
Jak widać w powyższym kodzie przez przetworzeniem wiadomości wywołaliśmy funkcję ping() która ma za zadanie nawiązać kontakt z serwerem i pobrać czekające na nas dane. Należy tej funkcji używać zawsze przed funkcjami do wyświetlania wiadomości. Później możemy z otrzymaną tablicą wiadomości zrobić co chcemy. W tym przykładzie wyświetlamy numer z którego otrzymano informację oraz jej treść. Zwracana tablica ma zawsze ten sam schemat. Pierwszy jej wymiar to liczba porządkowa kolejnych wiadomości a drugi to elementy o indeksach sender (numer nadawcy), time (czas w formacie timestamp), msg_text (treść) i 2 inne, nie istotne dla nas.
Funkcja getMessageOne() działa podobnie tylko, że zwraca jedną wiadomość. Trzeba więc ją wykonywać wielokrotnie. Zwraca ona tablicę jednowymiarową z elementami o indeksach takich samych jak drugi wymiar poprzedniej funkcji.
Pewne zasady
Na koniec chciałbym zacytować fragment licencji z pliku używanej przez nas klasy:
- 4. Kategorycznie zabrania sie wykorzystywania kodu do rozsylania SPAMU oraz niechcianych wiadomosci.
- 5. Odbiorca wiadomosci musi wyrazic wczesniej zgode na ich otrzymywanie.
- 6. Zabrania sie wykorzystywania kodu do celow niezgodnych z prawem POLSKIM.
- 7. Na uzasadniona prosbe serwisu Gadu-Gadu nalezy usunac lub wylaczyc działanie kodu.
I ja również podpisuje się pod tym ponieważ nikt z nas przecież nie chce otrzymywać spamu na komunikator, prawda?




„Należy tej funkcji używać zawsze przez funkcjami ”
przeD funkcjami chyba miało być
Tak, dzięki. Literówka poprawiona.
Witam mam takie pytanie czy numer gg przy wysylaniu mozna zastapic numerem podanym w formularzu zebu osoba ktora podala nr gg z tej samej lini dostawala w wiadomosci haslo z bazy danych i nr gg byl by rowny gg podanemu w formularzu
Możesz podać dowolny numer jako adresata. Nadawcą musi być numer który Ty posiadasz.
gdybys mogl napisac do mnie na gg bylo by spuper moje gg to 23221415
A da się zrobić tak aby skrypt pobierał numery gg z pliku ?
Tak, oczywiście, że się da. Najłatwiej używając funkcji file() w php.
a mógłbyś mi dokładnie polecenie napisać ? Bardzo cie proszę bo ja jestem zielony w php. Dopiero się uczę
Przepraszam że robię bałagan ale pobiera mi tylko jeden numer z pliku. Próbowałem wpisywać numery po spacji i po enterze ale skrypt pobiera tylko pierwszy numer
Pamiętaj, że file() zwraca tablicę z linijkami z pliku. Wpisz każdy numer od nowej linijki a następnie utwórz pętle i przy każdym jej obrocie wysyłaj wiadomość na numer będący w kolejnym elemencie otrzymanej tablicy. Mniej więcej
$t = file(‘plik.txt’);
for($i=0,$i < count$t(), $i++ ){ /* wysyłanie wiadomości na numer spod $t[$i] */ };
Nie za bardzo wiem gdzie to mam umiejscowić. Przed tym :
if ($GG->connect(‘numer’,'hasło’))
{
$GG->sendMessage(numer , tresc);
$GG->disconnect();
?
funkcja sendMessage(numer , tresc) ma być wewnątrz tej pętli: http://wklej.org/id/369106/
Wywala mi takie coś :
Parse error: syntax error, unexpected T_VARIABLE, expecting ‘;’ in C:\xampp\htdocs\checker\gg.php on line 9
Mogłeś sam na to wpaść, że w 9 linijce mi się pomyliły średniki z przecinkami.
Z tym że tam nie ma średników. Próbowałem wszystkie przecinki zmienić na średniki to i tak dalej wywala błąd
Mówięo tych przecinkach w nagłówku pętli for. Jeśli dalej nie działa do daj linka do kodu na wklej.org.
http://wklej.org/id/369157/
Popraw na for($i=0;$i < count($t); $i++ )
Działa !!! Dziękuję
Chodzi o pobieranie wiadomości, jeżeli wiadomość zawiera link i jest pisana z numeru którego nie mamy w liście kontaktów, gg wycina taki link i wyświetla następujący tekst:
”
UWAGA: W trosce o bezpieczeństwo, w wiadomości od Nieznajomych podejrzane treści zastąpiono ciągiem „[xxxxx]„. Jeśli chcesz otrzymywać od Nieznajomego kompletne wiadomości – dodaj go do swoich kontaktów. Treść wiadomości: [xxxxx] test
”
jak można dodać numer który do nas pisze do listy kontaktów? a dokładnie sprawdzić czy tego numeru nie mamy na liście kontaktów, jeżeli nie mamy to wysłać do użytkownika informację np „Piszesz do nas pierwszy raz, dodajemy twój numer do listy kontaktów” i dodać numer do listy kontaktów,
z góry dzięki za odpowiedź.
Osoba której wysyłasz wiadomość z linkiem musi Cię mieć numer bota na swojej liście kontaktów.
chodzi mi o pobieranie wiadomości z linkiem
Aha… to chyba nie da się tego rozwiązać. Ta biblioteka nie obsługuje zapisu na listę kontaktów. Możesz zapisać taką osobę na listę za pomocą programu GG ale raczej nie o takie coś Ci chodzi.
Można dodać.
Przed ostatnim } w klasie dodaje się treść z http://wklej.to/zayH a później odwołuje się do funkcji przez
$GG->addContact('xxxxx,rfGG::USER_BUDDY);aby można było odbierać linki.Bardzo przydatna rzecz. Sam to napisałeś czy gdzieś znalazłes?
Parse error: syntax error, unexpected ‘)’, expecting ‘(‘
require_once(‘rfGG.class.php’);
$GG = new rfGG(rfGG::VER_77);
Mógłby ktoś mi wytłumaczyć na czym polega błąd?
Robie wszystko zgodnie z instrukcją.
Server na yoyo.pl
Nie jestem pewny ale wydaje mi się, że serwis yoyo.pl blokuję obsługę socketów w php które odpowiadają za komunikację zewnętrznym serwerem.
Witam. Mam pytanie. Zauważyłem na początku tego artykułu, że istnieje takie coś jak
# STATUS_INVISIBLE – niewidoczny
# STATUS_INVISIBLE_DESCR – niewidoczny z opisem
Teraz pytanie: Czy jest możliwość sprawdzenia czy użytkownik po drugiej stronie ma status niewidoczny czy jest też niedostępny. Z tego co czytałem gdzie indziej to się nie da, ale może miałem błędne informacje.
Z tego co mi wiadomo to nie, bo gdy Ty ustawiasz status niewidoczny to z punktu widzenia innych userów masz status niedostępny. Tutaj jest to rozdzielone po to aby móc ustawić taki stan niewidoczny dla bota.
Właśnie kiedyś chciałem napisać taki skrypt w PHP lub program w C++, żeby sprawdzać jaki status ma dany numer gg, ale chciałem głównie uwzględnić różnice pomiędzy niewidoczny, a niedostępny. Ale tak szukałem informacji w internecie i nic takiego nie znalazłem,
linijka:
if (!ereg(‘(([0-9]{1,3}\.){3}[0-9]{1,3})\:([0-9]{1,5})’, $sData, $aRegs) || !ip2long($aRegs[1])) {
zwraca mi:
Deprecated: Function ereg() is deprecated in..
pomożecie
Używasz PHP 5.3.0? Funkcja ereg już tam nie działa i trzeba ją zastąpić przez preg_match a także zmodyfikować wyrażenie regularne. Więcej o tym pod tym linkiem. Jak Ci się to uda to podziel się tu kodem
no dobra metodą prób i błędów się udało.. zamieniamy linijkę:
if (!ereg(‘(([0-9]{1,3}\.){3}[0-9]{1,3})\:([0-9]{1,5})’, $sData, $aRegs) || !ip2long($aRegs[1])) {
na:
if (!preg_match(‘/((\d{1,3}\.){3}.\d{1,3})\:(\d{1,5})/’, $sData, $aRegs) || !ip2long($aRegs[1])) {
gra huczy piszczy i dmucha .. ale błędów nie zwraca
dlaczego dla VER_80 nie wyświetla się treść odebranej wiadomości:
require_once(‘rfGG.class.php’);
$GG = new rfGG(rfGG::VER_80);
if ($GG->connect(‘****’,'*****’)) {
$GG->ping();
$message = $GG->getMessages();
for($i=0;$i’.$message[$i]['msg_text'].”;
}
$GG->disconnect(‘test’);
}
Też to zauważyłem że kod zwrócił mi informacje że ktoś do mnie coś napisał ale nie wyświetlił co napisał.
hmm już dział mała literówka.
Czy ktoś wie jak za pomocą tej klasy można wyświetlić listę kontaktów z serwera GG?
Witam. Raczkuję w obiektowym php i mam następujący problem. po ściągnięciu pliku klasy oraz zaincludowaniu go i stworzeniu obiektu $gadu = new rfGG(rfGG::VER_77);
Pokazuje się następujący błąd
Fatal error: Cannot access self:: when no class scope is active in c:\usr\krasnal\www\testy\gg_class\index.php on line 19
Spróbuj usunąć „rfGG::” z tej linijki. Z tego co wyczytałem może być to wina wersji php która takiego zapisu nie obsługuje.
Sprawa okazała się prostsza. Z poziomu Localhosta nie dało się wysłąć. Z poziomy strony www naturalnie jest ok.
wie ktos jaki tekst trzeba dodać w
Przed ostatnim } w klasie by a później odwołujac się do funkcji przez $GG->addContact(‘xxxxx,rfGG::USER_BUDDY); można było odbierać linki. bo link Zen Vantalye nie działa//
Kurcze nie działa mi to. Wywala:
Parse error: syntax error, unexpected ‘)’, expecting ‘(‘ in /home/annahot/public_html/gg/gg.php on line 4
To raczej Twój błąd w Twoim kodzie.
Mi chodzi o to ze chcem zeby przez gg przypominalo hasla z bazy danych zeby resetowalo je i resetowane hasla byly wysylane jako zakodowane przez sha1 do bazy danych a jeeszcze nie zakodowane nowe haslo bylo by wysylane na gg pod numer podany w formularzu a haslo by zmienialo w linijce tam gdzie jest nr gg moge wyslac ci moj plik i pokaze ci jak chcialem to zrobic
Mi chodzi o to ze chcem zeby przez gg przypominalo hasla z bazy danych zeby resetowalo je i resetowane hasla byly wysylane jako zakodowane przez sha1 do bazy danych a jeeszcze nie zakodowane nowe haslo bylo by wysylane na gg pod numer podany w formularzu a haslo by zmienialo w linijce tam gdzie jest nr gg moge wyslac ci moj plik i pokaze ci jak chcialem to zrobic to jest link
przypomnienie.php – http://wklej.org/id/656137/
przyphasla.php – http://wklej.org/id/656138/
i ten skrypt nei bede zamieszczal bo on dziala i tera nie wiem co mogl bym z tym zrobic poradzil bys mi ?
No to co napisałeś powinno działać. Nie wiem w czym masz problem i nie wiem co mógłbym Ci doradzić więcej. Z mojego punktu widzenia jest to trochę dziwne. Zazwyczaj nowe hasła wysyła się na e-mail.
tak wiem ale nie mam servera email mialem skrypt do maila wszystko napisane ale serva smtp nie mialem wiec poszukalem skryptu gg i pomylslalem ze to dobra zecz to nie mogl bys mi pomoc ??? sprobuj go u siebie odpalic i zobaczyc czy wszystko dziala bardzo bym prosil :]
Nie, na pewno nie zamierzam tego zrobić. Wybacz ale nie o to tu chodzi. Sam możesz to odpalić i sprawdzić czy działa. Ewentualnie pisz na jakiś forach.
aha to lipa z deka :/ a nic zlego w tych dwoch plikach nie widzisz ???
mi sie zdaje ze tu chodzi o ten kod gg bo jak podaje $ggd tam gdzie wpisac numer gg do kogo wyslac to nie wysyla a jak podam sam nr gg to dziala i jeszcze jest ta warotssc te haslo $hasloodszyfrowane i jak wpisze normalny nr gg tam i jak to wysyla to wyskakoje tylko mi cos takiego zamiast hasla ‘..’
i mi sie zdaje ze to moze wina skryptu gg ze on nie czyta tych wartosci jak myslisz ?
teraz widzę. ‘$ggd’ ma być w cudzysłowie, nie w apostrofie.
wejdz tu i sam zobacz co sie dzieje 86.182.251.84/przypomnienie.php
aaa zaraz spawdze
wyskakuje blad na lini 28 tam gdzie to zmienilem jak muwiles ale dalej nie dziala czy bys mi mogl cala linijke napisac jak bys mogl hehe
to raczej nie wina tego poniewaz wczesniej zamiast $ggd wklejalem nr gg i wszystko dzialalo poprawnie a teraz nie
:/
Poszukaj odpowiedzi na forach internetowych. Komentarze na blogach nie służą do tego.
spoko xDe