Selenium - aprende a crear tus propios bots con Python

Iniciado por Mortal_Poison, Octubre 05, 2017, 05:43:11 AM

Tema anterior - Siguiente tema

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

Hola a tod@s,

Éste es mi primer post en underc0de, así que espero que les sea de utilidad.

Hace algún tiempo decidí crear un bot con Python + Selenium(es espléndida), considero que puede llegar a ser de utilidad para las personas que deseen saber cómo funciona un bot en twitter, facebook, gmail, entre otras.

¿Alguna vez te has preguntado cómo funcionan éste tipo de bots?

Funcionan de una manera realmente asombrosa, es el poder hecho script(en muchos casos).

Los bots que muchos conocen de likes, comentarios y demás son posibles automatizarlos mediante Python y cualquier otro lenguaje de programación.  Python, nos ofrece muchas librerías, entre ellas la mejor conocida como SELENIUM.  Selenium es una librería la cual usamos para automatizar lo que haríamos normalmente en el navegador. Les dejo una pequeña descripción que tienen en su sitio oficial:

CitarSelenium automatiza los navegadores. ¡Eso es! Lo que hagas con ese poder depende totalmente de ti. Principalmente, es para la automatización de aplicaciones web para fines de pruebas, pero ciertamente no se limita a eso. Las tareas de administración basadas en la web pueden (y deberían!) Ser automatizadas también.

Ya definiendo eso y conociendo lo que es, vamos a entrar en un ejemplo más práctico, donde mostraré cómo usarla y en éste caso, lo haré en el sistema operativo de Windows.

Cabe aclarar que Python al ser multiplataforma, es indiferente si usamos Linux, Mac, Windows u otro sistema operativo.





¡USÉMOLO!

Para descargar Selenium, lo podemos hacer en ésta web:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Ilustración 1. Descarga de Selenium.

Una vez descargado, lo podemos instalar simplemente con nuestro Python(recuerden que lo deben tener en las variables de entorno):


Ilustración 2. Instalación de Selenium.

Luego de la instalación, podemos proceder a lo que nos gusta, el código  :).

Existen diversas formas de programar/desarrollar, lo sabemos. Sin embargo, ustedes pueden adaptar éste código a su manera, a su lógica, a su uso.

En éste caso, realizaré un bot que realice un post 1000 veces(compartir) en Facebook. Se puede poner también un loop infinito.

Antes que nada, importemos selenium.

Para importar selenium lo hacemos de la siguiente manera:

Pero...

Existe un paso muy importante, es el de descargar el webdriver de Mozilla Firefox o en su defecto, el de Google Chrome. El webdriver de Mozilla Firefox se llama Geckodriver y el de Chrome se llama ChromeDriver.

Descargar > No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Descargar > No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Una vez descargado(a elección y criterio suyo) procedemos a:
1) Ponerlo de variable de entorno / solución más óptima si van a trabajar con Python + Selenium muchas veces.
2) Ponerlo en una carpeta y simplemente pasarle la ruta a nuestro script.

Yo opté por la segunda opción y además, lo haré con Geckodriver(webdriver de Firefox), así que vamos a ello.

Ahora si procedemos a importar algunas declaraciones de importaciones básicas para importar módulos de Selenium.


Ilustración 3. Importación de la librería con sus respectivos módulos.

Luego de importar correctamente nuestra librería, debemos importar nuestro Geckodriver en una línea del script(OJO, SI NO LO TIENEN EN LA VARIABLE DE ENTORNO, SINO, SE SALTAN ESTE PASO).


Ilustración 4. Llamado a Geckodriver para su uso.

--> Recuerden que esa es mi ruta donde tengo el Geckodriver, en su caso, deben poner la ruta donde lo dejaron.


Como vamos a realizar un bot para Facebook, tenemos que ingresar a nuestra cuenta, en ese caso, creamos una función llamada "executeBot()" a la cual le insertaremos nuestra lógica.


Ilustración 5. Datos de acceso de nuestra cuenta.

Nótese que solo estamos poniendo en dos variables nuestro email y nuestra contraseña, pero no estamos insertándolo en el formulario de login de Facebook. con "driver.get(url)" lo que hacemos es acceder a cualquier url que deseemos. Recuerden que driver vendría siendo nuestro objeto de tipo browser.

