J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python

Je pense qu'il y a beaucoup de gens qui travaillent dans le télétravail / travail à distance en raison de la tourmente du nouveau virus. Le télétravail a été lancé dans l'entreprise pour laquelle je travaille avec la déclaration d'urgence, mais comme il y avait des règles gênantes, j'ai essayé de l'automatiser facilement avec Selenium et Python.

À propos, immédiatement après l'annulation de la déclaration d'urgence, nous avons commencé à travailler au bureau de base et parfois à domicile.

À vos risques et périls

Veuillez utiliser ** auto-responsabilité ** pour introduire dans cet article. Il y a aussi une telle approche, j'espère que vous pouvez la voir avec une sensation de température. Je vous laisse imaginer si je l'utilise.

Cette fois, nous ne parlons que du système d'origine interne installé sur le serveur interne. Bien sûr, il existe de nombreux services pour lesquels l'automatisation est interdite, donc lorsque vous l'utilisez en tant que service externe, veuillez vous assurer qu'il ne viole pas les conditions d'utilisation avant de prendre vos propres risques.

Maintenant que l'introduction est terminée, automatisons-la immédiatement.

Environnement et règles du télétravail

Je pense qu'il existe différentes règles de télétravail dans le monde, mais cette fois, je parlerai en fonction de l'environnement et des règles suivants.

environnement

Règles de démarrage du travail de télétravail

En d'autres termes, vous devez vous connecter au VPN peu de temps avant le début des travaux (9h00), envoyer du contenu similaire par chat et par e-mail tous les jours et l'enregistrer dans le système de gestion du travail de l'entreprise. Avec cela, je dois me lever avant le début du travail, démarrer le PC, connecter le VPN, etc., donc je n'ai pas l'impression d'avoir plus de temps à perdre le matin même si je n'ai plus de temps de trajet.

~~ Surtout, il est difficile de se lever au début du travail à cause de cela. ~~

Essayez d'automatiser avec Selenium et Python

Heureusement, tous les systèmes internes sont accessibles à partir d'un navigateur, alors essayons d'exécuter Selenium, qui est familier avec l'automatisation du navigateur, en Python.

Automatisation du chat

En ce qui concerne le chat, le canal à écrire et le libellé sont fixes, de sorte qu'il peut être facilement automatisé de la même manière qu'un être humain fonctionne. Prenons comme exemple l'outil de chat "Mattermost" pour on-premise.

driver = webdriver.Chrome()
#Connectez-vous à Mattermost
driver.get("http://192.168.0.100/system-dev/channels/remotework") #Canal de télétravail
time.sleep(5)
driver.find_element_by_name("loginId").send_keys("[email protected]") #Nom d'utilisateur(adresse mail)
driver.find_element_by_name("password").send_keys("Password") #mot de passe
time.sleep(1)
driver.find_element_by_id("loginButton").click() #Appuyez sur le bouton de connexion
time.sleep(5)
chatbox = driver.find_element_by_id("post_textbox") #Obtenir le champ de saisie du chat
#Contenu à écrire à partir d'ici
chatbox.send_keys("Bonjour. C'est un animal de compagnie.")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("[Heures de travail d'aujourd'hui]")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("Heures de travail prévues: 09:00 - 18:00")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("【Pause déjeuner(1.0h)】")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("Temps de pause prévu: 12:00 - 13:00")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("[Autre]")
chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
chatbox.send_keys("Aucun")
#Jusque là
chatbox.submit()
time.sleep(5)
driver.quit()

Comme cela, démarrez le navigateur → accédez à l'URL du canal spécifié → connexion → l'écriture du chat est automatisée. time.sleep est un processus qui attend juste la partie où le processus semble s'exécuter après le chargement de la page. Cela fonctionne probablement sans cela, mais c'est une assurance.

Lorsque vous démarrez le navigateur avec Selenium, il démarre essentiellement dans un état vide comme une fenêtre secrète où l'ID et le mot de passe ne sont pas mémorisés, vous devez donc entrer le processus de connexion, mais à part cela, vous devez manuellement C'est le même que le travail à faire.

J'entre le contenu du chat avec un saut de ligne, mais dans mon environnement, je peux le faire avec Shift + Enter. Je pense qu'il existe un outil qui coupe une ligne avec Ctrl + Entrée, alors modifiez-le si nécessaire.

Après cela, lors du test, veuillez tester en créant une chaîne pour une seule personne. Si vous faites une erreur dans la production, vous serez probablement méfiant.

Automatisation des e-mails

Le système de messagerie est accessible à partir d'un navigateur et le courrier peut être reçu et envoyé à partir du navigateur, j'ai donc essayé de l'automatiser. Le système de messagerie qui peut être utilisé avec le navigateur est exploité par une autre entreprise, mais cela devrait être correct car les conditions d'utilisation n'indiquaient pas que l'automatisation est inutile.

