Selenium - aprende a crear tus propios bots con Python

  • 12 Respuestas
  • 17270 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS

Selenium - aprende a crear tus propios bots con Python

  • en: Octubre 05, 2017, 05:43:11 am
Hola a [email protected],

É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:

Citar
Selenium 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:

You are not allowed to view links. Register or Login


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 > You are not allowed to view links. Register or Login
Descargar > You are not allowed to view links. Register or Login

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: "You are not allowed to view links. Register or LoginENLACE", 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
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from time import sleep
  4. from selenium.common.exceptions import TimeoutException
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. from selenium.webdriver.support.ui import Select
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver.support import expected_conditions
  9. from selenium.common.exceptions import NoSuchElementException
  10.  
  11. driver = webdriver.Firefox(executable_path='C:/Users/Mortal_Poison/Downloads/geckodriver-v0.19.0-win64/geckodriver.exe')
  12. def executeBot():
  13.    input_email_id = "[email protected]"
  14.    input_pwd = "our_password"
  15.    # Get the page. In this case is loggin attempt of Facebook.
  16.    driver.get('https://www.facebook.com/login.php?login_attempt=1&lwv=110')
  17.    print("...Facebook is open...")
  18.    # We find the xpath for insert our email address.
  19.    email = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div/div/div[2]/form/div/div[1]/input")
  20.    # Put mail.
  21.    email.send_keys(input_email_id)
  22.    print("Email put.")
  23.    # We find the xpath for insert our password.
  24.    password = driver.find_element_by_xpath("//input[@id='pass']")
  25.    # Put password.
  26.    password.send_keys(input_pwd)
  27.    print("Password put...")
  28.    # We find xpath of button Login.
  29.    button = driver.find_element_by_xpath("//button[@id='loginbutton']")
  30.    # We click on button of login.
  31.    button.click()
  32.    # Open session.
  33.    print("Facebook account is open.")
  34.    x = 0
  35.    while x<1000:
  36.       driver.get("https://www.facebook.com/sharer.php?u=youtube.com/viinvideoshd")
  37.       postbutton = driver.find_element_by_xpath('//*[@id="u_0_1v"]')
  38.       postbutton.click()
  39.       print("Shared!." , x)
  40.       x = x+1
  41.  
  42.    #driver.get("https://www.facebook.com/Underc0de/")
  43.    #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]')
  44.    #post_textarea.click()
  45.    #print("Liked page.")
  46.  
  47. executeBot()
  48.  
  49.  
  50. # https://www.youtube.com/viinvideoshd
  51. # https://www.viinacademy.com
  52. # 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 [email protected], 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.


Desconectado atr0m

  • *
  • Underc0der
  • Mensajes: 34
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil
¡¡Muy buen aporte!! Esta explicado muy bien, gracias por compartirlo.

Atr0m

Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS
You are not allowed to view links. Register or Login
¡¡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.


Conectado Gabriela

  • *
  • Co Admin
  • Mensajes: 987
  • Actividad:
    56.67%
  • Country: 00
  • Reputación 22
  • Twitter: @hira_io
    • Ver Perfil
    • Email

  @You are not allowed to view links. Register or Login

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.

Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS
You are not allowed to view links. Register or Login

  @You are not allowed to view links. Register or Login

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 @You are not allowed to view links. Register or Login , 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.


Desconectado laryover

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
  • Skype: mathias.locauture
    • Ver Perfil
    • Email
Bro una pregunta esto también se puede hacer para una aplicación para android?

Desconectado b4xf0

  • *
  • Underc0der
  • Mensajes: 7
  • Actividad:
    0%
  • Reputación 0
  • ACAB
    • Ver Perfil
    • Email
Muy buen aporte compañero
Bien detallado y explicado  ;D
Gracias!

Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS
You are not allowed to view links. Register or Login
Bro una pregunta esto también se puede hacer para una aplicación para android?

Hola @You are not allowed to view links. Register or Login,

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.


Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS
You are not allowed to view links. Register or Login
Muy buen aporte compañero
Bien detallado y explicado  ;D
Gracias!

Hola Hola @You are not allowed to view links. Register or Login,

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.


Desconectado xyz

  • *
  • Ex-Staff
  • *****
  • Mensajes: 533
  • Actividad:
    0%
  • Reputación 13
    • Ver Perfil
    • Under0cde
Hola @You are not allowed to view links. Register or Login, hemos publicado el artículo en el Blog de Underc0de, You are not allowed to view links. Register or Login

Gracias por permitirnos compartirlo.

Un saludo .!

Desconectado Mortal_Poison

  • *
  • Ex-Staff
  • *****
  • Mensajes: 203
  • Actividad:
    3.33%
  • Country: co
  • Reputación 16
  • Become the change you seek in the world. -Gandhi.
  • Twitter: https://www.twitter.com/Mortal_Poison_
    • Ver Perfil
    • XECURE-LABS
You are not allowed to view links. Register or Login
Hola @You are not allowed to view links. Register or Login, hemos publicado el artículo en el Blog de Underc0de, You are not allowed to view links. Register or Login

Gracias por permitirnos compartirlo.

Un saludo .!

Hola @You are not allowed to view links. Register or Login,

¡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.


Desconectado rommel360

  • *
  • Underc0der
  • Mensajes: 40
  • Actividad:
    6.67%
  • Reputación 1
    • Ver Perfil
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

Desconectado Bartz

  • *
  • Ex-Staff
  • *****
  • Mensajes: 211
  • Actividad:
    0%
  • Reputación 8
  • ~Afaik~
    • Ver Perfil
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: You are not allowed to view links. Register or Login
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


 

[Código] Yardas a metros - Metros a yardas [Python]

Iniciado por LucaSthefano

Respuestas: 0
Vistas: 3436
Último mensaje Mayo 29, 2011, 01:27:34 am
por LucaSthefano
Python Trojan - By "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 1
Vistas: 4631
Último mensaje Abril 03, 2010, 11:01:59 pm
por Dharok
Python keylogger - by "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 0
Vistas: 4470
Último mensaje Abril 07, 2010, 03:30:22 am
por d33k40
[Código] Entero / No Entero [Ejercicio - Python]

Iniciado por LucaSthefano

Respuestas: 3
Vistas: 3846
Último mensaje Enero 18, 2020, 02:43:53 am
por darkucla
Python phpmyadmin "BruteForce"

Iniciado por linkgl

Respuestas: 2
Vistas: 5162
Último mensaje Agosto 19, 2011, 12:14:37 pm
por linkgl