Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt, sprawdzający status serwera
Forum PHP.pl > Forum > Przedszkole
Akiro
Witam, cały dzień się z tym męczę i mi nie wychodzi, a jestem kompletnie zielony jeśli chodzi o PHP. Mianowicie, próbuję na forum dodać skrypt, który sprawdzałby status serwera. Próbowałem już używać socketów, stosując to:
  1. <?php
  2. $ip = "ip";
  3. $port = "port";
  4. $sock = @fsockopen( $ip, $port, $num, $error, 60 );
  5.  
  6. if( !$sock ){
  7. echo( "Offline");
  8. }
  9.  
  10. if( $sock ){
  11. echo( "Online" );
  12. fclose($sock);
  13. }
  14. ?>

I skrypt w zasadzie działał, bo kiedy podałem IP i Port serwera, na którym stoi forum, to wyświetlało mi poprawnie. Natomiast, kiedy podałem IP i Port login serverów, to wyświetlało "Offline" i error: Connection timed out, pomimo tego, że serwer był włączony. Puściłem jeszcze pinga na adres tego serwera z konsoli Windowsa i gubiło wszystkie pakiety, więc doszedłem do wniosku, że serwer jest chroniony jakimś firewallem czy coś.

Wtedy, ktoś mnie pokierował, żeby zrobić skrypt, który zczytuje wartość dla "serverStatus" (bodajże: 0 - offline, 1 - online, 2 - busy) z tego pliku:
http://ll.leagueoflegends.com/pages/launcher/euw

Mój problem polega na tym, że nie wiem jak to zrobić. Czytałem trochę chociażby o file_get_contents(), ale kiedy napiszę coś w stylu:
  1. <?php
  2. $status = file_get_contents('http://ll.leagueoflegends.com/pages/launcher/euw');
  3. echo "$status";
  4. ?>

to zamiast wyświetlić mi zawartość tego pliku, to na forum pojawia się obrazek z CAPTCHą i komunikat, abym udowodnił, że nie jestem botem.

Nie wiem też jak później wywołać te "serverStatus", żeby potem napisać do tego warunek na status serwera.

Z góry dzięki za pomoc.wink.gif
Popek231
najpierw sprawdź czy plik istnieje, a potem za pomocą if wyświetl status ;)

może Ci sie uda za pomocą:
http://us3.php.net/file_get_contents#refse...ontents-seealso
Akiro
Nie wiem czy dobrze zrozumiałem; do sprawdzenia czy plik istnieje służy chyba file_exists i mógłbym napisać coś w stylu:
  1. <?php
  2. $plik = 'http://ll.leagueoflegends.com/pages/launcher/euw';
  3.  
  4. if (file_exists($plik)) {
  5. echo "Serwer online";
  6. } else {
  7. echo "Serwer offline";
  8. }
  9. ?>

ale przecież, to że plik istnieje nie znaczy, że serwer jest włączony ? Bardziej chodzi o zawartość pliku, fragment "serverStatus" - skrypt powinien zczytywać jaka jest jego wartość i na podstawie tego wyświetlać stosowną informację.
Popek231
Nie znam się na serwerze gry lol, ale na serwerze gry minecraft jest plik, który powstaje po włączeniu serwera.
w tej grze powinien też taki być wink.gif
ale mogę się mylićtongue.gif

---------
hmm... możesz też wykorzystać skrypt, który sprawdza plik czy znajduje się w nim ciąg znaków
w tym przypadku "serverStatus":1 to status ONLINE, "serverStatus":0 OFFLINE wink.gif

-----------------
albo zastosuj:
  1. substr_count('this is PHP!', 'is'); // zwróci 2


dla Ciebie:

  1. if(substr_count($otwarty_i_odczytany_plik, '"serverStatus":1') >= 1){
  2. echo 'ONLINE! :)';
  3. } else {
  4. echo 'OFFLINE! :(';
  5. }
Akiro
To jest chyba po prostu kod launchera lola, który można uruchomić niezależnie od tego, czy serwer jest online czy offline, ale właśnie w tym launcherze jest wyświetlany status login servera, więc zczytując dany fragment mógłbym napisać warunek i stworzyć taki prosty status serwerów.
Cytat
hmm... możesz też wykorzystać skrypt, który sprawdza plik czy znajduje się w nim ciąg znaków
w tym przypadku "serverStatus":1 to status ONLINE, "serverStatus":0 OFFLINE

Tylko właśnie nie potrafię dojść do tego jak to zrobić sad.gif

@edit
O dzięki, nie zobaczyłem edita, bo sam wtedy pisałem posta. Zaraz to wypróbuję.


@edit2
Nie działa, dostaję takie coś:
Kod
Fatal error: Can't use function return value in write context in /home/a2292042/public_html/index.php(400) : eval()'d code(24) : eval()'d code on line 3