Ahora bien, ya teniendo nuestros datos, debemos insertarlos en el formulario y además, presionar en el botón de entrar.
Para ello, tenemos que tener un concepto clave antes de seguir. Xpath es lo que usa selenium(sin mencionar los selectores de CSS) para que pueda saber dónde va a ingresar datos, dónde va a hacer click, entre otras. Xpath nos sirve precisamente para recopilar los inputs, botones, clases, id's y demás que necesitemos usar en Selenium.

Resumiendo, tenemos una página web, sacamos el xpath de los input de logeo y eso se lo pasamos a Selenium. Selenium ingresa lo que le hemos indicado con anticipación que ingrese y ya está.

Eso lo haremos ahora mismo. Para sacar los xpath de cualquier página, basta con el inspector de elementos de Chrome / Firefox, pero sino, existen diversas extensiones como lo puede ser Firepath(recomendada).

Yo lo haré con el inspector de firebug, así que lo único que debemos hacer es darle click derecho a los inputs y al botón que deseemos extraer los xpath's y ponerlos en nuestro código. Veámolo en detalle.


Ilustración 6. Extracción de xpath del correo electrónico.


Ilustración 7. Extracción de xpath de la contraseña.


Ilustración 8. Extracción de xpath del botón.

Cada uno de ellos los vamos a pegar en las siguientes líneas de código.


Ilustración 9. Inserción de xpath's en nuestro código.

Lo que está subrayado en amarillo, es cada uno de los xpath's que extraje, en la variable de email, está la del input del email. En la variable de password, está el del input de password. En la variable de button, está el xpath del botón.

EXPLICACIÓN DE LOS MÉTODOS
find_element_by_xpath() --> le indicamos a nuestro navegador que encuentre el xpath que deseamos.
send_keys()                    --> usado para insertar contenido en un campo editable(inputs por ejemplo).
click()                             --> para presionar click en alguna parte de la página web(indicar xpath).

Tenemos ya nuestra sesión de Facebook abierta. Ahora, lo que queríamos era compartir un enlace de facebook, lo haremos de la siguiente forma:


Ilustración 10. Compartir contenido de facebook en nuestro perfil.


Ilustración 11. Compartir contenido de facebook en nuestro perfil.

En la Ilustración 11. podemos notar que existe el botón de "publicar", ahí lo único que se hace es extraer el xpath y luego de eso, pasarselo a nuestro método de find_element_by_xpath para que posteriormente no haya ningún problema con click().

Si notan, en ese campo no pusimos nada, porque en la url ya le estamos pasando el enlace: "No tienes permitido ver los links. Registrarse o Entrar a mi cuentaENLACE", sin embargo, podríamos sacarle el xpath a ese textarea e insertarle nuestro contenido. El xpath de ese textarea es(Les ahorro trabajo): //*[@id="u_0_s"]

Nos queda probar nuestro bot, llamamos nuestra función:


Ilustración 12. Llamada de función para ejecución del script.

Y prácticamente eso sería todo. Les dejo el código completo aquí:

Código: python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Firefox(executable_path='C:/Users/Mortal_Poison/Downloads/geckodriver-v0.19.0-win64/geckodriver.exe')
def executeBot():
input_email_id = "[email protected]"
input_pwd = "our_password"
# Get the page. In this case is loggin attempt of Facebook.
driver.get('https://www.facebook.com/login.php?login_attempt=1&lwv=110')
print("...Facebook is open...")
# We find the xpath for insert our email address.
email = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div/div/div[2]/form/div/div[1]/input")
# Put mail.
email.send_keys(input_email_id)
print("Email put.")
# We find the xpath for insert our password.
password = driver.find_element_by_xpath("//input[@id='pass']")
# Put password.
password.send_keys(input_pwd)
print("Password put...")
# We find xpath of button Login.
button = driver.find_element_by_xpath("//button[@id='loginbutton']")
# We click on button of login.
button.click()
# Open session.
print("Facebook account is open.")
x = 0
while x<1000:
driver.get("https://www.facebook.com/sharer.php?u=youtube.com/viinvideoshd")
postbutton = driver.find_element_by_xpath('//*[@id="u_0_1v"]')
postbutton.click()
print("Shared!." , x)
x = x+1

#driver.get("https://www.facebook.com/Underc0de/")
#post_textarea = driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div/div[2]/div[1]/div/div[2]/div/div[1]/div/button[1]')
#post_textarea.click()
#print("Liked page.")

executeBot()


# https://www.youtube.com/viinvideoshd
# https://www.viinacademy.com
# https://underc0de.org -> Mortal_Poison


