[PHP] Скрипт сбора информации с Source/GoldSrc серверов

My-CS.ru - Мониторинг CS серверов
Ответить
Сообщение
Автор
Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 209
Зарегистрирован: 23.10.2008
Откуда: λ-Core

[PHP] Скрипт сбора информации с Source/GoldSrc серверов

#1 Сообщение Morpheus » 21.06.2010, 08:27

Небольшой скрипт на php, содержащий функции для получения информации о Source/GoldSrc серверах.
Код

Код: Выделить всё

<?
  // Simple Source/GoldSRC server info collector by morpheus
  function cutchar(&$string)
  {
    $char = substr($string, 0, 1);
    $string = substr($string, 1);
    return $char;
  }
  function cutbyte(&$string)
  {
    $byte = ord(substr($string, 0, 1));
    $string = substr($string, 1);
    return $byte;
  }
  function cutstring(&$string)
  {
    $str = substr($string, 0, StrPos($string, chr(0)));
    $string = substr($string, StrPos($string, chr(0))+1);
    return $str;
  }
  function cutshort(&$string)
  {
    $short = substr($string, 0, 2);
    list(,$short) = @unpack("S", $short);
    $string = substr($string, 2);
    return $short;
  }
  function cutlong(&$string)
  {
    $long = substr($string, 0, 4);
    list(,$long) = @unpack("l", $long);
    $string = substr($string, 4);
    return $long;
  }
  function pastelong($long)
  {
    return pack("l", $long);
  }
  function cutfloat(&$string)
  {
    $float = substr($string, 0, 4);
    list(,$float) = @unpack("f", $float);
    $string = substr($string, 4);
    return $float;
  }
  function request($request,$host,$port)
  {
    $request = "\xFF\xFF\xFF\xFF".$request."\x00";
    $fp = @fsockopen('udp://'.$host, $port);
    if (!$fp) return false;
    @fwrite($fp, $request);
    socket_set_timeout($fp, 1);
    $string=fread($fp, 10240);
    @fclose($fp);
    return $string;
  }

  function A2A_PING($host, $port) {
    $st = request("\x69",$host,$port);
    if (!$st) return false;
    $st = substr($st, 4);
    if (substr($st, 0, 1) != "\x6A") return false; else return true;
  }
  function A2S_INFO($host, $port) {
    $st = request("\x54Source Engine Query",$host,$port);
    if (!$st) return false;
    $st = substr($st, 4);
    if (substr($st, 0, 1) == "\x49") {
      $result['Type'] = cutchar($st); // Char: 'I' (0x49) - For Source 
      $result['Version'] = cutbyte($st); // Byte: Network version
      $result['Server Name'] = cutstring($st); // String: The server's name, eg: "Recoil NZ CS Server #1"
      $result['Map'] = cutstring($st); // String: The current map being played, eg: "de_dust"
      $result['Game Directory'] = cutstring($st); // String: The name of the folder containing the game files, eg: "cstrike"
      $result['Game Description'] = cutstring($st); // String: A friendly string name for the game type, eg: "Counter Strike: Source"
      $result['AppID'] = cutshort($st); // Short: Steam Application ID
      $result['Number of players'] = cutbyte($st); // Byte: The number of players currently on the server
      $result['Maximum players'] = cutbyte($st); // Byte: Maximum allowed players for the server
      $result['Number of bots'] = cutbyte($st); // Byte: Number of bot players currently on the server
      $result['Dedicated'] = cutchar($st); // Char: 'l' for listen, 'd' for dedicated, 'p' for SourceTV
      $result['OS'] = cutchar($st); // Char: Host operating system. 'l' for Linux, 'w' for Windows
      $result['Password'] = cutbyte($st); // Byte: If set to 0x01, a password is required to join this server
      $result['Secure'] = cutbyte($st); // Byte: if set to 0x01, this server is VAC secured
      $result['Game Version'] = cutstring($st); // String: The version of the game, eg: "1.0.0.14"
    } elseif (substr($st, 0, 1) == "\x6D") {
      $result['Type'] = cutchar($st); // Char: 'm' (0x6D) - For GoldSrc
      $result['Game IP'] = cutstring($st); // String: Game Server IP address and port
      $result['Server Name'] = cutstring($st); // String: The server's name, eg: "Recoil NZ CS Server #1"
      $result['Map'] = cutstring($st); // String: The current map being played, eg: "de_dust"
      $result['Game Directory'] = cutstring($st); // String: The name of the folder containing the game files, eg: "cstrike"
      $result['Game Description'] = cutstring($st); // String: A friendly string name for the game type, eg: "Counter  Strike: Source"
      $result['Number of players'] = cutbyte($st); // Byte: The number of players currently on the server
      $result['Maximum players'] = cutbyte($st); // Byte: Maximum allowed players for the server
      $result['Version'] = cutbyte($st); // Byte: Network version
      $result['Dedicated'] = cutchar($st); // Char: 'l' for listen, 'd' for dedicated, 'p' for SourceTV
      $result['OS'] = cutchar($st); // Char: Host operating system. 'l' for Linux, 'w' for Windows
      $result['Password'] = cutbyte($st); // Byte: If set to 0x01, a password is required to join this server
      $result['IsMod'] = cutbyte($st); // Byte: If set to 0x01, this byte is followed by ModInfo
      $result['Secure'] = cutbyte($st); // Byte: if set to 0x01, this server is VAC secured
      $result['Number of bots'] = cutbyte($st); // Byte: Number of bot players currently on the server
      if ($result['IsMod'] == 1) {
        $result['URLInfo'] = cutstring($st); // String: URL containing information about this mod
        $result['URLDL'] = cutstring($st); // String: URL to download this mod
        $result['Nul'] = cutbyte($st); // Byte: 0x00
        $result['ModVersion'] = cutlong($st); // Long: Version of the installed mod
        $result['ModSize'] = cutlong($st); // Long: The download size of this mod
        $result['SvOnly'] = cutbyte($st); // Byte: If 1 this is a server side only mod
        $result['ClDLL'] = cutbyte($st); // Byte: If 1 this mod has a custom client dll
      }
    } else return false;
    return $result;
  }
  function A2S_SERVERQUERY_GETCHALLENGE($host, $port) {
    $st = request("\x57",$host,$port);
    if (!$st) return false;
    $st = substr($st, 4);
    if (substr($st, 0, 1) != "\x41") return false; else return cutlong(substr($st, 1));
  }
  function A2S_RULES($host, $port, $challenge) {
    $st = request("\x56".pastelong($challenge),$host,$port);
    if (!$st) return false;
    $st=substr($st, 4);
    if (substr($st, 0, 1) == "\x41") {
      $challenge = cutlong(substr($st, 1));
      $st = request("\x56".pastelong($challenge),$host,$port);
      if (!$st) return false;
      $st = substr($st, 4);
    }
    if (substr($st, 0, 1) != "\x45") return false;
    $result['Type'] = cutchar($st); // Char: Should be equal to 'E'
    $result['Num Rules'] = cutshort($st); // Short: The number of rules reported in response
    for ($i = 1; $i <= $result['Num Rules']; $i++) {
      $result['Rule Name'][$i] = cutstring($st); // String: The name of the rule
      $result['Rule Value'][$i] = cutstring($st); // String: The rule's value
    }
    return $result;
  }

  function A2S_PLAYER($host, $port, $challenge) {
    $st = request("\x55".pastelong($challenge),$host,$port);
    if (!$st) return false;
    $st = substr($st, 4);
    if (substr($st, 0, 1) == "\x41") {
      $challenge = cutlong(substr($st, 1));
      $st = request("\x55".pastelong($challenge),$host,$port);
      if (!$st) return false;
      $st = substr($st, 4);
    }
    if (substr($st, 0, 1) != "\x44") return false;
    $result['Type'] = cutchar($st); // Char: Should be equal to 'D'
    $result['Num Players'] = cutbyte($st); // Byte: The number of players reported in response
    for ($i = 1; $i <= $result['Num Players']; $i++) {
      $result['Index'][$i] = cutbyte($st); // Byte: The index into [0.. Num Players] for this entry
      $result['Player Name'][$i] = cutstring($st); // String: Player's name
      $result['Kills'][$i] = cutlong($st); // Long: Number of kills this player has
      $result['Time connected'][$i] = cutfloat($st); // Float: The time in seconds this player has been connected
    }
    return $result;
  }
	/*print("\n");
	print_r(A2S_INFO("109.169.60.13",27015));
	print_r(A2S_RULES("109.169.60.13",27015,A2S_SERVERQUERY_GETCHALLENGE("109.169.60.13",27015)));
	print_r(A2S_PLAYER("109.169.60.13",27015,A2S_SERVERQUERY_GETCHALLENGE("109.169.60.13",27015)));*/