to by była linijka dla if, w ogóle można użyć jednocześnie ' i " jedno po drugim ?
Popek231
tak, można użyć " po ', ponieważ wtedy php szuka zamknięcia czyli ', a nie " i nic nie robi sobie z tego, że " się tam znajduje smile.gif

możesz za pomocą JS odczytać zawartość tego pliku, dać w ukryte pole w form'ie, gdy kliknie się na stronie, żeby pokazało status, wyśle się kod tego pliku / strony i php sprawdzi wtedy status, gdyż chyba w AJAXie nie umiesz napisać, by automatycznie wtedy się to wyświetlało, na "żywo" podczas ładowania wink.gif
tyle ode mnie na dziś, branoc:)

pokaż co się tam dzieje,
tzn kod pokaż
Akiro
Dziwne, bo błąd "sam się naprawił" (po prostu jeszcze raz wkleiłem ten fragment kodu, który podałeś i dostosowałem do swojej zmiennej).
  1. $euw = file_get_contents('http://ll.leagueoflegends.com/pages/launcher/euw', 'r');
  2. if(substr_count($euw, '"serverStatus":1') >= 1){
  3. echo 'ONLINE! :)';
  4. } else {
  5. echo 'OFFLINE! :(';
  6. }

Tyle, że dla takiego warunku skrypt pokazuje "OFFLINE". :<

Próbowałem jeszcze, go przerobić na coś takiego:
  1. $euw = file_get_contents('http://ll.leagueoflegends.com/pages/launcher/euw', 'r');
  2. $euw_status = substr_count($euw, '"serverStatus":1');
  3. if($euw_status=1)
  4. {
  5. echo "EUW: Online";
  6. }
  7. else if($euw_status=0)
  8. {
  9. echo "EUW: Offline";
  10. }

I pokazało mi, że jest Online, ale to samo wyświetlało dla "serverStatus":0 biggrin.gif Chyba, że tak powinno być, bo ja jednak jestem zielony i nie wiem czy dobrze rozumiem sposób jej działania tongue.gif
vermis
Operator porównania to '=='
  1. if($euw_status==1)
Popek231
co wyskakuje, gdy wpiszesz
  1. echo $euw;


kod, który się znajduje na stronie?
Akiro
Cytat(vermis @ 22.11.2013, 00:18:28 ) *
Operator porównania to '=='
  1. if($euw_status==1)

Aj, poprawiłem i teraz znowu wyświetla "Offline". Domyślam się dlaczego, bo:
Cytat(Popek231 @ 22.11.2013, 00:20:29 ) *
co wyskakuje, gdy wpiszesz
  1. echo $euw;


kod, który się znajduje na stronie?

skutkuje pojawieniem się czegoś takiego na forum:
http://i.imgur.com/uuf5iu4.jpg

Więc skrypt nawet nie może przeczytać tamtej wartości. Jest na to jakiś sposób?
Popek231
myślę, że JS najlepszy wink.gif
ale jest jeszcze AJAX.. biggrin.gif
Akiro
Czyli nie da się tego w żaden sposób obejść stosując kod php? Skoro tam pojawił się komunikat o Cookies, to może trzeba je jakoś odblokować dla tego skryptu? JS i Ajaxa nie ogarniam kompletnie.
Popek231
sam JS wystarczy;)
przesyłasz przez JS formularzem zawartość strony z lola, potem php odczytuje to jako wartość; nie captche i śmiga;)
przynajmniej tak powinno być według mnie:D
Akiro
A mógłbyś mnie jakoś pokierować jak przesłać zawartość strony przez taki formularz, a potem to odczytać przez php? Patrzę na te manuale w internecie, ale prawie nic mi to nie mówi :/
Popek231
teraz testuje wszyskto, ale nie mogę jednak tego zrobić...
ale wiem jak wyświetlić tą stronę:
  1. <object type="text/html" data="http://ll.leagueoflegends.com/pages/launcher/euw"></object>

jak wymyślisz jak to wyciągnąć, jesteś w domku;)
Gość
użyj tego, zwróć uwagę na useragenta (prawdopodobnie po tym rozpoznają, że jesteś botem)
http://www.jonasjohn.de/snippets/php/curl-example.htm

Jak nadal rozpoznaje Cię jako bota, podmień USERAGENT na jakiś nowocześniejszy (listę useragentow przegladarek znajdziesz gdzieś w necie).
Akiro
Teraz nie rozpoznaje mnie jako bota, tylko po prostu nic nie wyświetla. Podmieniłem te useragenty na swoje własne.
@edit
Wcześniej źle wywołałem funkcję. Teraz pomimo tego, że ustawiałem różne useragenty cały czas wywala to CAPTCHA. Jakieś pomysły?
Popek231
próbuję cały dzień coś z tym wykombinować, bo sam jestem ciekawy jak to zrobić..
podaj IP serwera, spróbuję sprawdzić wszystkie możliwe opcje sprawdzenia statusu:D
Akiro
Próbowałem tymi curlami, tak jak ktoś podał wyżej i cały czas wyświetlało CAPTCHA i żebym włączył ciasteczka, dlatego do tego skryptu z linku dodałem jeszcze zapisywanie ciasteczek do pliku.
  1. <?php
  2. $url = 'http://ll.leagueoflegends.com/pages/launcher/euw';
  3. function curl_download($url){
  4. $ch = curl_init();
  5. curl_setopt($ch, CURLOPT_URL, $url);
  6. curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080214 Firefox/2.0.0.12");
  7. curl_setopt($ch, CURLOPT_HEADER, 0);
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  10. curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
  11. curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  12.  
  13. $output = curl_exec($ch);
  14. curl_close($ch);
  15.  
  16. return $output;
  17. }
  18. echo curl_download($url);
  19. ?>

