{"id":207,"date":"2009-07-19T21:54:49","date_gmt":"2009-07-19T20:54:49","guid":{"rendered":"http:\/\/eriz.pcinside.pl\/weblog\/bot-do-powiadomien-w-ekg2-207.html"},"modified":"2009-07-20T23:17:50","modified_gmt":"2009-07-20T22:17:50","slug":"bot-do-powiadomien-w-ekg2","status":"publish","type":"post","link":"https:\/\/eriz.pcinside.pl\/weblog\/bot-do-powiadomien-w-ekg2-207.html","title":{"rendered":"Bot do powiadomie\u0144 w EKG2"},"content":{"rendered":"<p>W trakcie rozwa\u017ca\u0144 z <a href=\"http:\/\/kwiateusz.blip.pl\">^kwiateusz<\/a>em nad jakimi\u015b usprawnieniami dla <a href=\"http:\/\/forum.php.pl\">Forum PHP.pl<\/a> (IPBoard) przyszed\u0142 mi do g\u0142owy pomys\u0142, kt\u00f3ry zauwa\u017cy\u0142em kiedy\u015b na <a href=\"http:\/\/forum.jabberpl.org\">Polskim Forum Jabbera<\/a>. Stworzono do niego mod, kt\u00f3ry umo\u017cliwia <a href=\"http:\/\/forum.jabberpl.org\/index.php?s=&#038;showtopic=2940&#038;view=findpost&#038;p=21680\">powiadamianie u\u017cytkownik\u00f3w o nowych postach<\/a> w\u0142a\u015bnie przez Jabbera.<\/p>\n<p><a href=\"http:\/\/eriz.pcinside.pl\/weblog\/modul-powiadomien-gg-w-php-198.html\">Pisa\u0142em ju\u017c o module powiadomie\u0144<\/a> opartym o klas\u0119 Jabbera dla PHP, ale co w sytuacji, gdy serwer jest bardziej obci\u0105\u017cony? Dla ma\u0142ych for\u00f3w wcze\u015bniej om\u00f3wione rozwi\u0105zanie &#8211; jak znalaz\u0142. Natomiast w przypadku wi\u0119kszych aplikacji b\u0119dzie stanowi\u0142o pewien problem &#8211; od wydajno\u015bci po gubienie powiadomie\u0144, czy inne nieprzewidziane sytuacje.<\/p>\n<p>Dlatego wykorzystamy w tym celu popularnego klienta IM pod shella, mianowicie <a href=\"http:\/\/ekg2.org\">ekg2<\/a>. Umo\u017cliwi on r\u00f3wnie\u017c skorzystanie z powiadomie\u0144 do innych sieci, m.in. Gadu-gadu, czy Tlen.<\/p>\n<p><!--more--><\/p>\n<h3>ekg2<\/h3>\n<p>Na samym pocz\u0105tku b\u0119dzie nam potrzebne konto shellowe. Cokolwiek, aby mo\u017cna by\u0142o uruchomi\u0107 ekg2. Na hostingach wsp\u00f3\u0142dzielonych raczej nie b\u0119dzie dost\u0119pu do systemu pakiet\u00f3w, wi\u0119c trzeba pobra\u0107 paczk\u0119 i samodzielnie j\u0105 skompilowa\u0107, co nie powinno stanowi\u0107 problemu dla os\u00f3b potrafi\u0105cych zalogowa\u0107 si\u0119 do sesji zdalnej. Kompiluje si\u0119 standardowo:<\/p>\n<p><code lang=\"text\">.\/configure<br \/>\nmake<br \/>\nmake install<\/code><\/p>\n<p>ew. ustawiaj\u0105c prefiks dla aplikacji (zobacz: <em>.\/configure &#8211;help<\/em>).<\/p>\n<p><!-- group 1 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-1.png\" rel=\"imagebox-1\" title=\"pobieranie ekg2\"><img decoding=\"async\" src=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-1-thumb.jpg\" alt=\"pobieranie ekg2\" style=\"width:160px;height:99px;\" \/><\/a> <a href=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-2.png\" rel=\"imagebox-1\" title=\"przygotowanie do kompilacji\"><img decoding=\"async\" src=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-2-thumb.jpg\" alt=\"przygotowanie do kompilacji\" style=\"width:160px;height:99px;\" \/><\/a> <\/p>\n<p>Po pomy\u015blnej instalacji musimy skonfigurowa\u0107 konto komunikatora. Po uruchomieniu <em>ekg2<\/em> wydajemy komend\u0119 <em>\/session &#8211;add xmpp:jid@serwer.pl<\/em>. Teraz has\u0142o: <em>\/session password<\/em> i wpisujemy has\u0142o zatwierdzaj\u0105c klawiszem ENTER.<\/p>\n<p>Je\u015bli wszystko wprowadzili\u015bmy prawid\u0142owo, to po wydaniu komendy <em>\/connect<\/em> komunikator po\u0142\u0105czy si\u0119 z serwerem.<\/p>\n<p><!-- group 2 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-3.png\" rel=\"imagebox-2\" title=\"po\u0142\u0105czenie z serwerem\"><img decoding=\"async\" src=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-3-thumb.jpg\" alt=\"po\u0142\u0105czenie z serwerem\" style=\"width:160px;height:99px;\" \/><\/a> <\/p>\n<p>Pora teraz stworzy\u0107 tzw. <em>pipe<\/em>&#8217;a, czyli potok s\u0142u\u017c\u0105cy do komunikacji mi\u0119dzy procesami. W skr\u00f3cie &#8211; b\u0119dziemy mogli komunikowa\u0107 si\u0119 ekg2 zapisuj\u0105c bezpo\u015brednio do pseudopliku. Odpalamy wi\u0119c wtyczk\u0119 wpisuj\u0105c w linii polece\u0144:<\/p>\n<p><code lang=\"plain\">\/plugin +rc<br \/>\n\/set rc:remote_control pipe:\/home\/eriz\/rura.ekg2<br \/>\n\/save<br \/>\n<\/code><\/p>\n<p>Co sprawi, \u017ce w katalogu domowym pojawi si\u0119 nowy plik, kt\u00f3ry umo\u017cliwi nam sterowanie <em>ekg2<\/em> przez zewn\u0119trzne aplikacje. W moim przypadku, jest to <em>\/home\/eriz\/rura.ekg2<\/em>.<\/p>\n<p><!-- group 3 --><\/p>\n<p class=\"images\"><a href=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-4.png\" rel=\"imagebox-3\" title=\"listing z pipe\"><img decoding=\"async\" src=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-4-thumb.jpg\" alt=\"listing z pipe\" style=\"width:160px;height:99px;\" \/><\/a> <\/p>\n<p>Aby sprawdzi\u0107, czy wszystko dobrze dzia\u0142a, przy pod\u0142\u0105czonej sesji w ekg2, przechodzimy do pow\u0142oki i wypisujemy wiadomo\u015b\u0107 do rurki:<\/p>\n<p><code lang=\"txt\">echo \/msg jid@serwer.pl tre\u015b\u0107 wiadomo\u015bci >> rurka.ekg2<\/code><\/p>\n<p>Efekt?<\/p>\n<p><!-- group 4 --><\/p>\n<p class=\"images\"><img decoding=\"async\" src=\"\/weblog\/stuff\/207-bot-do-powiadomien-w-ekg2-5.png\" alt=\"otrzymana wiadomo\u015b\u0107\" style=\"width:419px;height:179px;\" \/> <\/p>\n<p>Trudne? <img src=\"https:\/\/eriz.pcinside.pl\/weblog\/wp-includes\/images\/smilies\/e_wink.png\" alt=\";)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Wystarczy nada\u0107 rurce odpowiednie uprawnienia, aby inny u\u017cytkownik m\u00f3g\u0142 z niej skorzysta\u0107, czy po prostu wrzuci\u0107 j\u0105 do katalogu tymczasowego. To ju\u017c zale\u017cy jednak od naszych potrzeb i inwencji. ;]<\/p>\n<h3>testy na poligonie<\/h3>\n<p>Aby ekg2 dzia\u0142a\u0142 sprawnie i bez naszej ingerencji, wypada\u0142oby skonfigurowa\u0107 go tak, aby automatycznie pod\u0142\u0105cza\u0142 si\u0119 do wybranego serwera, po roz\u0142\u0105czeniu r\u00f3wnie\u017c. W tym celu szukamy pliku <em>sessions-jabber<\/em> w ukrytym katalogu <em>.ekg2<\/em>, kt\u00f3ry znajduje si\u0119 w \u015bcie\u017cce naszego profilu. Odpalamy do edycji ulubionym edytorem (<em>vi(m)<\/em>\/<em>pico<\/em>\/<em>emacs<\/em>? :D) i szukamy linijek:<\/p>\n<p><code lang=\"text\">auto_connect=0<br \/>\nauto_reconnect=0<\/code><\/p>\n<p>I zamieniamy ich warto\u015b\u0107 na <em>1<\/em>. Rzecz jasna, modyfikacji dokonujemy przy wy\u0142\u0105czonym ekg2, aby nie utraci\u0107 zapisanych informacji.<\/p>\n<p>Jak uruchamia\u0107 komunikator, aby po roz\u0142\u0105czeniu &#8222;nie zdech\u0142&#8221;? Poczytaj o <a href=\"http:\/\/blog.0x1fff.com\/2007\/06\/gnu-screen-najczesciej-uzywane-opcje.html\"><em>screen<\/em><\/a>ie.<\/p>\n<h3>i mi\u0119so armatnie<\/h3>\n<p>Armata\/czo\u0142g\/amfibia\/szeregowy (:D) te\u017c, trzeba teraz wys\u0142a\u0107 odpowiednie rozkazy. List\u0119 dost\u0119pnych komend otrzymasz po wklepaniu <em>help<\/em> w oknie programu. Nam przyda si\u0119 tylko jedna &#8211; <em>\/msg<\/em>, kt\u00f3rej sk\u0142adni zapewnie mog\u0142e\u015b(a\u015b) si\u0119 ju\u017c domy\u015ble\u0107:<\/p>\n<p><code lang=\"txt\">\/msg u\u017cyszkodnik wiadomo\u015b\u0107<\/code><\/p>\n<p>Wykorzystanie naszej wiedzy w np. PHP b\u0119dzie wr\u0119cz banalne:<\/p>\n<p><code lang=\"php\">file_put_contents('\/sciezka\/do\/rurka.ekg2', '\/msg user@serwer.pl to jest testowa wiadomo\u015b\u0107');<\/code><\/p>\n<p>I tyle. ;] Musimy przy tym pami\u0119ta\u0107, \u017ce w przypadku jakich\u015b problem\u00f3w mo\u017ce si\u0119 przyda\u0107 funkcja <a href=\"http:\/\/php.net\/sleep\">sleep<\/a> z jak\u0105\u015b ma\u0142\u0105 warto\u015bci\u0105 przed wys\u0142aniem kolejnej wiadomo\u015bci, aby da\u0107 komunikatorowi nieco wytchnienia.<\/p>\n<h3>epilog<\/h3>\n<p>Wiadomo\u015b\u0107 powinni\u015bmy &#8222;ubezpiecza\u0107&#8221; tak, aby nie zrobi\u0142a nam niczego z komunikatorem (tzn. nie skasowa\u0142a listy, nie zacz\u0119\u0142a spamowa\u0107, itd).<\/p>\n<p><strong style=\"color: red\">Nie ponosz\u0119 odpowiedzialno\u015bci za wszelkie konsekwencje spowodowane wykorzystywaniem powy\u017cszego rozwi\u0105zania w rzeczywisto\u015bci. Pami\u0119taj, \u017ce je\u015bli u\u017cytkownik nie zezwoli na otrzymywanie wiadomo\u015bci, mo\u017cesz zosta\u0107 poci\u0105gni\u0119ty do odpowiedzialno\u015bci za wysy\u0142anie spamu.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W trakcie rozwa\u017ca\u0144 z ^kwiateuszem nad jakimi\u015b usprawnieniami dla Forum PHP.pl (IPBoard) przyszed\u0142 mi do g\u0142owy pomys\u0142, kt\u00f3ry zauwa\u017cy\u0142em kiedy\u015b na Polskim Forum Jabbera. Stworzono do niego mod, kt\u00f3ry umo\u017cliwia powiadamianie u\u017cytkownik\u00f3w o nowych postach w\u0142a\u015bnie przez Jabbera. Pisa\u0142em ju\u017c o module powiadomie\u0144 opartym o klas\u0119 Jabbera dla PHP, ale co w sytuacji, gdy serwer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,3,12],"tags":[48,54,37,50,30,74],"_links":{"self":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/207"}],"collection":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/comments?post=207"}],"version-history":[{"count":0,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/posts\/207\/revisions"}],"wp:attachment":[{"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/media?parent=207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/categories?post=207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eriz.pcinside.pl\/weblog\/wp-json\/wp\/v2\/tags?post=207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}