Antes de nada, he de aclarar que este método solo sirve para aquellas empresas que disponen de un sistema de fichaje vía web, en el que el empleado ha de hacer login en la plataforma de la empresa para registrar la hora de entrada y salida del trabajo.
Si quieres ir directamente a la solución, pulsa aquí, si quieres saber el por qué de construir este método, sigue leyendo 😉
Actualmente trabajo en una gran consultora, y, como no podía ser menos, cuando la ley del registro horario se hizo efectiva, tuvo que adaptarse rápidamente a la legalidad para evitar multas. ¿Cuál fue la solución que plantearon a los trabajadores? Fichar a través de la web corporativa, algo que no está mal, viendo sistemas de otras empresas.
El proceso que sigo es similar al de todos, comienzas la jornada encendiendo tu equipo de trabajo, abres el navegador, entras a la web corporativa, haces login y fichas. Los primeros días no hubo problema, pero, conforme pasaba el tiempo me aburría mucho el proceso, además de que otras jornadas «se me pasaba», por lo que pensé… «que lo haga el ordenador, si es siempre lo mismo», a la máquina nunca se le iba a olvidar ni iba a rechistar por que fuese una tarea aburrida 😜
Índice de contenido
Planteando el escenario
Para este experimento, he destinado un pc que tengo en casa con Linux (distinto al del trabajo), tú puedes usar únicamente el pc del trabajo (veremos cómo en otro post), pero te explico cómo lo he hecho yo.
El pc de sobremesa está programado para que, de Lunes a Viernes, a la hora del inicio y del final de la jornada, si está encendido, comience el proceso de fichar. ¿cómo? Pues muy fácil.
Programando tareas con cron en Linux
Vamos a añadir dos tareas diarias, una a la hora de entrar y otra a la de salir (vamos a explicar solo una tarea, dada la similitud entre ambas), para ello, abrimos la consola y ejecutamos:
crontab -e
Y añadimos esta línea:
13 07 * * 1-5 export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 -u [RUTA_SCRIPT]
- La primera parte especifica cuándo se ejecutará el script: Del día 1 al 5 (Lunes a Viernes), a las 07:13 de la mañana. Esta hora es completamente ajustable a cada caso particular.
- El export del Display se hace necesario por que en estos casos el sistema no asigna por defecto un gestor de ventanas al proceso de python, si no lo ponemos, el proceso fallará, ya que necesitamos que se lance la ventana donde se llevará a cabo el proceso.
- Export PATH se requiere por que el proceso que se lanza no tiene definido el path donde está localizado python al ejecutarse desde cron.
- Con la opción -u forzamos a python a que trabaje de forma «unbuffered», básicamente lo usamos para que se vaya escribiendo en el fichero de salida cualquier cosa que salga por stdout y stderr, si no ponemos esta opción y el proceso falla, no tendremos log para saber cuál fue el problema, puesto que python por defecto va guardando en un buffer el texto de stdout y stderr y lo muestra al finalizar el proceso. Esta parte es opcional.
- [RUTA_SCRIPT] Será la ruta absoluta en tu sistema donde está alojado el script en python que después veremos.
- En la última parte, que solo se muestra en la captura, estoy redirigiendo la salida del proceso a un fichero de salida, esta parte es completamente opcional.

Ahora, cuando el equipo esté encendido y llegue la hora que hemos programado, se ejecutarán automáticamente las tareas.
Aclaro un par de cosas, para que la tarea se ejecute, lo que hago antes de salir a la oficina o empezar a trabajar en casa es encender este segundo pc y olvidarme, después de realizar la tarea tengo programado otro cron para que se apague. Este último ha de hacerse con sudo crontab -e, para el usuario administrador.
Por qué usar Selenium
Selenium es una herramienta que permite automatizar tareas en un navegador, la idea inicial para esta utilidad era realizar tests de UI en desarrollo, aunque de un tiempo hasta aquí también se ha venido usando para tareas como las que hoy nos conciernen.
Para poder usarlo desde nuestro script de python, primero necesitamos descargar el driver para el navegador, en mi caso, chrome. Lo descargamos desde aquí.
Una vez seleccionada la última versión para nuestro sistema operativo, Linux en mi caso, y descargado, lo ideal es colocarlo en el mismo directorio de nuestro script.
Script en Python para fichar en el trabajo
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome(RUTA_DRIVER) driver.get(RUTA_PARA_FICHAR_EMPRESA) time.sleep(6) user = driver.find_element_by_id("login") passwd = driver.find_element_by_id("passwd") user.send_keys(USUARIO_EMPRESA) passwd.send_keys(PASSWORD_EMPRESA) time.sleep(1) passwd.send_keys(Keys.ENTER) time.sleep(15) entrada = driver.find_element_by_css_selector(".content1 .col-sm-6:first-child .time").get_attribute("innerHTML") if entrada == "--:--": boton = driver.find_element_by_css_selector(".content2 button:first-child") boton.click()
Expliquemos paso a paso:
- Los primeros imports son necesarios para usar el webdriver de selenium y poder usar las teclas, por ejemplo, pulsar el intro, además de permitirnos pausar el proceso durante unos segundos con time.
- Definimos una variable driver, hemos de apuntar a la ruta donde hayamos puesto el driver descargado en el paso anterior.
- Con driver.get(RUTA) el script levantará una ventana del navegador con la ruta del sistema de fichaje de nuestra empresa.
- Con time.sleep(6) esperamos 6 segundos, hay veces que el sistema está muy lento y hemos de esperar un poco para que el script no falle, este número depende de cada caso particular.
- Después hemos de buscar el campo usuario y contraseña del login, en este caso los buscamos por id. Similar a un document.getElementById de Javascript.
- Continuamos con el send_keys, esta función rellenará el campo user y password con el parámetro que pasemos, aquí deberíamos colocar las credenciales de acceso al portal.
- Esperamos un segundo y pulsamos la tecla Enter (Keys.ENTER).
- Esperamos 15 segundos a que el sistema haga login, vuelvo a comentar que este valor es dependiente de cada caso particular, nuestra plataforma de vez en cuando se pone muy lenta, como no voy a estar presente. haciendo el proceso, no me importa que esté 15 segundos parado.
- Ahora viene una parte interesante, en la variable entrada, estamos obteniendo el texto (innerHTML) del nodo donde se pinta la hora de entrada, si fichamos a las 09:00, en el nodo cuyo selector es «.content1 .col-sm-6:first-child .time», se pintará un «09:00». En mi sistema de fichaje, cuando aún no he registrado una hora, el texto que aparece es «–:–«. El selector dependerá de cada plataforma.
- Si el texto es «–:–«, es decir, aún no hemos fichado, seleccionamos el botón con el que fichamos, y le hacemos click.
¿Cómo sé cuál es el selector del nodo que tengo que obtener?
Fácil, vamos a la url en cuestión en chrome, y sobre el elemento que queramos, pulsamos con el botón derecho –> inspeccionar. A partir de aquí podemos ver el selector «a mano», o copiando la ruta con esta opción:

¿Y para fichar a la salida?
El proceso sería similar, podríamos crearnos otro script casi idéntico sólo para fichar a la salida y programar otra tarea que se ejecute a la hora de salida, al ser tan similar, no voy a explicarlo, sería replicar lo mismo pero con un par de cambios.
Déjate de historias, yo quiero algo para hacer click y listo
Vale vale, esto está muy bien, pero pensarás.. «yo no tengo linux», o «quiero hacerlo desde mi propio equipo»… ¡Estate atento al blog, en la próxima entrada veremos cómo hacerlo desde un equipo Windows!
Saludos!