zefie

Working Deepbot PHP Class

Sep 10th, 2016
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.83 KB | None | 0 0
  1. <?php
  2. class Deepbot {
  3.     private $_apikey;
  4.     private $_host;
  5.     private $_port;
  6.     private $_socket;
  7.     private $_ssl;
  8.     public $response;
  9.     private $_connected = false;
  10.  
  11.     public function __construct($host, $apikey, $port = 3337,$ssl = true) {
  12.         $this->_host = $host;
  13.         $this->_apikey = $apikey;
  14.         $this->_port = $port;
  15.         $this->_ssl = $ssl;
  16.     }
  17.    
  18.     public function __destruct()
  19.     {
  20.         $this->disconnect();
  21.     }
  22.    
  23.     public function connect($i = 0)
  24.     {      
  25.         $maxtries =  3;
  26.         $key = base64_encode($this->_generateRandomString(16, false, true));               
  27.         $header = "GET /api/ HTTP/1.1\r\n";
  28.         $header.= "Host: ".$this->_host.":".$this->_port."\r\n";
  29.         $header.= "Upgrade: websocket\r\n";
  30.         $header.= "Connection: Upgrade\r\n";
  31.         $header.= "Sec-WebSocket-Key: " . $key . "\r\n";
  32.         $header.= "Sec-WebSocket-Version: 13\r\n\r\n";         
  33.        
  34.         $ssl = '';
  35.         if ($this->_ssl) {
  36.             $ssl = 'tls://';
  37.         }
  38.         $this->_socket = fsockopen($ssl.$this->_host, $this->_port, $errno, $errstr, 1);
  39.         socket_set_timeout($this->_socket, 0, 250000);
  40.         @fwrite($this->_socket, $header);
  41.         $response = stream_get_line($this->_socket,512,"\r\n\r\n");
  42.         preg_match('#Sec-WebSocket-Accept:\s(.*)$#mU', $response, $matches);
  43.         if ($matches) {
  44.             $keyAccept = trim($matches[1]);
  45.             $expectedResonse = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));         
  46.             $this->_connected = ($keyAccept === $expectedResonse) ? true : false;  
  47.         }
  48.         if ($this->_connected == false) {
  49.             $this->disconnect();
  50.             $i++;
  51.             if ($i < $maxtries) {
  52.                 return $this->connect($i);
  53.             }
  54.             return false;
  55.         }
  56.         return true;
  57.     }
  58.    
  59.     public function authenticate() {
  60.         if ($this->_connected) {
  61.             $this->_sendData("api|register|".$this->_apikey);
  62.             $json = json_decode($this->response);
  63.             if ($json->msg == "success") {
  64.                 return true;
  65.             }
  66.         }
  67.         return false;
  68.     }
  69.    
  70.     public function addPoints($user,$points) {
  71.         if ($this->_connected) {
  72.             $this->_sendData("api|add_points|".$user."|".$points);
  73.             $json = json_decode($this->response);
  74.             if ($json->msg == "success") {
  75.                 return true;
  76.             }
  77.         }
  78.         return false;
  79.     }
  80.  
  81.     public function removePoints($user,$points) {
  82.         if ($this->_connected) {
  83.             $this->_sendData("api|del_points|".$user."|".$points."|1");
  84.             $json = json_decode($this->response);
  85.             if ($json->msg == "success") {
  86.                 return true;
  87.             }
  88.         }
  89.         return false;
  90.     }  
  91.    
  92.     public function setPoints($user,$points) {
  93.         if ($this->_connected) {
  94.             $this->_sendData("api|set_points|".$user."|".$points);
  95.             $json = json_decode($this->response);
  96.             if ($json->msg == "success") {
  97.                 return true;
  98.             }
  99.         }          
  100.         return false;
  101.     }      
  102.  
  103.     public function getPoints($user) {
  104.         if ($this->_connected) {
  105.             $this->_sendData("api|get_points|".$user);
  106.             $json = json_decode($this->response);
  107.             if (strpos($json->msg,".") >= 0) {
  108.                 return floatval($json->msg);
  109.             }
  110.         }
  111.         return false;
  112.     }  
  113.    
  114.     public function getHours($user) {
  115.         if ($this->_connected) {
  116.             $this->_sendData("api|get_hours|".$user);
  117.             $json = json_decode($this->response);
  118.             if (strpos($json->msg,".") > 0) {
  119.                 return floatval($json->msg);
  120.             }
  121.         }          
  122.         return false;
  123.     }      
  124.  
  125.     public function getUser($user) {
  126.         if ($this->_connected) {
  127.             $this->_sendData("api|get_user|".$user);
  128.             $json = json_decode($this->response);
  129.             if (is_object($json->msg)) {
  130.                 return $json->msg;
  131.             }
  132.         }          
  133.         return false;
  134.     }      
  135.  
  136.     public function getTopUsers($count = 5,$offset = 0) {
  137.         if ($this->_connected) {
  138.             $this->_sendData("api|get_top_users|".$offset."|".$count);
  139.             $json = json_decode($this->response);
  140.             if (is_array($json->msg)) {
  141.                 return $json->msg;
  142.             }
  143.         }          
  144.         return false;
  145.     }
  146.    
  147.     private function _checkConnection()
  148.     {
  149.         $this->_connected = false;
  150.        
  151.         // send ping:
  152.         $data = 'ping?';
  153.         @fwrite($this->_socket, $this->_hybi10Encode($data, 'ping', true));
  154.         $response = @fread($this->_socket, 300);
  155.         if(empty($response))
  156.         {          
  157.             return false;
  158.         }
  159.         $response = $this->_hybi10Decode($response);
  160.         if(!is_array($response))
  161.         {          
  162.             return false;
  163.         }
  164.         if(!isset($response['type']) || $response['type'] !== 'pong')
  165.         {          
  166.             return false;
  167.         }
  168.         $this->_connected = true;
  169.         return true;
  170.     }
  171.    
  172.     public function disconnect()
  173.     {
  174.         if ($this->_checkConnection) {
  175.             $this->_sendData("\x00","close");
  176.         }
  177.         $this->_connected = false;
  178.         is_resource($this->_socket) and fclose($this->_socket);
  179.     }
  180.  
  181.     private function _sendData($data, $type = 'text', $masked = true)
  182.     {
  183.         if($this->_connected === false)
  184.         {
  185.             trigger_error("Not connected", E_USER_WARNING);
  186.             return false;
  187.         }
  188.         if( !is_string($data)) {
  189.             trigger_error("Not a string data was given.", E_USER_WARNING);
  190.             return false;      
  191.         }
  192.         if (strlen($data) == 0)
  193.         {
  194.             return false;
  195.         }
  196.         $res = @fwrite($this->_socket, $this->_hybi10Encode($data, $type, $masked));       
  197.         if($res === 0 || $res === false)
  198.         {
  199.             return false;
  200.         }      
  201.         $output = stream_get_line($this->_socket,10240,"}")."}";
  202.         $start = strpos($output,"{");
  203.         $output = substr($output,$start,strlen($output) - $start);
  204.         $output = trim($output,"\r\n\x00");
  205.         $this->response = $output;
  206.         return true;
  207.     }
  208.        
  209.     private function _generateRandomString($length = 10, $addSpaces = true, $addNumbers = true)
  210.     {  
  211.         $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"ยง$%&/()=[]{}';
  212.         $useChars = array();
  213.         // select some random chars:    
  214.         for($i = 0; $i < $length; $i++)
  215.         {
  216.             $useChars[] = $characters[mt_rand(0, strlen($characters)-1)];
  217.         }
  218.         // add spaces and numbers:
  219.         if($addSpaces === true)
  220.         {
  221.             array_push($useChars, ' ', ' ', ' ', ' ', ' ', ' ');
  222.         }
  223.         if($addNumbers === true)
  224.         {
  225.             array_push($useChars, rand(0,9), rand(0,9), rand(0,9));
  226.         }
  227.         shuffle($useChars);
  228.         $randomString = trim(implode('', $useChars));
  229.         $randomString = substr($randomString, 0, $length);
  230.         return $randomString;
  231.     }
  232.    
  233.     private function _hybi10Encode($payload, $type = 'text', $masked = true)
  234.     {
  235.         $frameHead = array();
  236.         $frame = '';
  237.         $payloadLength = strlen($payload);
  238.        
  239.         switch($type)
  240.         {      
  241.             case 'text':
  242.                 // first byte indicates FIN, Text-Frame (10000001):
  243.                 $frameHead[0] = 129;               
  244.             break;         
  245.        
  246.             case 'close':
  247.                 // first byte indicates FIN, Close Frame(10001000):
  248.                 $frameHead[0] = 136;
  249.             break;
  250.        
  251.             case 'ping':
  252.                 // first byte indicates FIN, Ping frame (10001001):
  253.                 $frameHead[0] = 137;
  254.             break;
  255.        
  256.             case 'pong':
  257.                 // first byte indicates FIN, Pong frame (10001010):
  258.                 $frameHead[0] = 138;
  259.             break;
  260.         }
  261.        
  262.         // set mask and payload length (using 1, 3 or 9 bytes)
  263.         if($payloadLength > 65535)
  264.         {
  265.             $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
  266.             $frameHead[1] = ($masked === true) ? 255 : 127;
  267.             for($i = 0; $i < 8; $i++)
  268.             {
  269.                 $frameHead[$i+2] = bindec($payloadLengthBin[$i]);
  270.             }
  271.             // most significant bit MUST be 0 (close connection if frame too big)
  272.             if($frameHead[2] > 127)
  273.             {
  274.                 $this->close(1004);
  275.                 return false;
  276.             }
  277.         }
  278.         elseif($payloadLength > 125)
  279.         {
  280.             $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
  281.             $frameHead[1] = ($masked === true) ? 254 : 126;
  282.             $frameHead[2] = bindec($payloadLengthBin[0]);
  283.             $frameHead[3] = bindec($payloadLengthBin[1]);
  284.         }
  285.         else
  286.         {
  287.             $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
  288.         }
  289.         // convert frame-head to string:
  290.         foreach(array_keys($frameHead) as $i)
  291.         {
  292.             $frameHead[$i] = chr($frameHead[$i]);
  293.         }
  294.         if($masked === true)
  295.         {
  296.             // generate a random mask:
  297.             $mask = array();
  298.             for($i = 0; $i < 4; $i++)
  299.             {
  300.                 $mask[$i] = chr(rand(0, 255));
  301.             }
  302.            
  303.             $frameHead = array_merge($frameHead, $mask);           
  304.         }                      
  305.         $frame = implode('', $frameHead);
  306.         // append payload to frame:
  307.         $framePayload = array();   
  308.         for($i = 0; $i < $payloadLength; $i++)
  309.         {      
  310.             $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
  311.         }
  312.         return $frame;
  313.     }
  314.    
  315.     private function _hybi10Decode($data)
  316.     {
  317.         $payloadLength = '';
  318.         $mask = '';
  319.         $unmaskedPayload = '';
  320.         $decodedData = array();
  321.        
  322.         // estimate frame type:
  323.         $firstByteBinary = sprintf('%08b', ord($data[0]));     
  324.         $secondByteBinary = sprintf('%08b', ord($data[1]));
  325.         $opcode = bindec(substr($firstByteBinary, 4, 4));
  326.         $isMasked = ($secondByteBinary[0] == '1') ? true : false;
  327.         $payloadLength = ord($data[1]) & 127;      
  328.        
  329.         switch($opcode)
  330.         {
  331.             // text frame:
  332.             case 1:
  333.                 $decodedData['type'] = 'text';             
  334.             break;
  335.        
  336.             case 2:
  337.                 $decodedData['type'] = 'binary';
  338.             break;
  339.            
  340.             // connection close frame:
  341.             case 8:
  342.                 $decodedData['type'] = 'close';
  343.             break;
  344.            
  345.             // ping frame:
  346.             case 9:
  347.                 $decodedData['type'] = 'ping';             
  348.             break;
  349.            
  350.             // pong frame:
  351.             case 10:
  352.                 $decodedData['type'] = 'pong';
  353.             break;
  354.            
  355.             default:
  356.                 return false;
  357.             break;
  358.         }
  359.        
  360.         if($payloadLength === 126)
  361.         {
  362.            $mask = substr($data, 4, 4);
  363.            $payloadOffset = 8;
  364.            $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
  365.         }
  366.         elseif($payloadLength === 127)
  367.         {
  368.             $mask = substr($data, 10, 4);
  369.             $payloadOffset = 14;
  370.             $tmp = '';
  371.             for($i = 0; $i < 8; $i++)
  372.             {
  373.                 $tmp .= sprintf('%08b', ord($data[$i+2]));
  374.             }
  375.             $dataLength = bindec($tmp) + $payloadOffset;
  376.             unset($tmp);
  377.         }
  378.         else
  379.         {
  380.             $mask = substr($data, 2, 4);   
  381.             $payloadOffset = 6;
  382.             $dataLength = $payloadLength + $payloadOffset;
  383.         }  
  384.        
  385.         if($isMasked === true)
  386.         {
  387.             for($i = $payloadOffset; $i < $dataLength; $i++)
  388.             {
  389.                 $j = $i - $payloadOffset;
  390.                 if(isset($data[$i]))
  391.                 {
  392.                     $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
  393.                 }
  394.             }
  395.             $decodedData['payload'] = $unmaskedPayload;
  396.         }
  397.         else
  398.         {
  399.             $payloadOffset = $payloadOffset - 4;
  400.             $decodedData['payload'] = substr($data, $payloadOffset);
  401.         }
  402.        
  403.         return $decodedData;
  404.     }  
  405. }
Add Comment
Please, Sign In to add comment