SAMP Spieler Liste via PHP?

  • Hallo Leute,


    für eine kleine Serverliste suche ich ein funktionierendes PHP Skript, mit welchem ich die Spieleranzahl eines Servers ausgeben kann. Bisher habe ich folgende Skripts gefunden, die aber alle nicht funktioniert haben:


    http://forum.sa-mp.com/showthread.php?t=99649
    Samp-Php
    http://www.em-creations.co.uk/?p=214


    Über Hilfe wäre ich sehr dankbar :) Gerne auch Denkanstöße zur eigenen Realisierung eines solchen Skripts.

  • Was H4rd_B4se bei Samp-Php geschrieben hat, ist sehr gut und benutze es selber.



    Hier habe ich eine die nur Alle 100 Sekunden Updates zulässt, wegen den Square7 maximal 1000 Socket zugriffen am Tag.
    http://panet.square7.ch/indev/ssv.php


    Gruß, Piet

  • Okay, danke dir :) Dann werde ich nochmal ein bisschen damit rumbasteln :)


    EDIT: Okay, was immer ich mache, es wird mir angezeigt, dass der Server offline ist. (Serverdaten im Code sind einfach von einem Random Server aus der Serverliste). Vielleicht hast du ja eine andere queryAPI.php Datei? @Piet_Meier Könntest du mir deine mal schicken?


    PHP
    <?phprequire('queryAPI.php');$ServerIP = "5.9.10.202";//ServerIP eintragen$ServerPort = "7777";//ServerPort eintragen$samp = new SampQueryAPI($ServerIP, $ServerPort);$gInfo = array();$gPlayer = 0;if($samp->isOnline()){    $gInfo = $samp->getInfo();    $gPlayer = count($samp->getBasicPlayers());    $Hostnamestr = $gInfo['hostname'];    $Onlinestr = 'Online';}else{    $Hostnamestr = "Unknown";    $Onlinestr = 'Offline';    $gPlayer = 0;}echo $Onlinestr;$samp->__destruct();?>

    PHP
    <?php$serverip = "5.9.10.202";//ServerIP eintragen$serverport = "7777";//ServerPort eintragenrequire "inc/SampQueryAPI.php";//Hier die Datei includen$query23 = new SampQueryAPI($serverip, $serverport);$aInformation = $query23->getInfo();if($query23->isOnline()){    echo "<b><a href='samp://".$serverip.":".$serverport."'>Der SAMP Server ist <font color='#009933'>Online</font><br /> Es sind ".$spieleron = $aInformation['players']." / ".$aInformation['maxplayers']." Spieler online</a></b>"; } else {    echo "Der SAMP Server ist <font color='#990000'>Offline </font></b>";}?>

    <3

    Einmal editiert, zuletzt von Longibotti ()

  • Also ich würde mir einfach mal nur den Wert von $samp->isOnline ausgeben lassen.
    Wenn der schon nicht passt, dann liegt das Problem an dieser Abfrage. Ich gehe einfach mal davon aus, das isOnline in der Query API definiert ist.

  • Ich habe ja einen Post weiter oben bereits geschrieben, wie du dieses Problem vielleicht lösen kannst.


    EDIT: Mal ganz blöd gefragt, die queryAPI.php heißt bei dir auch genau so, liegt im selben Ordner und hat mindestens chmod 0644 ?


    Noch ein EDIT: Ich habe alles so wie du es oben hast mit der von mir empfohlenen Änderung bei mir aufn Server geladen und bekomme "Online" ausgegeben...


    2 Mal editiert, zuletzt von serecords ()

  • Noch ein EDIT: Ich habe alles so wie du es oben hast mit der von mir empfohlenen Änderung bei mir aufn Server geladen und bekomme "Online" ausgegeben...



    Hast du das gelesen?

  • Ich verstehe nicht, wieso das bei mir nicht klappen will.


    List.php

    PHP
    <?phprequire('queryAPI.php');$ServerIP = "5.9.10.202";//ServerIP eintragen$ServerPort = "7777";//ServerPort eintragen$samp = new SampQueryAPI($ServerIP, $ServerPort);$gInfo = array();$gPlayer = 0;if($samp->isOnline() == true){    $gInfo = $samp->getInfo();    $gPlayer = count($samp->getBasicPlayers());    $Hostnamestr = $gInfo['hostname'];    $Onlinestr = 'Online';}else{    $Hostnamestr = "Unknown";    $Onlinestr = 'Offline';    $gPlayer = 0;}echo $Onlinestr;$samp->__destruct();?>



    queryAPI.php

    PHP
    <?php/** *      This API connects directly to the server, without any need for any *      middlemen connections. *      Your server must have fsockopen enabled in order to access the *      functions that have been made available from this. * *      @package sampAPI *      @version 1.2 *      @author David Weston <westie@typefish.co.uk> *      @copyright 2010; http://www.typefish.co.uk/licences/ */  class SampQueryAPI{        /**         *      @ignore         */        private $rSocket = false;        /**         *      @ignore         */        private $aServer = array();        /**         *      Creation of the server class.         *         *      @param string $sServer Server IP, or hostname.         *      @param integer $iPort Server port         */        public function __construct($sServer, $iPort = 7777)        {                /* Fill some arrays. */                $this->aServer[0] = $sServer;                $this->aServer[1] = $iPort;                /* Start the connection. */                    $this->rSocket = fsockopen('udp://'.$this->aServer[0], $this->aServer[1], $iError, $sError, 2);                if(!$this->rSocket)                {                        $this->aServer[4] = false;                        return;                }                socket_set_timeout($this->rSocket, 2);                $sPacket = 'SAMP';                $sPacket .= chr(strtok($this->aServer[0], '.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr($this->aServer[1] & 0xFF);                $sPacket .= chr($this->aServer[1] >> 8 & 0xFF);                $sPacket .= 'p4150';                fwrite($this->rSocket, $sPacket);                if(fread($this->rSocket, 10))                {                        if(fread($this->rSocket, 5) == 'p4150')                        {                                $this->aServer[4] = true;                                return;                        }                }                $this->aServer[4] = false;        }        /**         *      @ignore         */        public function __destruct()        {                @fclose($this->rSocket);        }        /**         *      Used to tell if the server is ready to accept queries.         *         *      If false is returned, then it is suggested that you remove the         *      class from active use, so that you can reload the class if needs         *      be.         *         *      @return bool true if success, false if failure.         */        public function isOnline()        {                return isset($this->aServer[4]) ? $this->aServer[4] : false;        }        /**         *      This function is used to get the server information.         *         *      <code>         *      Array         *      (         *              [password] => 0         *              [players] => 9         *              [maxplayers] => 500         *              [hostname] => Everystuff Tr3s [MAD]oshi (03a Final) [FIXED]         *              [gamemode] => Stunt/Race/DM/FR Everystuff         *              [mapname] => Everystuff         *      )         *      </code>         *         *      @return array Array of server information.         */        public function getInfo()        {                @fwrite($this->rSocket, $this->createPacket('i'));                fread($this->rSocket, 11);                $aDetails['password'] = (integer) ord(fread($this->rSocket, 1));                $aDetails['players'] = (integer) $this->toInteger(fread($this->rSocket, 2));                $aDetails['maxplayers'] = (integer) $this->toInteger(fread($this->rSocket, 2));                $iStrlen = ord(fread($this->rSocket, 4));                if(!$iStrlen) return -1;                $aDetails['hostname'] = (string) fread($this->rSocket, $iStrlen);                $iStrlen = ord(fread($this->rSocket, 4));                $aDetails['gamemode'] = (string) fread($this->rSocket, $iStrlen);                $iStrlen = ord(fread($this->rSocket, 4));                $aDetails['mapname'] = (string) fread($this->rSocket, $iStrlen);                return $aDetails;        }        /**         *      This function gets a basic list of all the players on the server.         *         *      Note as of 0.3.0, the amount of players that can be retrieved is         *      limited to 100. This means if there are more players than 100,         *      then no data will be returned, and it will be a blank array.         *         *      <code>         *      Array         *      (         *              [0] => Array         *                      (         *                              [nickname] => K1nNngO         *                              [score] => 72         *                      )         *                      *              [1] => Array         *                      (         *                              [nickname] => [kikOo]         *                              [score] => 150         *                      )         *         *              [and so on...]         *      )         *      </code>         *         *      @return array Array of player information.         */        public function getBasicPlayers()        {                @fwrite($this->rSocket, $this->createPacket('c'));                fread($this->rSocket, 11);                $iPlayerCount = ord(fread($this->rSocket, 2));                $aDetails = array();                if($iPlayerCount > 0)                {                        for($iIndex = 0; $iIndex < $iPlayerCount; ++$iIndex)                        {                                $iStrlen = ord(fread($this->rSocket, 1));                                $aDetails[] = array                                (                                        "nickname" => (string) fread($this->rSocket, $iStrlen),                                        "score" => (integer) $this->toInteger(fread($this->rSocket, 4)),                                );                        }                }                return $aDetails;        }        /**         *      This function gets a detailed list of all the players on the server.         *         *      Note as of 0.3.0, the amount of players that can be retrieved is         *      limited to 100. This means if there are more players than 100,         *      then no data will be returned, and it will be a blank array.         *         *      <code>         *      Array         *      (         *              [0] => Array         *                      (         *                              [playerid] => 0         *                              [nickname] => K1nNngO         *                              [score] => 72         *                              [ping] => 195         *                      )         *              *              [1] => Array         *                      (         *                              [playerid] => 1         *                              [nickname] => [kikOo]         *                              [score] => 150         *                              [ping] => 375         *                      )         *         *              [and so on...]         *      )         *      </code>         *         *      @return array Array of player information.         */        public function getDetailedPlayers()        {                @fwrite($this->rSocket, $this->createPacket('d'));                fread($this->rSocket, 11);                $iPlayerCount = ord(fread($this->rSocket, 2));                $aDetails = array();                for($iIndex = 0; $iIndex < $iPlayerCount; ++$iIndex)                {                        $aPlayer['playerid'] = (integer) ord(fread($this->rSocket, 1));                        $iStrlen = ord(fread($this->rSocket, 1));                        $aPlayer['nickname'] = (string) fread($this->rSocket, $iStrlen);                        $aPlayer['score'] = (integer) $this->toInteger(fread($this->rSocket, 4));                        $aPlayer['ping'] = (integer) $this->toInteger(fread($this->rSocket, 4));                        $aDetails[] = $aPlayer;                        unset($aPlayer);                }                return $aDetails;        }        /**         *      This function gets all the server rules from the server.         *         *      Rules in this context are not player rules, they are client rules,         *      like the weather of the server, time, and so on. (Custom rules,         *      when supported by a SA-MP plugin, will be included here.)         *         *      <code>         *      Array         *      (         *              [gravity] => 0.007900         *              [mapname] => Everystuff         *              [version] => 0.3a         *              [weather] => 0         *              [weburl] => samp.madoshi.net         *              [worldtime] => 12:00         *      )         *      </code>         *         *      @return array Array of server rules.         */        public function getRules()        {                @fwrite($this->rSocket, $this->createPacket('r'));                fread($this->rSocket, 11);                $iRuleCount = ord(fread($this->rSocket, 2));                $aReturn = array();                for($iIndex = 0; $iIndex < $iRuleCount; ++$iIndex)                {                        $iStrlen = ord(fread($this->rSocket, 1));                        $sRulename = (string) fread($this->rSocket, $iStrlen);                        $iStrlen = ord(fread($this->rSocket, 1));                        $aDetails[$sRulename] = (string) fread($this->rSocket, $iStrlen);                }                return $aDetails;        }        /**         *      @ignore         */        private function toInteger($sData)        {                if($sData === "")                {                        return null;                }                $iInteger = 0;                $iInteger += (ord($sData[0]));                 if(isset($sData[1]))                {                        $iInteger += (ord($sData[1]) << 8);                }                if(isset($sData[2]))                {                        $iInteger += (ord($sData[2]) << 16);                }                if(isset($sData[3]))                {                        $iInteger += (ord($sData[3]) << 24);                }                if($iInteger >= 4294967294)                {                        $iInteger -= 4294967296;                }                return $iInteger;        }        /**         *      @ignore         */        private function createPacket($sPayload)        {                $sPacket = 'SAMP';                $sPacket .= chr(strtok($this->aServer[0], '.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr(strtok('.'));                $sPacket .= chr($this->aServer[1] & 0xFF);                $sPacket .= chr($this->aServer[1] >> 8 & 0xFF);                $sPacket .= $sPayload;                return $sPacket;        }}

  • Ich habe nochmal beide Dateien mit dem Inhalt erstellt, den du gerade eben gepostet hast.
    Es funktioniert einfach...


    Du kannst mir aber gern mal teamviewer daten per PN schicken wenn du möchtest.


    EDIT
    Problem ist nun geklärt, der Server hat udp Verbindungen, auf denen die Query ja aufbaut, blockiert.

    Einmal editiert, zuletzt von serecords ()