Cały czas nie pozwala czytać tej strony, ale w cookie.txt mam coś takiego (nie wiem co to znaczy :X):
Kod
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

.leagueoflegends.com    TRUE    /    FALSE    1577145000    __cfduid    d67bc2ab035f6fa45669618cc7e50b0891385209535263



Co do IP - przykładowo: prod.eu.lol.riotgames.com (jeśli chcesz dokładne IP, to puść pinga na ten adres, ale pakietów i tak nie odbiera :/), port:2099. I to jest TCP jak coś.
Popek231
hmm.. aktualnie nie sprawdzę tego IP na stronie, bo zlagowana jest cała przez ugu.pl :/

czytałem przedtem, że sock nie działa na darmowych hostingach, ponieważ go blokują..
jeśli taki masz, chyba nie masz szans na to, że działaś przez sock będzie;)
Akiro
Sockety są włączone, sprawdzałem w phpinfo.
Popek231
  1. <?
  2. $this->timeout = 3;
  3. $host = '';
  4. $port = '';
  5. if(!$socket = @stream_socket_client('tcp://'.$host.':'.$port, $errno, $errstr, $this->timeout)) {
  6. //Server is offline
  7. return false;
  8. echo 'Offline :(';
  9. } else {
  10. echo 'Online :)';
  11. }
  12. ?>


hmm.. sprawdź ten smile.gif
Akiro
Takie coś się wyświetla:
Kod
Fatal error: Using $this when not in object context in /home/a2292042/public_html/loltest.php on line 2
com
Jeden mądrzejszy od drugiego jeśli chcesz sprawdzić czy serwer działa to sprawdź nagłówki:
http://us3.php.net/get_headers

  1. $file = 'serwer.pl/index.php';
  2. $file_headers = @get_headers($file);
  3. if($file_headers[0] == 'HTTP/1.1 404 Not Found')
  4. echo 'offline';
  5. else
  6. echo 'online';
  7.  
Popek231
działa, tak?wink.gif

pozdrawiam, Piotrek smile.gif
Akiro
Nie wiem czy działa, bo nie bardzo mam jak sprawdzić. Teraz pokazuje status Online, ale nie wiem co by się stało, gdyby któryś z serwerów padł, bo jak na razie cały czas działają. Ale nie do końca rozumiem co ta funkcja "get_headers" robi? Ona próbuje odczytać nagłówki z danej strony, jeśli ta strona odpowiada? Jeśli tak, to skrypt nie będzie działał, bo linki do launchera:
http://ll.leagueoflegends.com/pages/launcher/euw
są aktualizowane cały czas i nawet kiedy serwer padnie, to strona będzie się wciąż wyświetlała, a jedynie zmieni się fragment w tym kodzie. Natomiast ip:
prod.eu.lol.riotgames.com tą funkcją nie sprawdzę :/
Akiro
A przeczytałeś chociaż ten temat? Żaden z tych sposobów nie działa. Pisałem już wcześniej, że pingowanie login servera nic nie daje, bo cały czas lecą timeouty. Serwer jest pewnie chroniony jakimś firewallem, ale najłatwiej jest nie przeczytać całego tematu, podać kilka pierwszych linków z Google i zapytać czy to takie proste. Jakby to było takie proste, to już dawno bym sobie z tym poradził, a wiem, że na pewno jest jakiś sposób, bo są aplikacje na telefon wyświetlające status tych serwerów oraz strony, które także wyświetlają te statusy poprawnie.
Popek231
hmm... jeśli chcesz, to możesz spytać się techników takich stron, jak to zrobić, powinni pomóc wink.gif
jak nie, to przynajmniej nakierują Ciebie jak to zrobić;p
com
lecą timeouty bo taki adres wgl nie istnieje, jakby się sprawdziło to by się wiedziało.. Jasne można pinga wyłączyć, no ale to nie zmienia faktu że wywołanie prod.eu.lol.riotgames.com zwróci informacje ze czegoś takiego nie ma...

#edit ok znalazłem że to leci po porcie 2099 a ping normalny po porcie 80 dlatego nie dostaje odpowiedzi, bo na 80 nic nie ma...

http://backdrift.org/how-to-ping-a-tcp-port
http://www.letmecheck.it/tcp-ping.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.