?>
Последний раз редактировалось Morpheus 19.02.2011, 14:34, всего редактировалось 4 раза.
Когда-то здесь были самодельные карточки достижений, но они канули в лету месте с другими файлами с хостинга. Надеюсь что еще черезпару леьт вернусь сюда и восстановлю их. :)
ИзображениеИзображениеИзображениеИзображение
Изображение

Аватара пользователя
cradis
Капитан
Капитан
Сообщения: 419
Зарегистрирован: 01.01.2010

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#2 Сообщение cradis » 05.08.2010, 18:43

Спасибо, очень долго искал подобную инфу.
Последний раз редактировалось cradis 05.08.2010, 22:24, всего редактировалось 2 раза.

WebMaster
Нович0к
Нович0к
Сообщения: 15
Зарегистрирован: 26.01.2007

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#3 Сообщение WebMaster » 22.10.2010, 15:22

Morpheus, в коде используется функция pastelong, но объявления ее нет!
Fatal error: Call to undefined function pastelong()

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 209
Зарегистрирован: 23.10.2008
Откуда: λ-Core

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#4 Сообщение Morpheus » 21.12.2010, 17:15

Ууух... Уже и не помню как это все работало, но похоже нужно заменить pastelong($challenge) на $challenge
тема - ужас некроманта... Трижды умершая и трижды воскрешенная
Последний раз редактировалось Morpheus 21.12.2010, 17:17, всего редактировалось 1 раз.
Когда-то здесь были самодельные карточки достижений, но они канули в лету месте с другими файлами с хостинга. Надеюсь что еще черезпару леьт вернусь сюда и восстановлю их. :)
ИзображениеИзображениеИзображениеИзображение
Изображение

