Clase para navegar webs con SOCKET (PHP)

  • Autor Autor zcriptz
  • Fecha de inicio Fecha de inicio
zcriptz

zcriptz

1
Ómicron
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
Guardan este código en un archivo PHP con el nombre que quieran, en este caso SOCKET.php
PHP:
<?php

class SOCKET{
    public $connection = 'close';
    public $method = 'GET';
    public $ports = array(
        'http' => 80,
        'ssl' => 443
    );

        public function __construct($cookies=NULL, $agent=NULL){
                $this->cookiesJar = $cookies;
                $this->agent = $agent;
        }
        public function browse($URL=NULL, $referer=NULL, $post=NULL){
        if($URL) $this->URL = $URL;
        if($referer) $this->referer = $referer;
        if($post) $this->post = $post;
        $this->makeData()->send();
        return $this;
    }

    public function makeData(){
        $this->URL = str_ireplace('https', 'ssl', $this->URL);
        $n = "\r\n";
        $this->urlData = parse_url($this->URL);
        if(!$this->urlData['path']) $this->urlData['path'] = '/';
        if($this->post AND !$this->method) $this->method = 'POST';
        $this->data = $this->method.' '.$this->urlData['path'].' HTTP/1.1';
         $this->data .= $n.'Host: '.$this->urlData['host'];
        $this->data .= $n.'User-Agent: '.$this->agent;
        if($this->headers) foreach($this->headers AS $header) $this->data .= $n.$header;
        if($this->cookiesJar AND file_exists($this->cookiesJar)){
            $this->allCookies = file_get_contents($this->cookiesJar);
            if($this->cookies = preg_match('/'.$this->urlData['host'].'\{([^\}]+)\}/is', $this->allCookies, $cMath) ? array_filter(explode("\r\n", $cMath[1])) : NULL){
                $this->data .= $n.'cookie: ';
                foreach($this->cookies AS $cookie){
                    $cookieData = explode(':', $cookie);
                    $this->cookiesArray[trim(explode('=', $cookieData[1])[0])] = trim($cookie);
                    $this->data .= explode(';', trim($cookieData[1]))[0].'; ';
                }
            }
            $this->data = trim(trim($this->data), ';').$n;
        }
        $this->data .= 'Connection: '.$this->connection;
        if($this->post) $this->data .= $n.$this->post;
        $this->data .= $n.$n;
        return $this;
    }

    public function send(){
        if(!$this->port) $this->port = $this->ports[$this->urlData['scheme']];
        $this->socket = fsockopen($this->urlData['scheme'].'://'.$this->urlData['host'], $this->port, $errno, $this->error, 300);
        fwrite($this->socket, $this->data);
        stream_set_timeout($this->socket, 2);
        $this->response = '';
        while(!feof($this->socket)) $this->response .= fgets($this->socket, strlen($this->data));
        fclose($this->socket);
        $this->parse($this->response);
        return $this;
    }

    public function parse($response){
        if($response) $this->response = $response;
        list($this->resHeaders, $this->result) = preg_split("/\R\R/", $this->response, 2);
        $this->resHeaders = explode("\r\n", $this->resHeaders);
        foreach(preg_grep('/set-cookie:*/si', $this->resHeaders) AS $cookie){
            $cookieData = explode(':', $cookie);
            $this->cookiesArray[trim(explode('=', $cookieData[1])[0])] = $cookie;
        }
        if($this->cookiesArray) foreach($this->cookiesArray AS $cookie) $cookiesText .= "    ".$cookie."\r\n";
        if(!stristr($this->allCookies, $this->urlData['host'].'{')) $this->allCookies .= $this->urlData['host']."{\r\nprueba}\r\n";

        $this->allCookies = ($this->cookiesArray) ? preg_replace('/'.$this->urlData['host'].'\{([^\}]+)\}/is', $this->urlData['host']."{\r\n$cookiesText}\r\n", $this->allCookies) : $this->urlData['host']."{\r\n".$cookiesText."}";
        file_put_contents($this->cookiesJar, $this->allCookies);
        if($location = array_shift(preg_grep('/location:*/si', $this->resHeaders))){
            $this->browse(trim(str_ireplace('location:', '', $location)));
        }
        return $this;
    }
}
?>

En el caso del demo estaría devolviendo el código HTML de ForoBeta, enviando como referer "prueba.com".

Puse algunas cabeceras para que vean como se pueden agregar.

Para enviar campos post, deben enviarlos como tercer parametro en la función "browse", con este formato: campo=valor&campo2=valor&otrocampo=loquesea

Código DEMO:
PHP:
<?php
require_once('SOCKET.php');

