• Sábado 9 de Noviembre de 2024, 03:26

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Invisible

Páginas: [1]
1
PHP / [Reto] Bot http
« en: Domingo 25 de Diciembre de 2011, 14:52 »
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
  1. class PHPBot {
  2.  
  3.     function PHPBot (){
  4.       $this->ch = curl_init();
  5.       $ch = $this->ch;
  6.       curl_setopt($ch, CURLOPT_HEADER, 1); // Include headers in response or not
  7.       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return (don't print) answer of exec
  8.       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");
  9.       curl_setopt($ch, CURLOPT_AUTOREFERER, true); // Isn't this great?
  10.       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'));      
  11.     }
  12.    
  13.     private function act($url, $params = false){
  14.       $ch = $this->ch;
  15.       curl_setopt($ch, CURLOPT_URL, $url);
  16.       if ($params != false){
  17.         curl_setopt($ch, CURLOPT_POSTFIELDS, $this->myurlencode($params));
  18.         curl_setopt($ch, CURLOPT_POST, 1);
  19.       }
  20.       else
  21.         curl_setopt($ch, CURLOPT_POST, 0);
  22.       $r = curl_exec($ch);
  23.       return $r;
  24.     }
  25.    
  26.     private function myurlencode($dict){
  27.       $r = "";
  28.       foreach($dict as $key => $value)
  29.         $r = $r.urlencode($key).'='.urlencode($value).'&';
  30.       return $r;
  31.     }
  32.    
  33.     function get ($url){
  34.       return $this->act($url);
  35.     }
  36.    
  37.     function post($url, $params){
  38.       return $this->act($url, $params);
  39.     }
  40.  
  41.   }

2
Python / procesar html
« en: Domingo 29 de Mayo de 2011, 13:22 »
Hola.

Quiero procesar html en python, no estoy segura de si quiero pasarlo a objetos python como con amara, si quiero usar xml.dom que viene ya de serie con python o si quiero usar xquery o xpath para extraer los valors.   :unsure:

De lo que estoy segura es de que no quiero aprender las cuatro cosas para luego ver que no me vale, o que otra es mejor o que he perdido el tiempo, o que no se. <_<  

¿que es lo mejor y lo que deberia aprender?  :huh:

Quiero algo que sea facil, estandar y potente. Lo quiero todo   ^_^

GRacias!!

PD: ah!!    :ouch:  uso python3, amara no me vale por eso, pero puede que haya otras cosas iguales  :huh:

3
Python / Re: crawler http
« en: Sábado 23 de Abril de 2011, 21:02 »
Entonces, ¿por qué no fucniona?

Aparentemente todo está bien, pero no consigo hacer login. Quería hacer login aquí antes de pasar a cosas más complicadas.

he visto que smf requiere sha1, tengo que probarlo, con yahoo ya ni me atrevo, twitter que tiene oauth y cosas más complicadas lo dejo para después.

4
Python / Re: crawler http
« en: Sábado 23 de Abril de 2011, 19:08 »
Cita de: "F_Tanori"
y te he preguntado si no te servian las   librerias que los propios sitios ofrecen
No, no me sirven, porque quiero poder ampliarlo para que tenga un propósito tan general como sea posible, por eso necesito que mi crawler sea capaz de hacer login.

Cita de: "F_Tanori"
Ni mucho menos he dicho que sea algo de otro mundo, ni me sorprende la tarea a realizar, me parece muy buena pero no de otro mundo o imposible.
Si, es sencilla, ¿qué es lo que está mal?

Cita de: "F_Tanori"
y Pienso que si haces cosas como esta:

Código: Python
  1. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  2.  

Parece que estas buscando un control del formulario web y en cada pagina se llaman diferente, asi que de todos modos se tendra que hacer la adaptacion a cada sitio,
Date cuenta que eso está fuera de la clase, incluso son dos cajas de code distintas.

Cita de: "F_Tanori"
creo que seria complicado y al final tener que estar modificando tu metodo para cada pagina,
No, la primera caja se va ampliando para que cada vez sirva para más cosas.

Cita de: "F_Tanori"
y si le sumas que algunas paginas hacen login con flash, o con AJAX,CAPTCHAs,Timers,IP etc..
Por eso he empezado por una tan simple como un foro phpbb.

Mira que hay dos cajas de código.

5
Python / Re: crawler http
« en: Sábado 23 de Abril de 2011, 15:29 »
Entonces sí tendría propósitos específicos, cada vez que quisiera usar el crawler con un dominio tendría que hacerlo nuevo. Si quiero guardar mis mensajes privados de phpBB o los favoritos de yahoo bookmarks no quiero tener que hacer esta parte neuva, ni mirar una librería para manejar una api de un servicio que puede que ni exista (con facebook y twitter somos afortunados). El código de calidad es reusable.

hay muchos sitios que requieren hacer login para acceder a la información, sólo quiero poder hacer eso, creo que no es nada del otro mundo, no sé por qué me respondes con indirectas.

He puesto un código, que parece estar bien pero no funciona, sólo pido eso, que si alguien sabe por qué no funciona me lo diga... debería ser fácil para los expertos de aquí. Ahora incluso he conseguido acortarlo, una clase de 18 líneas no puede ser compleja.

Código: Python
  1. #!/usr/bin/env python3
  2. import urllib.request, urllib.parse
  3.  
  4. class CrawlerGeneral ():
  5.   def __init__(self):
  6.     self.headers = [("User-Agent", "Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"),
  7.                     ("Accept", "*/*"), ("Accept-Language":"en-us,en;q=0.5"),
  8.                     ("Accept-Encodingg", "gzip,deflate"), ("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7")]
  9.     self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor())
  10.     self.referer = ''
  11.  
  12.   def open(self, url, params = None):
  13.     self.opener.addheaders = self.headers + [('Referer', self.referer)]
  14.     self.referer = url
  15.     if not params is None:
  16.       params = bytes(urllib.parse.urlencode(params), 'utf-8')
  17.     resp = self.opener.open(url, params)
  18.     return resp.read().decode('utf-8')
  19.  