Démarrez le navigateur → Accéder à l'URL du système de messagerie → Connexion → Créer un nouvel e-mail → Entrer le contenu de l'e-mail → Envoyer Ce n'est pas différent du chat honnête.

Le code n'est pas très différent du précédent, mais comme il y avait une règle dans l'e-mail pour mettre la date dans le sujet, j'écrirai le traitement autour de cela comme un exemple.

"[Projet d'élevage de l'entreprise] [Début de l'emploi]" + datetime.date.today().strftime("%Y%m%d") + "Rapport d'étape (animal de compagnie Taro)"

Le sujet devait être quelque chose comme "[nom du projet] [début de l'emploi] rapport d'étape 2020/10/01 (nom)", j'ai donc obtenu la date au moment de l'exécution et l'ai automatisée.

Après cela, l'écran de composition du courrier est affiché dans une fenêtre séparée, j'ai donc ajouté un processus pour changer la fenêtre de focus (fenêtre cible de l'opération).

driver.switch_to.window(driver.window_handles[1])

Il semble que les fenêtres soient gérées par une chaîne de caractères appelée handle de fenêtre, mais cette fois, elle n'apparaît qu'une seule fois, alors spécifiez driver.window_handles [1] et spécifiez la première fenêtre ouverte driver.window_handles [0] Il est spécifié comme une fenêtre ouverte à côté de.

Il semble que vous puissiez utiliser driver.window_handles [-1] pour spécifier la dernière fenêtre ouverte.

Le système de gestion du travail est automatisé avec le même sentiment

C'est presque la même chose quand on va aussi loin. Appuyez simplement sur l'URL → connectez-vous → écrivez quelque chose comme opérer. Lorsque vous l'utilisez, vous spécifiez simplement l'élément avec «id» ou «nom de classe», vous devez donc le récupérer avec les outils de développement.

Planifier l'exécution

Une fois l'automatisation des opérations dans Selenium terminée, l'étape suivante consiste à implémenter une exécution planifiée.

Plus précisément, ces opérations automatisées doivent être effectuées «comme si vous étiez au travail».

Dans cet exemple, il sera 9h00, mais si vous commencez à 9h00, avez-vous une place à 9h00?

Je pense que je serai assis un peu avant 9h00. En revanche, il y a des moments où vous êtes retardé de quelques minutes, comme un léger retard dans le train ou un train manqué, non? Même si vous prenez le même train tous les jours, l'heure à laquelle vous vous rendez au travail peut varier de quelques minutes en fonction de la météo et de la température.

En d'autres termes, il n'est pas naturel que les chats et les e-mails ne soient pas envoyés à un moment quelque peu aléatoire juste avant 9h00.

Donc, cette fois, nous mettrons en œuvre le processus pour exécuter le calendrier à un moment aléatoire de 8h50 à 9h00.

chattime = ""

def timeset():
    chattime = random.randint(50, 60)
    if chattime < 10:
        #Si c'est moins de 10 minutes, remplissez-le avec zéro
        chattime = "0" + str(chattime)
    if chattime == 60:
        #9 pour 60 minutes:Interpréter comme 00
        schedule.every().day.at("09:00").do(job)
        print("09:00")
    else:
        schedule.every().day.at("08:" + str(chattime)).do(job)
        print("08:" + str(chattime))


schedule.every().day.at("08:00").do(timeset)

while True:
    schedule.run_pending()
    time.sleep(60)

Comme ça, j'ai décidé le temps de contacter le travail tous les jours à 8h00 avec une fonction aléatoire, et quand ce moment est venu, j'ai décidé de contacter le travail.

C'est assez grossier en termes de traitement, mais après avoir défini toutes les fonctions, il boucle à l'infini au dernier while True, exécute tout le programme → répète le sommeil pendant 1 minute.

Au moment de l'exécution, enregistrez un planning pour exécuter timeset à 8h00 avec schedule.every (). Day.at (" 08: 00 ") .do (timeset), et dans timeset Des nombres aléatoires de 50 à 60 sont générés et un programme correspondant à ces nombres est en outre enregistré.

Pour correspondre à autre que 50-60, s'il est de 10 minutes ou moins, le début est rempli de 0, et lorsque 60 sort, il est interprété comme 9h00. Cependant, les conditions ont été remplies, donc c'est OK.

Code entier

#!python3.8
import time
import datetime
import schedule
import random
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait


def job():
driver = webdriver.Chrome()
    #Connectez-vous à Mattermost
    driver.get("http://192.168.0.100/system-dev/channels/remotework") #Canal de télétravail
    time.sleep(5)
    driver.find_element_by_name("loginId").send_keys("[email protected]") #Nom d'utilisateur(adresse mail)
    driver.find_element_by_name("password").send_keys("Password") #mot de passe
    time.sleep(1)
    driver.find_element_by_id("loginButton").click() #Appuyez sur le bouton de connexion
    time.sleep(5)
    chatbox = driver.find_element_by_id("post_textbox") #Obtenir le champ de saisie du chat
    #Contenu à écrire à partir d'ici
    chatbox.send_keys("Bonjour. C'est un animal de compagnie.")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("[Heures de travail d'aujourd'hui]")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("Heures de travail prévues: 09:00 - 18:00")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("【Pause déjeuner(1.0h)】")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("Temps de pause prévu: 12:00 - 13:00")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("[Autre]")
    chatbox.send_keys(Keys.SHIFT, Keys.ENTER)
    chatbox.send_keys("Aucun")
    #Jusque là
    chatbox.submit()
    time.sleep(5)
    driver.quit()

    #envoyer un e-mail
    driver = webdriver.Chrome()
    driver.get("https://webmail.example.com/login")
    time.sleep(5)
    #Identifiant de connexion
    driver.find_element_by_name("login_id").send_keys("[email protected]")
    #mot de passe
    driver.find_element_by_name("pass").send_keys("password")
    time.sleep(1)
    driver.find_element_by_xpath("//input[@value='S'identifier']").click()
    time.sleep(5)
    #Écran de composition du courrier
    driver.find_element_by_id("smail").click()
    time.sleep(5)
    driver.switch_to.window(driver.window_handles[1])
    #Écrire un email
    driver.find_element_by_id("to").send_keys("[email protected]")
    driver.find_element_by_id("subject").send_keys(
        "[Projet d'élevage de l'entreprise] [Début de l'emploi]" + datetime.date.today().strftime("%Y%m%d") + "Rapport d'étape (animal de compagnie Taro)"
    )
    driver.find_element_by_id("content").send_keys(
        "Cher Monsieur\n Merci pour votre travail acharné. C'est un animal de compagnie.\n Je voudrais faire rapport sur l'horaire de travail d'aujourd'hui.\n\n [Heures de travail d'aujourd'hui]\n Heures de travail prévues: 09:00 - 18:00\n [Pause déjeuner(1.0h)】\n Temps de pause programmé: 12:00 - 13:00\n [Autre]\n Aucun\n------------------------------------------------------------\n Entreprise Livestock Development Department Co., Ltd.\n Animal de compagnie Taro/ Taro Shachiku \n  mail: [email protected]\n------------------------------------------------------------"
    )
    #envoyer un e-mail
    driver.find_element_by_id("send_mail").click()
    time.sleep(10)
    driver.quit()

    #Entrée du système de présence
    driver = webdriver.Chrome()
    driver.get("http://192.168.0.200/kinmu/login")
    time.sleep(5)
    driver.find_element_by_id("userId").send_keys("114514")
    driver.find_element_by_id("password").send_keys("password")
    driver.find_element_by_class_name("login_button").click()
    time.sleep(10)
    yesterday = datetime.date.today() - datetime.timedelta(days=1)
    driver.find_element_by_id(
        "dailyList["
        + datetime.date.strftime(yesterday, "%d")
        + "].orderList[0].resultEnterTime"
    ).send_keys("0900")
    driver.find_element_by_name("update").click()

    time.sleep(10)
    alert = driver.switch_to.alert
    alert.accept()

    time.sleep(10)
    driver.quit()

    sys.exit()


chattime = ""


def timeset():
    chattime = random.randint(50, 60)
    if chattime < 10:
        chattime = "0" + str(chattime)
    if chattime == 60:
        schedule.every().day.at("09:00").do(job)
        print("09:00")
    else:
        schedule.every().day.at("08:" + str(chattime)).do(job)
        print("08:" + str(chattime))


schedule.every().day.at("08:00").do(timeset)

while True:
    schedule.run_pending()
    time.sleep(60)

Résumé

Il semble que tout le travail de routine qui peut être effectué à partir du navigateur peut être automatisé de cette manière.

Avec cela, même si vous vous levez après 9 heures, prenez un bain puis connectez-vous au VPN, il semble que vous travaillez dur avant 9 heures.

Si vous le faites avant de quitter le travail la veille, même si vous vous levez un peu tard le lendemain, il semble que vous allez travailler, donc c'est sûr!

Cependant, il est possible que les discussions aient été ignorées avant de commencer à travailler correctement, il est donc très important de conserver le dosage et de le maintenir modéré.

J'espère que cela réduira la quantité de putain de travail effectué car "cela n'a pas de sens profond, mais c'est une règle".

Recommended Posts

J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai essayé de créer un linebot (implémentation)
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai essayé de créer un linebot (préparation)
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
Un mémorandum lors de l'acquisition automatique avec du sélénium
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé un langage fonctionnel avec Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [2]. (Essayez de traiter la profondeur avec numpy)
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
Je souhaite créer facilement un modèle de bruit
Vous pouvez facilement créer une interface graphique même avec Python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
Étapes pour créer un bot Twitter avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
Facile à créer une application console Python avec Click
Je veux écrire dans un fichier avec Python
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Je veux facilement implémenter le délai d'expiration en python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Pourquoi ne pas créer facilement une table élégante avec Python?