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

CSgoServers.ru - Мониторинг CS серверов
Сообщение
Автор
Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 183
Зарегистрирован: 23.10.2008
Откуда: λ-Core
Благодарил (а): 1 раз
Поблагодарили: 2 раза
Контактная информация:

#1 Сообщение 21.06.2010, 09: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
Капитан
Капитан
Сообщения: 411
Зарегистрирован: 01.01.2010
Благодарил (а): 46 раз
Поблагодарили: 13 раз
Контактная информация:

#2 Сообщение 05.08.2010, 19:43

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

WebMaster
Нович0к
Нович0к
Сообщения: 3
Зарегистрирован: 26.01.2007
Контактная информация:

#3 Сообщение 22.10.2010, 16:22

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

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 183
Зарегистрирован: 23.10.2008
Откуда: λ-Core
Благодарил (а): 1 раз
Поблагодарили: 2 раза
Контактная информация:

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

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

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

#5 Сообщение 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 КБ) 484 скачивания
Monitor.rar
Server Monitor php
(13.28 КБ) 484 скачивания
Последний раз редактировалось anaksimandr 31.01.2011, 21:38, всего редактировалось 4 раза.

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 724
Зарегистрирован: 06.08.2008
Откуда: Одесса
Благодарил (а): 1 раз
Поблагодарили: 1 раз

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

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

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

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

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

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 724
Зарегистрирован: 06.08.2008
Откуда: Одесса
Благодарил (а): 1 раз
Поблагодарили: 1 раз

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

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

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

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

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

Аватара пользователя
pinkpiton2
Майор
Майор
Сообщения: 724
Зарегистрирован: 06.08.2008
Откуда: Одесса
Благодарил (а): 1 раз
Поблагодарили: 1 раз

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

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

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

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 183
Зарегистрирован: 23.10.2008
Откуда: λ-Core
Благодарил (а): 1 раз
Поблагодарили: 2 раза
Контактная информация:

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

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

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

Аватара пользователя
Morpheus
Маппер
Маппер
Сообщения: 183
Зарегистрирован: 23.10.2008
Откуда: λ-Core
Благодарил (а): 1 раз
Поблагодарили: 2 раза
Контактная информация:

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

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

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

#13 Сообщение 29.11.2011, 09:19

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

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

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

Ответить Вложения 1