anaksimandr
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 23.11.2008

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#5 Сообщение anaksimandr » 31.01.2011, 20:38

На основе данного скрипта накидал обвязочку для source (если кто считает ее кривой - не обязательно мне об этом говорить), может кому пригодится.
Изображение
Пользовать так (если кто не знает):

Код: Выделить всё

<?PHP
Include("monitor_lib.php");
Include("monitor.php");
?>
ип сервера вписывать в monitor.php

Теперь, собственно, вопрос: дайте функции для получения списка игроков и правил сервера =)) Рабочих не обнаружено, оф страничку читал.
Про гугл знаю, да.

Спасибо.

ПС в архиве нет картинки JimmyPop.gif ибо большая =) она вместо none.png, когда нет картинки для краты.
Вложения
Monitor.rar
Server Monitor php
(13.28 КБ) 427 скачиваний
Последний раз редактировалось anaksimandr 31.01.2011, 21:38, всего редактировалось 4 раза.

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 725
Зарегистрирован: 05.08.2008
Откуда: Одесса
Контактная информация:

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#6 Сообщение pinkpiton2 » 31.01.2011, 21:18

anaksimandr писал(а): Теперь, собственно, вопрос: дайте функции для получения списка игроков и правил сервера =)) Рабочих не обнаружено, оф страничку читал.
Про гугл знаю, да.
это и это читал?
чтение инструкции - 5$/строка.
чтение инструкции с выражением - 25$/строка.
чтение инструкции с пошаговым выполнением - прямо пропорционально тупости заказчика, но не менее 500$.

anaksimandr
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 23.11.2008

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#7 Сообщение anaksimandr » 31.01.2011, 21:36

оф страничку читал.
Читал.

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 725
Зарегистрирован: 05.08.2008
Откуда: Одесса
Контактная информация:

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#8 Сообщение pinkpiton2 » 01.02.2011, 04:34

anaksimandr писал(а):
оф страничку читал.
Читал.
тогда должен был видеть функционал на разных языках программирования и пхп в том числе
чтение инструкции - 5$/строка.
чтение инструкции с выражением - 25$/строка.
чтение инструкции с пошаговым выполнением - прямо пропорционально тупости заказчика, но не менее 500$.

anaksimandr
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 23.11.2008

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#9 Сообщение anaksimandr » 01.02.2011, 18:37

Только умничать что-ли умеем? стим консидер как бы качал, у меня эта тонна запутанного кода не работает.

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 725
Зарегистрирован: 05.08.2008
Откуда: Одесса
Контактная информация:

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#10 Сообщение pinkpiton2 » 01.02.2011, 21:50

anaksimandr писал(а):Только умничать что-ли умеем? стим консидер как бы качал, у меня эта тонна запутанного кода не работает.
тебе нужно готовое решение или код, который можно использовать???
не нравится консайдер, разбери lgsl он точно у тебя заработает
и там точно есть функционал по выниманию списка пользователей (но может не оказатся вынимания правил)

мне пару лет назад вполне хватило описания протокола на вики чтобы на С накропать консольную утилитку для опроса серверов
чтение инструкции - 5$/строка.
чтение инструкции с выражением - 25$/строка.
чтение инструкции с пошаговым выполнением - прямо пропорционально тупости заказчика, но не менее 500$.

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 209
Зарегистрирован: 23.10.2008
Откуда: λ-Core

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#11 Сообщение Morpheus » 19.02.2011, 14:31

Код: Выделить всё

  function A2S_PLAYER($host, $port, $challenge) {
Добавлено спустя 18 минут 3 секунды:
Исправил код, теперь он на 100% работает.
Когда-то здесь были самодельные карточки достижений, но они канули в лету месте с другими файлами с хостинга. Надеюсь что еще черезпару леьт вернусь сюда и восстановлю их. :)
ИзображениеИзображениеИзображениеИзображение
Изображение

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 209
Зарегистрирован: 23.10.2008
Откуда: λ-Core

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#12 Сообщение Morpheus » 20.02.2011, 17:42

Просьба перенести данную тему в раздел Developers Forum, так как планирую портировать это на некоторые другие языки.
Когда-то здесь были самодельные карточки достижений, но они канули в лету месте с другими файлами с хостинга. Надеюсь что еще черезпару леьт вернусь сюда и восстановлю их. :)
ИзображениеИзображениеИзображениеИзображение
Изображение

Аватара пользователя
net-master
Капитан
Капитан
Сообщения: 452
Зарегистрирован: 07.11.2009

Re: [PHP] Скрипт сбора информации с Source/GoldSrc серверов

#13 Сообщение net-master » 29.11.2011, 08:19

Подскажите как из функции

Код: Выделить всё

function A2S_PLAYER($serverip, $port, $challenge)
вывести список игроков на сервере.

Ответить