Código: Python
  1. from crawlergeneral import CrawlerGeneral
  2. from re import findall
  3. cg = CrawlerGeneral()
  4. data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')
  5. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  6. data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})
  7. print(cg.open('htt'+'p://foros.solocodigo.com/'))
  8.  

El ejemplo es con el foro de aquí porque seguro que quien me responda también tiene cuenta y puede probar. ¿Os habéis puesto paranoicos?  :lol:

6
Python / Re: crawler http
« en: Sábado 23 de Abril de 2011, 04:31 »
Tiene propósitos específicos, quiero usarlo en facebook ^_^.
Ya he pensado en el user agent, mira donde pone: "User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"
Espero que facebook no use mucho javascript, o tenga versión sin javascript, porque eso se sale de mis propósitos.
De todas formas, también quiero usarlo en twitter  ^_^.

No me has respondido a la pregunta, pero agradezco la inteción ;)

Hablando de fallos de seguridad, no puedo ver tu adjunto, no tengo suficientes mensajes, pero si le doy a previsualizar mi respuesta sí lo veo :lol:

7
Python / crawler http
« en: Miércoles 20 de Abril de 2011, 23:43 »
Hola,

Quiero hacer un bot http, pero a la primera de cambio, en cuanto he intentado hacer login en un sitio, ya no he podido seguir, algo falla y no se que es.

Este es el bot, muy simple, aunque estoy muy orgullosa de lo que llevo :D

Código: Python
  1. import http.client, urllib.parse
  2. from http import cookies
  3. from re import findall
  4.  
  5. class CrawlerGeneral ():
  6.   def __init__(self):
  7.     self.logininfo = []
  8.     self.baseheaders = {"User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15",
  9.                         "Accept": "*/*", "Accept-Language":"en-us,en;q=0.5",
  10.                         "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"}
  11.     self.cookies = cookies.SimpleCookie()
  12.     self.referer = ''
  13.        
  14.   def _act(self, url, method, params={}):
  15.     headers = self.baseheaders.copy()
  16.     headers['Referer'] = self.referer
  17.     headers['Cookie'] = self.cookies.output(header='', sep=';')
  18.     self.referer = url
  19.     if(url[:7] == 'htt'+'p://'):
  20.       url = url[7:]
  21.       safe = False
  22.     elif (url[:8] == 'htt'+'ps://'):
  23.       url = url[8:]
  24.       safe = True
  25.     else:
  26.       self.error("I don't like the protocol, I don't know how to handle this.n" + url)
  27.     (baseurl, extendedurl) = url.split('/', 1)
  28.     extendedurl = '/' + extendedurl
  29.     params = urllib.parse.urlencode(params)
  30.     conn = http.client.HTTPConnection(baseurl) if not safe else http.client.HTTPSConnection(baseurl)
  31.     conn.request(method, extendedurl, params, headers)
  32.     resp = conn.getresponse()
  33.     return self._processResponse(resp)
  34.  
  35.   def _processResponse(self, resp):
  36.     data = resp.read()
  37.     headers = resp.getheaders()
  38.     data = bytes.decode(data)
  39.     for (k, v) in headers:
  40.       if k == 'Set-Cookie':
  41.         self.cookies.load(v)
  42.     return (headers, data)
  43.  
  44.   def post(self, url, params):
  45.     realparams = urllib.parse.urlencode(params)
  46.     return self._act(url, 'POST', params)
  47.  
  48.   def get(self, url):
  49.     return self._act(url, 'GET')
  50.  

Esto es lo que intento hacer para que haga login:

Código: Python
  1. from crawlergeneral import CrawlerGeneral
  2. from re import findall
  3. cg = CrawlerGeneral()
  4. (headers, data) = cg.get('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')
  5. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  6. (headers, data) = cg.post('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})
  7. print(data)
  8.  

Pero no funciona, y no se por que...

Necesito hacer login porque en algunos sitios la informacion que se muestra es distinta dependiendo de si haces login o no, este foro lo estoy usando para empezar, porque el login es simple en comparación con otros, creo :-

GRacias!!

Páginas: [1]