Bot para browser game ¿Scraping indetectable?

Iniciado por Littl3, 24 Marzo 2015, 18:47 PM

0 Miembros y 2 Visitantes están viendo este tema.

Littl3

Buenas!

Estoy pensando en hacer un bot para un juego de navegador.
Tengo algunas dudas en las que creo que me podríais arrojar un poco de luz.

Todavía no lo he pensado mucho pero en principio la idea sería hacerlo en php ( seguramente bajo Laravel, estoy enamorado ;P ) realizando peticiones curl contra el server, de esta manera podría controlarlo desde cualquier sitio, totalmente online.

La gran duda que tengo es si sería detectable, en peticiones curl entiendo que puedo falsificar el user agent, ¿pero sería la mejor manera?

Es decir, ¿es posible realmente esconderle a un servidor que eres un bot? ¿Falsificando el useragent y entrando con js activado ya eres indetectable? ¿o tengo que tener en cuenta algo más?

No hay captchas de por medio, en principio..

Podría utilizar alguna herramienta de scrapping tipo casperJS, o no sé, quería pediros consejo sobre como realizar las peticiones, si se os ocurre alguna herramienta o framewrok.

Que las peticiones sean 100% indetectables es la base de todo, luego ya me cuidaría de no generar patrones de conducta, tener randoms de tiempo entre las peticiones etc..

Gracias,
Un saludo!


#!drvy

Si entiendes como funcionan los navegadores, entenderás que un bot puede ser tan indetectable como un navegador. La idea no es que no te vean, la idea es que parezcas un usuario normal y corriente.

Ahora, lo primero que deberías hacer es ver como funciona la web. Usa el 'developer tools' de tu navegador favorito, navega y realiza acciones por el sitio y mira que requests carga tu navegador. Después simulalos en PHP y habrás echo lo mismo que hizo el navegador.

Tu mayor problema seria que parte de la lógica del sitio este en javascript. En tal caso deberías recrear dicha lógica en PHP. Lo digo porque no puedes entrar con 'js activado' usando curl por ejemplo. Básicamente porque curl no tiene un interprete de javascript.

Saludos

moikano→@

CitarLa gran duda que tengo es si sería detectable, en peticiones curl entiendo que puedo falsificar el user agent, ¿pero sería la mejor manera?

La mejor forma es user agent valido, headers validos concordes con el user agent (No envía los mismos headers firefox que safari), ip valida y sobretodo factor humano, es decir, no siempre aciertes en poner el password, nunca hagas las cosas tan rápido con un bot, esperate unos segundos como si estuvieras mirando lo que te muestra la petición. Y así todo, simeplemente haz que se comporte como un humano.

Con casperjs puedes ejecutar el javascript de la página, pero si puedes hacerlo a base de php mejor, ya que casperjs es muy pesado y si lo haces en casperjs intenta bajar un nivel y hacerlo con phantomjs que es ma liviano que casperjs ya que es el motor que usa casperjs.

Citarsi se os ocurre alguna herramienta o framewrok.

No conozco ningún framework para crear bots. Antes trabajaba con esto, cuando me cambiaron de tareas me quede con ganas de seguir con los bots, así que hace tiempo que estoy creando unas clases para el manejo de enviar y recibir info de las páginas, pero es un poco... feo, no uso frameworks ni nada por el estilo y siempre quiero arreglarlo, pero siempre acabo ampliando el bot.

Si te interesa te puedo mostrar la lógica que uso y los scripts.

saludos.

Littl3

CitarLo digo porque no puedes entrar con 'js activado' usando curl por ejemplo. Básicamente porque curl no tiene un interprete de javascript.

Ya, por eso comentaba lo de casperJS, o phantom como dice moikano, si yo me dedicara a pillar bots, la primera validación sería algún proceso en JS, de esta manera ya descartas todas las peticiones CURL.

Un ejemplo tonto, una suma en JS que envía el resultado por ajax al server, si el resultado no se envía o es incorrecto no estás usando JS y eres sospechoso..
Lo mismo en el envío de un formulario, realizas una operación en js con 2 valores que vienen del server y envías el resultado en un hidden del formulario, sin js.. si el resultado que hay en el hiden no concuerda.. banned!

CitarSi te interesa te puedo mostrar la lógica que uso y los scripts.

Me encantaría gracias, revisaré phantomJS.

Resumen de lo que debería tener en cuenta:

- User Agent falsificado.
- Header Falsificado, acorde al user agent, (chrome x ejemplo)
- Ip válida (Entiendo que si lo ejecuto en local desde mi maquina de momento chapó)
- Ejecutar javascript (Creo que esto también es estrictamente necesario)

¿Se os ocurre alguna cosa más?

Gracias, un saludo.

moikano→@

CitarEjecutar javascript (Creo que esto también es estrictamente necesario)

Realmente no lo es. Depende del sitio. En muchos casos solo usan javascript para el google analitics,manejar animaciones, usabilidad de formularios y cosas por el estilo.

La clave está en mirar bienlo que envias en cada acción por POST o GET. Como decia #!drvy.

#!drvy

Interpretar el javascript no creo que sea necesario en la mayoría de las ocasiones. De hecho podrias tener problemas por que cada motor js tiene su propio modo de interpretar. Yo a lo que me referia es que mires la como se procesa y hagas lo  mismo.

Por ejemplo:

CitarUn ejemplo tonto, una suma en JS que envía el resultado por ajax al server, si el resultado no se envía o es incorrecto no estás usando JS y eres sospechoso..

Haces la suma en PHP y envías el request con los mismos headers que enviaría un navegador normal. El servidor no tiene otro modo de distinguir entre ajax y no ajax.

