Obsługa protokołu GG w PHP

Opublikowano 4.7.2010  w PHP & MySQL » 57 komentarzy
Obsługa protokołu GG w PHP

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();
}
Działanie powyższego kodu jest krótkie, łączy się on z serwerem za pomocą podanych informacji a następnie jeśli wszystko pójdzie pomyślnie rozłącza się zmieniając status na niedostępny.

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()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?

57 odpowiedzi do tego artykułu

  1. „Należy tej funkcji używać zawsze przez funkcjami ”

    przeD funkcjami chyba miało być ;)

    • Elektryk

      Tak, dzięki. Literówka poprawiona.

      • Kamil

        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

        • Elektryk

          Możesz podać dowolny numer jako adresata. Nadawcą musi być numer który Ty posiadasz.

      • Kamil

        gdybys mogl napisac do mnie na gg bylo by spuper moje gg to 23221415

  2. zioomek65

    A da się zrobić tak aby skrypt pobierał numery gg z pliku ?

    • Elektryk

      Tak, oczywiście, że się da. Najłatwiej używając funkcji file() w php.

  3. zioomek65

    a mógłbyś mi dokładnie polecenie napisać ? Bardzo cie proszę bo ja jestem zielony w php. Dopiero się uczę :)

  4. zioomek65

    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

    • Elektryk

      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] */ };

  5. zioomek65

    Nie za bardzo wiem gdzie to mam umiejscowić. Przed tym :

    if ($GG->connect(‘numer’,'hasło’))
    {
    $GG->sendMessage(numer , tresc);
    $GG->disconnect();

    ?

  6. zioomek65

    Wywala mi takie coś :
    Parse error: syntax error, unexpected T_VARIABLE, expecting ‘;’ in C:\xampp\htdocs\checker\gg.php on line 9

    • Elektryk

      Mogłeś sam na to wpaść, że w 9 linijce mi się pomyliły średniki z przecinkami. :?

  7. zioomek65

    Z tym że tam nie ma średników. Próbowałem wszystkie przecinki zmienić na średniki to i tak dalej wywala błąd

    • Elektryk

      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.

  8. zioomek65

    Działa !!! Dziękuję :D

  9. elo_ziomek

    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ź.

    • Elektryk

      Osoba której wysyłasz wiadomość z linkiem musi Cię mieć numer bota na swojej liście kontaktów.

      • elo_ziomek

        chodzi mi o pobieranie wiadomości z linkiem

        • Elektryk

          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.

          • Zen Vantalye

            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.

          • Elektryk

            Bardzo przydatna rzecz. Sam to napisałeś czy gdzieś znalazłes?

  10. ptaq

    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

    • Elektryk

      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.

  11. 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.

    • Elektryk

      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.

  12. 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,

  13. obi

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

    • Elektryk

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

  14. 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 ;)

  15. marcin

    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’);
    }

  16. Też to zauważyłem że kod zwrócił mi informacje że ktoś do mnie coś napisał ale nie wyświetlił co napisał.

  17. 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?

  18. 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

    • Elektryk

      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.

  19. adrpak

    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//

  20. Kurcze nie działa mi to. Wywala:

    Parse error: syntax error, unexpected ‘)’, expecting ‘(‘ in /home/annahot/public_html/gg/gg.php on line 4

    • Elektryk

      To raczej Twój błąd w Twoim kodzie.

  21. Kamil

    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

  22. Kamil

    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 ?

    • Elektryk

      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.

  23. Kamil

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

    • Elektryk

      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.

  24. Kamil

    aha to lipa z deka :/ a nic zlego w tych dwoch plikach nie widzisz ???

  25. Kamil

    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 ‘..’

  26. Kamil

    i mi sie zdaje ze to moze wina skryptu gg ze on nie czyta tych wartosci jak myslisz ?

    • Elektryk

      teraz widzę. ‘$ggd’ ma być w cudzysłowie, nie w apostrofie.

  27. Kamil

    wejdz tu i sam zobacz co sie dzieje 86.182.251.84/przypomnienie.php

  28. Kamil

    aaa zaraz spawdze

  29. Kamil

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

  30. Kamil

    to raczej nie wina tego poniewaz wczesniej zamiast $ggd wklejalem nr gg i wszystko dzialalo poprawnie a teraz nie
    :/

    • Elektryk

      Poszukaj odpowiedzi na forach internetowych. Komentarze na blogach nie służą do tego.

  31. Kamil

    spoko xDe

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Markup Controls
Emoticons Smile Grin Sad Surprised Shocked Confused Cool Mad Razz Neutral Wink Lol Red Face Cry Evil Twisted Roll Exclaim Question Idea Arrow Mr Green