$SOCKET = new SOCKET('cookies.txt', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36');
$SOCKET->headers = array(
    'accept: */*',
    'origin: https://www.forobeta.com',
    'accept-language: es-ES,es;q=0.9'
);

$SOCKET->browse('https://www.forobeta.com', 'https://www.prueba.com');

echo '<b>C&oacute;digo HTML de ForoBeta:</b><br><textarea style="width:500px;height:100px">'.$SOCKET->result.'</textarea><br><br>';

?>


Demo: SOCKET



Pueden colocar esto al final para comprender el funcionamiento:
PHP:
<b>Socket enviado:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->data?></textarea><br>
<br>
<b>Respuesta de <?=$SOCKET->URL?>:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->response?></textarea><br>
<br>
<b>Cabeceras recibidas:</b><br>
<textarea style="width:500px;height:100px"><? print_r($SOCKET->resHeaders); ?></textarea><br>
<br>
<b>Cuerpo recibido:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->result?></textarea><br><br>
____________________________

Clase para navegar webs con cURL (PHP)
 
Última edición:
Muy bueno tio muchas gracias!
 
Gracias bro, yo no entiendo mucho el uso de socket,, exactamente cual es su utilidad con respecto a curl por que por ejemplo en c# también se puede usar sockets para hacer peticiones??? he visto ejemplos que usan sockets para crear aplicaciones como un chat pero no se muy bien o sera que existe menos dependencia de librerías externas y mas compatibilidad nativa con el sistema operativo.
 
Última edición:
La verdad yo también estoy muy desinformado con este tema, esto no puede quedar asi.
 
Gracias por el aporte
 
Gracias bro, yo no entiendo mucho el uso de socket,, exactamente cual es su utilidad con respecto a curl por que por ejemplo en c# también se puede usar sockets para hacer peticiones??? he visto ejemplos que usan sockets para crear aplicaciones como un chat pero no se muy bien o sera que existe menos dependencia de librerías externas y mas compatibilidad nativa con el sistema operativo.

Básicamente es una petición y una respuesta.

Armas el "socket" de petición y se lo envías al servidor del cual esperas la respuesta, y este debe leerlo e interpretarlo para responder o no.

Obviamente hay que respetar una estructura, que si te fijas la clase la respeta.

Y si, puedes hacer Sockets en C#.

Si quieres coloca esto al final del demo:
PHP:
<b>Socket enviado:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->data?></textarea><br>
<br>
<b>Respuesta de <?=$SOCKET->URL?>:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->response?></textarea><br>
<br>
<b>Cabeceras recibidas:</b><br>
<textarea style="width:500px;height:100px"><? print_r($SOCKET->resHeaders); ?></textarea><br>
<br>
<b>Cuerpo recibido:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->result?></textarea><br><br>

Creo yo que te ayudará a interpretarlo mejor.

- - - Actualizado - - -

La verdad yo también estoy muy desinformado con este tema, esto no puede quedar asi.

Tmb te ayudará si agregas eso al demo.

- - - Actualizado - - -

PD: Saquen el echo del result porque se mezclará todo con el código HTML de ForoBeta.
 
Última edición:
Edité unos errores de saltos de linea para SOCKET.PHP
 
Estuve tratando de optener el Result de esta pagina https://espn-live.stream/ y realmente me perdi no logre Puedes darme una mano. Gracias
 
Estuve tratando de optener el Result de esta pagina https://espn-live.stream/ y realmente me perdi no logre Puedes darme una mano. Gracias

En una edición borré parte del tema jeje.

Aquí tienes el código para esa web:
PHP:
<?php
require_once('SOCKET.php');

$SOCKET = new SOCKET('cookies.txt', $_SERVER['HTTP_USER_AGENT']);
$SOCKET->headers = array(
    'accept: */*',
    'origin: https://espn-live.stream',
    'accept-language: es-ES,es;q=0.9'
);
$SOCKET->browse('https://espn-live.stream', 'https://www.google.com');

echo '<b>C&oacute;digo HTML:</b><br><textarea style="width:500px;height:100px">'.$SOCKET->result.'</textarea><br><br>';

?><b>Socket enviado:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->data?></textarea><br>
<br>
<b>Respuesta de <?=$SOCKET->URL?>:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->response?></textarea><br>
<br>
<b>Cabeceras recibidas:</b><br>
<textarea style="width:500px;height:100px"><? print_r($SOCKET->resHeaders); ?></textarea><br>
<br>
<b>Cuerpo recibido:</b><br>
<textarea style="width:500px;height:100px"><?=$SOCKET->result?></textarea><br><br>
 
Atrás
Arriba