Saludos

moikano→@

La lógica que uso a groso modo es la siguiente. Lo explico con las clases que uso.

Clases de manejo de BDs
Usadas para el manejo de los datos almacenados en bases de datos.
(No las explico porque son obvias)

Clases encargadas de scraping
Son 2 y son las mas importantes, ya que están creadas para que con expresiones regulares ( No uso html dom de php porque me ha dado problemas, ya sea por la propia libreria o porque algunas páginas no cumplen bien el dom y no em saca los datos que necesito, con expresiones regulares saco exactamente lo que quiero, independientemente de como esté programado el html)
   
La clase page
tiene todas las expresiones regulares organizadas de esta forma. accion (una acción simple, como podría ser loguearse) -> paginas (las diferentes paginas a las que se debe acceder para hacerlo) -> funciones (Las difrentes funciones que se realizan en la página para realizar la accion)

La clase parse
Esta es la mas importante ya que recoje la info de la clase page y la trata. Las acciones las defines tu mismo y las páginas simplemente tiene que ser una url valida. pero las funciones esan predefinas y    son las siguientes:
-ParseUrl : Cambia un tag de la url {tag} por lo que le digas, ya sea un dato extraido con otra función o con un dato que tu le digas.
-InfoExtract: Realiza una extracción de información con la expresión regular.
-sendData: Envia datos al servidor con datos sacados de la función infoExtract o bien con los que tu le digas.
Hay un par mas pero estas son als importantes. Aparte tienen comprobaciones internas de un buen funcionamiento en el envio o extracción de datos.

Clase encargadas del comportamiento del bot
De momento es solo una clase, esta es una de las cosas que querría cambiar.
La clase bot
Realiza las acciones y hace los cálculos entre ellas para sacar sus conclusiones y realizar otras acciones. Estás acciones, según su resultado, realizan otras acciones o programan otras acciones en un calendarío donde el bot ejecutará automáticamente la acción.

Esto es a groso modo. Si quiere slos scripts te los paso personalmente porque me da verguenza enseñarlos aquí, ya que hace tiempo que empece a hacerlo y tiene muchas cosas de las que no me siento orgulloso.

Littl3

Gracias Moikano y #!drvy, no necesito el código no te preocupes, usaré Laravel.

Me lo habéis preguntado por privado pero no es ningún secreto, no lo he dicho porque no me parecía relevante, el juego es travian.

Sigo teniendo mis dudas con lo del JS, creo que es la manera mas fácil de detectar un bot, puedes hacer procesos ocultos en JS, ocultos me refiero a difíciles de encontrar, con el js minificado y todo imagínate... seguro que se me escaparía algo, además, ¿quien va entrar a un juego sin JS? A la mínima sospecha te investigan un poco y te pillan, más si empiezas a aparecer en los tops..

En travian me he fijado que hasta la mayoría de los links se ejecutan con JS, ya se que no importa y que los puedo ejecutar sin JS, pero claro, el juego sin JS no funciona, así que si no tienes js activado es que o no puedes jugar, o eres un bot.

Otro impedimento es el movimiento del mouse, si el mouse no se ha movido y estás realizando procesos.. pillado, por eso digo que el JS lo encuentro vital, a lo mejor me equivoco y no controlan tanto, pero yo lo haría desde luego.

Para lo del mouse podría emular el user agent de un smartphone, aquí no hay movimientos de mouse. ( pienso mientras escribo ;P )

Al final la idea e hacer un bot indetectable de verdad, casi perfecto, bots que ejecutan peticiones por curl y eso ya existen, pero los acaban pillando, creo que hay que cuidar mucho los detalles y el js es un detallazo...

#!drvy

#8
Insisto. El servidor NO tiene otro modo de determinar si usas javascript (o no). El cliente es el que debe decírselo mediante ajax o un request. La única manera de que el servidor sepa que ejecutas javascript es que este ultimo le avise.

Cualquier comunicación entre cliente y servidor en el protocolo HTTP, se reduce a REQUESTS. Esas peticiones las genera tu navegador, el servidor las procesa y si es necesario responde.

javascript no es compilado ni esta oculto. Tu navegador debe tener el código entero para poder interpretarlo.  Nadie te puede ocultar nada de javascript, si esta minificado puedes usar js beautify. Como mucho estarán obfuscados en cuyo caso tienes que intentar desofuscarlo o intentar entender que hace. JS se interpreta por el navegador y el navegador debe saber exactamente en todo momento que ejecutar por tanto siempre tiene el código y su lógica disponible.

De nuevo, funcionamiento de un bot no es tan diferente al de un navegador. Los dos se reducen a hacer peticiones y parsear contenido. La única diferencia es que el navegador te presenta el contenido de forma amistosa. Te basta con que abras el developer tools de tu navegador, ir a la pestaña de Red y ver que requests genera la pagina.

http://i.imgur.com/sFUrvB9.png

Saludos

alvaca

Perdón por reanudar este tema. Me ha resultado de mucha ayuda pero me queda una duda respecto al úlimo mensaje.

Entiendo que el servidor solo se puede enterar de que existe un js-bot si el Request o Ajax se lo indica. El caso es que yo soy nuevo en esto y no sé donde puedo mirar si el browser envia esa información o no.

He estado mirando los request y para cada click existe siempre un GET o POST más otros muchos GET que se consiguen con la cache. He realizado esto tanto de forma manual como con la consola y su respectivo js.click() pero no veo diferencias. No se si es porque no las hay o porque no se leer dicha información.

Muchas gracias y perdón por las molestias