Bot para browser game ¿Scraping indetectable?

Iniciado por alvaca, 16 Septiembre 2018, 21:09 PM

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

alvaca

Hola,

No sé si es reiterar en lo mismo que en otro tema ya posteado pero es que estoy haciendo un bot para un browser game como Travian pero con Java para android y me gustaría plantearles alguna pregunta.

He buscado mil formas de desarrollar el bot para el mismo browser game pero la mayoría están destinadas a ordenador y quiero desarrollarlo en el móvil. Mi búsqueda me ha llevado a creer que la mejor forma de realizar dicha aplicacion es usando REQUESTS iguales que los que envía un navegador pero usando la libreria Jsoup. Con dicha libreria puedo modificar el userAgent y los headers para simular una persona en el navegador pero no estoy seguro del todo que sea indetectable.

Por otra parte un browser realiza muchos GET methods para cargar la página visualmente, me gustaría saber si dichas peticiones se podrían omitir sin ser detectado que no se esta usando el navegador.

Muchas gracias de antemano



Mod: No esta permitido revivir temas viejos.

Nota: Este tema esta relacionado con este otro:
https://foro.elhacker.net/desarrollo_web/bot_para_browser_game_iquestscraping_indetectable-t432351.0.html

srWhiteSkull

El scraping es una técnica indetectable. Simplemente es recopilar información de una página. Luego una consulta al servidor de lo que sea, el servidor no sabe si es un bot o tú gato quien la hace, sólo recibe la consulta y devuelve un resultado.

Posiblemente el servidor lo que va a impedir, ya que no tengo ni idea del juego en cuestión, es que el mismo usuario inicie varias sesiones.

Y por supuesto puedes interactuar con una página web o servicio Web sin usar un navegador con solamente usar una conexión HTTP.

alvaca

Entiendo, pero que puntos debería de tener en cuenta a la hora de enviar una petición POST o GET? Lo digo porque entiendo que tengo que controlar el UserAgent, las cookies y demás para enviar lo mismo que un navegador y no ser detectable.

Para ello hay métodos con Java JSoup, pero me gustaría afinar las cosas para no cometer ningún fallo.

Por ejemplo he estado mirando trabajar con el siguiente código, aunque recibo errores de que no está permitido el request (error 401):

Connection.Response log = (Connection.Response) Jsoup.connect("https://" + this.url)
                    .userAgent(userAgent)
                    .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                    .header("Accept-Encoding", "gzip, deflate, br")
                    .header("Accept-Language", "es-ES,es;q=0.9,en;q=0.8")
                    .header("Cache-Control", "max-age=0")
                    .header("Connection", "keep-alive")
                    .header("Host", "Host:"+url)
                    .header("Referer", "http://www.google.es")
                    .header("Upgrade-Insecure-Requests","1")
                    .data("name", this.user)
                    .data("password",this.pass)
                    .data("lowRes", "1")
                    .data("s1", "Iniciar+sesi%C3%B3n")
                    .data("w", "1550%3A1436")
                    .data("login",(""+System.currentTimeMillis()))
                    .method(Connection.Method.POST)
                    .execute();

srWhiteSkull

#3
Desiste, no puedes alterar la información que te envía el servidor.

Imagina que tú partida tienes 4 monedas de oro y consigues modificar esa cantidad en el navegador, para el servidor da igual la cantidad que hubieras modificado porque este tiene "registrado" que sólo tienes 4 monedas de oro. En cualquier momento cuando actualice el contenido del juego la cantidad volverá a ser la misma y perderás las monedas uqe añadiste haciendo trampa.

Cuando algo cambia en el juego, por ejemplo consigues monedas de oro, se "registrarán" (en el servidor) posiblemente porque el servidor está pendiente de que consigas determinado "logro"(que estará sujeto a una cantidad predefinida de oro), pero si se incrementa la cantidad de monedas sin más, por medio de trampeo, es muy probable que sólo se muestre en tú navegador pero no tenga efecto en el juego (modifica el valor de una variable).

Sobre el 401 puede ser por diversos motivos entre ellos que no estés enviando la información que espera recibir el servidor. Por ejemplo, que espera un parámetro con un valor y no existe en el mensaje que envías o que ya exista una sesión iniciada y el servidor impida el inicio o el juego de los mismos usuarios duplicados en la misma partida.

No puedes colarte en el servidor sin que lo sepa porque el servidor no es sólo una máquina, es una aplicación que está pendiente de las peticiones para devolver un resultado. Todo el flujo pasa por este y lo redirecciona según el contenido del mensaje o de los parámetros.

...
...

Si podrías alterar el contenido del navegador, pero a riesgo de que el servidor lo actualice y te muestre la "realidad", y en caso de intentarlo fuera de línea (sin internet) es muy probable que el servidor invalide esa partida al reconectar y te pida iniciar sesión.

Alterar la información de un juego en línea es mucho más difícil (a no ser que usurpes el servidor) y casi imposible que un juego de escritorio o juego fuera de línea porque el primero tiene "alguien" que registra la información en un espacio físico imposible de acceder de la misma forma que en un juego de ROL de mesa hay un "master" que controla que no hagas trampa y que sabe que si antes tenías 10 puntos de vida en el siguiente turno no puedes tener 1000 o cambiar los datos de la ficha del personaje sin que lo sepa.

--------------------------------------------------------------------------------------------------

Si es para un bot lo mejor es que lo hagas externamente para que interaccione con el navegador o con la aplicación, controlar posición del ratón, teclado, etc... pero requiere tener buenos conocimientos del sistema operativo donde esté instalado el juego o el navegador.

alvaca

Claro, yo quiero hacer un bot, no modificar los valores que el servidor tenga jajajaja

El caso es que quiero o trabajar con el navegador o enviar directamente los requests que envía el navegador.

En el caso de trabajar directamente con el navegador no sabría, al menos en un dispositivo Android (en Windows sabría hacerlos usando Selenium), pero si sabes de que temas debería de investigar podría verlo.

En el otro caso tengo un problema. Ya he solucionado el error 401 (el fallo estaba en los headers del Request). En problema ahora viene cuando es necesario tener javascript activado para jugar. He conseguido enviar cierta información con JSoup, pero obviamente no consigo avanzar sin "activar" javascript.

Muchas gracias srWhiteSkull


srWhiteSkull

Vaya rollo esto para un jueguillo de m***  :xD

Pues no se...quizás habría que hacer un programa en Android donde usara algún componente de navegador e inyectar JS en este  :-\

https://medium.com/@filipe.batista/inject-javascript-into-webview-2b702a2a029f.

Ya no puedo aportar más al tema lo siento, saludos.

alvaca

Ya, es complicado el tema jajajajaj

Muchas gracias compañero, esperaré a ver si alguien más me puede orientar.

Lo ultimo que he entendido es que con WebView puedo desarrollarlo, aunque no tengo claro que sea muy seguro jajajajaj. He conseguido logearme, ahora me falta aprender scraping con WebView si es que se puede y continuar jajajja