[Reto][PHP] Bot http

Iniciado por lnvisible, 25 Diciembre 2011, 14:45 PM

0 Miembros y 1 Visitante están viendo este tema.

lnvisible

Hay un tipo de retos incrementales que son más productivos que los retos habituales.

http://en.wikipedia.org/wiki/Cutting_contest
http://en.wikipedia.org/wiki/Guitar_battle

Esto es un reto a ese estilo, consiste en ir añadiendo algo al bot para hacerlo más parecido a una persona en la navegación (con cookies, con referer, con todo eso), además para que sea más fácil indicarle los parámetros que tiene que rellenar (por ejemplo muchos formularios tienen campos hidden, podría rellenarlos él mismo), para que sea más fácil parsear el html después, para que sea más fácil usar proxies... el límite lo pone vuestra imaginación.

Creo que puede ser un reto interesante, entretenido, productivo y del que todos saquemos el divertirnos, un código interesante y aprender y hacer algo útil. Vosotros diréis.

Aquí tenéis un ejemplo de cómo podría empezarse, veremos si alguien continua o no, en unos días pondré una mejora si nadie se anima, y con eso espero que ya sí se anime alguien.

Código (php) [Seleccionar]
class PHPBot {

   function PHPBot (){
     $this->ch = curl_init();
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_HEADER, 1); // Include headers in response or not
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return (don't print) answer of exec
     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
     curl_setopt($ch, CURLOPT_AUTOREFERER, true); // Isn't this great?
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: */*', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'));      
   }
   
   private function act($url, $params = false){
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_URL, $url);
     if ($params != false){
       curl_setopt($ch, CURLOPT_POSTFIELDS, $this->myurlencode($params));
       curl_setopt($ch, CURLOPT_POST, 1);
     }
     else
       curl_setopt($ch, CURLOPT_POST, 0);
     $r = curl_exec($ch);
     return $r;
   }
   
   private function myurlencode($dict){
     $r = "";
     foreach($dict as $key => $value)
       $r = $r.urlencode($key).'='.urlencode($value).'&';
     return $r;
   }
   
   function get ($url){
     return $this->act($url);
   }
   
   function post($url, $params){
     return $this->act($url, $params);
   }

 }

#!drvy

#1
Añado una función para parsear un string, recoger todo lo que empiece con http (links) y devolverlo en un array.

Código (php) [Seleccionar]

class PHPBot {

   function PHPBot (){
     $this->ch = curl_init();
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_HEADER, 1); // Include headers in response or not
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return (don't print) answer of exec
     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
     curl_setopt($ch, CURLOPT_AUTOREFERER, true); // Isn't this great?
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: */*', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'));      
   }

   private function act($url, $params = false){
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_URL, $url);
     if ($params != false){
       curl_setopt($ch, CURLOPT_POSTFIELDS, $this->myurlencode($params));
       curl_setopt($ch, CURLOPT_POST, 1);
     }
     else
       curl_setopt($ch, CURLOPT_POST, 0);
     $r = curl_exec($ch);
     return $r;
   }

   private function myurlencode($dict){
     $r = "";
     foreach($dict as $key => $value)
       $r = $r.urlencode($key).'='.urlencode($value).'&';
     return $r;
   }

   private function get_urls($context){
$query = '/http?\:\/\/[^\" ]+/i';
preg_match_all($query,$context,$result);
return $result[0];
   }

   function get ($url){
     return $this->act($url);
   }

   function post($url, $params){
     return $this->act($url, $params);
   }

 }



Saludos

lnvisible

Muy bien, pero en ocasiones los links pueden no ser absolutos sino relativos y aparecer sin http. Añado una función para recoger los links (absolutos y relativos) pero sólo cuando son enlaces a otras páginas, no los que son a imágenes ni otras cosas.

A ver si más gente se anima  :D

Código (php) [Seleccionar]

class PHPBot {

   function PHPBot (){
     $this->ch = curl_init();
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_HEADER, 1); // Include headers in response or not
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return (don't print) answer of exec
     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
     curl_setopt($ch, CURLOPT_AUTOREFERER, true); // Isn't this great?
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: */*', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'));      
   }

   private function act($url, $params = false){
     $ch = $this->ch;
     curl_setopt($ch, CURLOPT_URL, $url);
     if ($params != false){
       curl_setopt($ch, CURLOPT_POSTFIELDS, $this->myurlencode($params));
       curl_setopt($ch, CURLOPT_POST, 1);
     }
     else
       curl_setopt($ch, CURLOPT_POST, 0);
     $r = curl_exec($ch);
     return $r;
   }

   private function myurlencode($dict){
     $r = "";
     foreach($dict as $key => $value)
       $r = $r.urlencode($key).'='.urlencode($value).'&';
     return $r;
   }

   private function get_urls($context){
$query = '/http?\:\/\/[^\" ]+/i';
preg_match_all($query,$context,$result);
return $result[0];
   }

    function getLinks ($url){
      $dom = new DOMDocument();
      $p = $this->act($url);
      $dom->loadHTML(mb_convert_encoding($p, 'utf-8'));
      $links = $dom->getElementsByTagName('a');
      foreach($links as $l)
        $r[] = $l->getAttribute('href');
      return $r;
    }


   function get ($url){
     return $this->act($url);
   }

   function post($url, $params){
     return $this->act($url, $params);
   }

 }


Pablo Videla

Podrían comentar el codigo para explicar bien lo que hace, hay gente como yo que sabe la sintaxis de php pero no conoce bien las funciones porque no suele programar en ese lenguaje xD , de antemano, gracias.

Espero no haber estorbado acá.

lnvisible

Puedes hacer click en las funciones que no conozcas y te lleva directamente a la documentación. :D