Si desean hacerlo para móviles, también pueden hacerlo con Selendroid.

Posdata: Lo que está comentado luego del while es para dar like a una página de Facebook, en ese caso puse la página de Facebook de underc0de. Si no ven bien las imagenes, pueden dar click derecho, copiar link de la imagen y pegarla en una nueva pestaña, te aseguro que se verá mejor.

Y bueno chic@s, espero que les haya servido, ya les traeré un post más completo de cómo usar esto pero enfocado netamente a la seguridad ofensiva ;D. Cualquier sugerencia / duda / aporte será bien recibido.

Podrían compartir sus bots con Selenium en éste hilo, y así podríamos crear uno que sea útil para cualquier cosa.

Pueden ver una demo muy corta que creé aquí:


Become the change you seek in the world. -Gandhi.


¡¡Muy buen aporte!! Esta explicado muy bien, gracias por compartirlo.

Atr0m

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
¡¡Muy buen aporte!! Esta explicado muy bien, gracias por compartirlo.

Atr0m

Muchas gracias Atr0m, intenté hacerla lo más detallada posible :). Un saludo.
Become the change you seek in the world. -Gandhi.



  @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Es reconfortante ponerse a leer un aporte como el tuyo.
Más allá de la técnica (que es interesante), es la forma que está planteado.

Concatenación lógica de la explicación, claridad e ilustraciones que cooperan en el entendimiento e ilustran a modo de ejemplo.

Me gustó muchísimo tu aporte!

Gracias y + Karma.

Saludos

Gabriela
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

  @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Es reconfortante ponerse a leer un aporte como el tuyo.
Más allá de la técnica (que es interesante), es la forma que está planteado.

Concatenación lógica de la explicación, claridad e ilustraciones que cooperan en el entendimiento e ilustran a modo de ejemplo.

Me gustó muchísimo tu aporte!

Gracias y + Karma.

Saludos

Gabriela

Gracias a ti @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta , realmente me agrada mucho que te haya gustado. Espero que nos podamos seguir viendo en el foro :).

Un abrazo.
Become the change you seek in the world. -Gandhi.


Bro una pregunta esto también se puede hacer para una aplicación para android?

Muy buen aporte compañero
Bien detallado y explicado  ;D
Gracias!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Bro una pregunta esto también se puede hacer para una aplicación para android?

Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta,

Claro que sí, por eso mismo puse que para móviles sería con Selendroid.

Un saludo.
Become the change you seek in the world. -Gandhi.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy buen aporte compañero
Bien detallado y explicado  ;D
Gracias!

Hola Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta,

Muchas gracias, realmente agradezco el apoyo de la comunidad. Tengo en mente más post de mayor calidad.

Un saludo  ;D.
Become the change you seek in the world. -Gandhi.


Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, hemos publicado el artículo en el Blog de Underc0de, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Gracias por permitirnos compartirlo.

Un saludo .!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, hemos publicado el artículo en el Blog de Underc0de, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Gracias por permitirnos compartirlo.

Un saludo .!

Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta,

¡Qué genialidad! muchísimas gracias, estoy en construcción de otras guías y espero que también le guste a la comunidad.

Un saludo.
Become the change you seek in the world. -Gandhi.


oyes te quedo bien  chidorris tu tema y muy bien explicado. porq yo ocupo q me lo expliquen con manzanitas.

Me gusto que pusieras codigo, explicaras y luego otra vez volvieras a poner el mismo codigo pero ya con los cambios nuevos.  A parte pues las imagenes que ayudan a comprender mejor. Por eso me gusto porque  sta bien explicadito con manzanitas. es codigo facil de entender y limpio . ya que no metites cosas mas pro que eso tal vez confundirian si apenas estas comenzando. pero con ese ejemplo sencichito es sufiente para comenzar.

Muy bien +10 papuu

Hola gente !
Despues de haber luchado  como una semana con esto, no lo podia hacer andar jaja me abria el navegador pero no entraba a la pagina, se quedaba el firefox en blanco.
Les comparto la solución que funcionó para mi, era desactivar marionette. Por lo que la forma de importar el geckodriver me quedó de esta manera:

Código: php

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

cap = DesiredCapabilities().FIREFOX
cap["marionette"] = False
driver = webdriver.Firefox(capabilities=cap, executable_path='/home/user/geckodriver')




Con la fuerza del mar, con la paz del rio