MoneyForward Cloud automatise l'horodatage [Laissez Python faire le problème]

Avertissement

Nous ne sommes pas responsables des dommages causés par le contenu de cet article. Cet article a été écrit comme un passe-temps personnel et n'a rien à voir avec l'entreprise à laquelle j'appartiens. De plus, nous ne recommandons pas d'enfreindre les règles d'entreprise.

Conditions d'utilisation de MoneyForward Cloud Attendance

J'ai vérifié les Conditions d'utilisation, mais je n'ai trouvé aucune description interdisant le fonctionnement automatique depuis l'ordinateur. (Si quelqu'un remarque que vous oubliez, faites-le moi savoir. Je m'arrêterai tout de suite.)

(6) Les actes qui imposent une charge excessive à ce service, aux sites de contenu accessibles via ce service et aux réseaux ou systèmes de fournisseurs d'informations.

(13) Actes pouvant interférer avec le fonctionnement de ce service par notre société

Nous avons déterminé qu'il n'y a pas de problème car cela n'inclut pas le traitement pour accès excessif.

(16) Autres actes que la Société juge inappropriés

S'il vous plaît, MoneyForward, ne le jugez pas inapproprié

Comment j'ai décidé d'automatiser

La fréquentation est estampillée à la même heure tous les matins et le départ est estampillé à la même heure. C'est une déclaration complètement longue. Ce n'est pas quelque chose que les gens font. Ce sera donc automatisé. (Nous attendons le Tsukkomi que le sens de l'estampage n'est pas bon)

Code utilisé

Le code est disponible sur Github. Tout le code n'est pas inclus dans l'article, donc si vous voulez en savoir plus, veuillez consulter le code directement. Je pense qu'il existe un moyen plus élégant, alors n'hésitez pas à lancer un problème ou un PR. S'il vous plaît. https://github.com/Haruka0522/AutoMFKintai

Composition globale

Accédez aux pages Web tamponnées à partir de Python à l'aide de Selenium ↓ Jugement vacances / jour de la semaine en utilisant datetime et jpholiday ↓ Cliquez sur le bouton lorsque l'heure de travail / congé prédéfinie est atteinte

C'est simple!

Passer à travers l'écran de connexion

Code source (extrait)

id_box = self.driver.find_element_by_name("employee_session_form[office_account_name]")
id_box.send_keys(self.company_id)

mail_box = self.driver.find_element_by_name("employee_session_form[account_name_or_email]")
mail_box.send_keys(self.mail)

password_box = self.driver.find_element_by_name("employee_session_form[password]")
password_box.send_keys(self.password)

login_button = self.driver.find_element_by_name("commit")
login_button.click()

Après avoir accédé à l'écran de connexion, spécifiez la zone de saisie par le nom de l'élément et saisissez-y les informations de connexion. Le nom de cet élément peut être trouvé en utilisant le mode développeur en y accédant avec chrome et en appuyant sur la touche F12. C'était une percée de l'écran de connexion qui devait être difficile, mais il était possible de percer facilement.

Mise en garde

Si vous codez en dur le mot de passe, etc. sur le code source et le téléchargez sur Github par erreur, ce sera difficile, alors prenons une méthode telle que l'écriture du mot de passe, etc. dans un fichier texte appelé pass.txt et le lisons. Si vous supprimez pass.txt de la gestion git avec .gitignore, vous n'avez pas à vous soucier de pousser accidentellement.

Cliquez sur le bouton tampon

Code source (extrait)

actions = ActionChains(self.driver)
actions.move_by_offset(480, 250)
actions.click()
actions.perform()

C'est là que j'ai lutté sobrement. Tenter de cliquer en spécifiant l'élément du bouton de tampon n'a pas fonctionné, et comme onclick () a été écrit, j'ai essayé d'exécuter Javascript directement, mais pour une raison quelconque, cela n'a pas fonctionné. Par conséquent, bien que ce ne soit pas une très bonne méthode, j'ai pris la méthode de spécifier les coordonnées de l'écran et de cliquer. Étant donné que la taille de la fenêtre de Chrome est fixée dans le paramètre initial, je pense que cela fonctionnera même si l'environnement change, mais honnêtement, ce n'est pas élégant, je voudrais donc l'améliorer à l'avenir.

Jugement les samedis, dimanches et jours fériés, en semaine

Je ne veux pas tamponner accidentellement les samedis et dimanches. Dans mon cas, je travaille essentiellement les jours de la semaine, donc je l'ai configuré pour tamponner uniquement les jours de semaine.

Code source

def is_holiday(date):
    return date.weekday() >= 5 or jpholiday.is_holiday(date)

J'ai utilisé la bibliothèque datetime et la bibliothèque jpholiday pour déterminer les jours de la semaine. J'ai utilisé datetime pour juger de simples samedis et dimanches, et jppoliday pour juger les jours fériés.

Article de référence

https://qiita.com/hid_tanabe/items/3c5e6e85c6c65f7b38be

Boucle principale

while True:
    dt_now = datetime.datetime.now()
    if is_holiday(datetime.date.today()):  #Jugement en semaine
        continue
    if dt_now.hour == start_time.hour and dt_now.minute == start_time.minute:
        operator.syukkin()
    elif dt_now.hour == end_time.hour and dt_now.minute == end_time.minute:
        operator.taikin()
    else:
        time.sleep(wait_time)

finalement

En l'exécutant sur un ordinateur fonctionnant 24 heures sur 24 (Razpai a l'air bien avec l'économie d'énergie), il tamponnera automatiquement. Je voudrais pouvoir gérer des vacances uniques en coopération avec Google Agenda, etc., et je voudrais avoir un système qui ne nécessite pas d'écrire un tel script en premier lieu. J'ai le sentiment que je pourrais me mettre en colère de tous côtés, mais est-ce que ça va ...?

Recommended Posts

MoneyForward Cloud automatise l'horodatage [Laissez Python faire le problème]
(◎◎) {Laissons Python faire les choses ennuyeuses) ......... (Hé? Laissons Python faire les devoirs} (゜) (゜)
[Version 2020] Laissez Python faire tous les calculs de taxes et de recettes
"Laissez Python faire les choses ennuyeuses" Exercice ~ Command Line Mailer ~
Comprendre la classe python Struggle (1) Déplaçons-la pour le moment
Touchons l'API Vision de Google de Python pour le moment
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Voir python pour la première fois