Automatiser les congés via Gmail et Python
Session du 29 juillet 2024 à 19h00
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Automatiser les congés via Gmail et Python
Un développeur cherche à extraire automatiquement des données de mails Gmail avec Python pour alimenter des calendriers et calculer les week-ends de repos.
00:00:00 :C'est un projet de quoi ?En gros, je récupère des... enfin j'aimerais, pour l'instant, c'est la partie qui ne fonctionne pas.Ce serait récupérer des données sur des mails, pour que ça les intègre automatiquement sur les calendriers de chaque agent, pour mettre quand ils sont en repos.
00:00:22 :Et ensuite, ce truc-là, je fais un export et il me calcule le nombre de week-ends qu'ils ont dans l'année.OK.Donc, c'est rajouté manuellement, il n'y a pas de problème, ça fonctionne.
00:00:45 :Alors, je ne sais pas si ça vient de mes réglages Gmail.Tu utilises quoi pour récupérer les données dans les mails actuellement ?Comment ?
00:00:57 :T'essayes d'utiliser quoi actuellement pour récupérer les données dans les mails ?Alors, attends, je vais rouvrir la VSCode, je vais regarder ce que j'utilise.Comme ça fait un petit moment, j'étais en vacances, je viens de revenir.
00:01:12 :J'utilise eMapClient.OK.Et eMail.En gros, ce que tu as récupéré, c'est que chaque employé reçoit un mail avec ses heures, c'est ça ?Avec ses journées de repos, oui.
00:01:28 :Avec ses journées de repos, OK.Mais ça, du coup, c'est aussi sur leur calendrier ?Je n'ai pas dit, non ?C'est toi, après, qui veux les mettre sur leur calendrier ?
00:01:37 :Oui, c'est moi qui veux les mettre sur le calendrier.OK.Et c'est quoi le truc derrière qui leur envoie les mails pour les journées de repos ?
00:01:45 :Alors, comme c'est via le boulot, je ne peux pas les récupérer directement.Il y a le truc qui envoie les mails ?Voilà.Donc moi, les mails, je les reçois sur ma boîte professionnelle.
00:01:58 :Je les transfère après sur ma boîte perso.OK.Et j'ai des prints qu'ils sont censés faire à chaque fois pour valider les étapes où est-ce que j'en suis.
00:02:12 :Et j'ai l'impression que je n'arrive pas à me connecter à la boîte mail.Parce qu'en gros, j'ai connecting to email server, donc le print que je lance au début de la connexion.
00:02:23 :Ça s'affiche bien.Par contre, après, je suis censé avoir le nombre de messages trouvés, etc.Et je n'ai rien du tout qui apparaît.C'est bizarre, ça.
00:02:33 :Après, je suppose que Gmail a des sécurités et que, du coup, peut-être que ça bloque au niveau de la connexion.Je pense que c'est ça.
00:02:44 :Il m'a appelé, on t'utilise, tu m'as dit.Ouais.Alors, je t'avoue que là, pour cette partie-là, c'est TchadGPT qui m'aide.Ouais, OK.Je ne maîtrise pas encore assez pour pouvoir faire des trucs comme ça vraiment tout seul.
00:03:01 :J'essaye de voir quelle solution existe déjà un petit peu actuellement.Après, je sais qu'en fonction des réglages de Gmail, tu peux te retrouver que ça ne se connecte pas.
00:03:28 :J'ai vu pas mal de trucs là-dessus.Attends, on va voir tous les paramètres.Est-ce que tu as les identifiants mail de tous les utilisateurs ?
00:03:45 :Non, non, non.Comme je l'utilise dans ma boîte perso, donc je vais essayer de me connecter à ma boîte perso.Ah oui, OK.Il me semble que tu es censé te créer une clé API avec Gmail, avec ton Google,et qu'après ta clé API, tu puisses l'utiliser pour créer une app pour pouvoir accéder et donner les accès que tu veux, tu vois.
00:04:11 :Ouais.Je t'ai envoyé un GitHub que je viens de trouver où il y a une piste là.Alors, il date un petit peu, quoiqu'il a été mis à jour la dernière fois.
00:04:20 :Ça pourra peut-être t'aider.Parce qu'en gros, j'aimais de demander d'utiliser l'OAuth2, cette notification de facteur.Sauf que Python, des fois, ça peut être un peu compliqué.
00:04:36 :Du coup, je pense qu'il faut que tu crées un...Comme il explique sur le GitHub, il faut que tu crées une clé API,il faut que tu crées un token Auth2 avec ta clé client,et que ça va te créer une app.
00:04:59 :Et après, l'app te permettra d'accéder à tes mails.Le truc, ça, ce sera pour tes mails à toi.Mais maintenant, si tu veux accéder aux mails de tes employés, il faut leur identifier.
00:05:09 :Non, mais ce ne sera pas les mails des employés.En fait, les mails qui sont envoyés par le logiciel de planification,je les reçois moi aussi sur ma boîte professionnelle.
00:05:20 :Donc, en fait, je me suis juste transféré.Oui, ok, ok, ça marche.Je me suis transféré.Oui, écoute, essaye de voir le truc que je viens de t'envoyer.
00:05:30 :Il y a moyen que tu aies peut-être une piste.J'en ai marre.Le niveau de mon micro baisse tout seul.Ça m'énerve.Je dois m'entendre de son.
00:05:40 :Oui, dès le moment où c'est plus haut ou moins haut.Ça ne me fait que sur Google Meet.Je ne sais pas pourquoi.Il baisse tout seul.
00:05:47 :Je le vois dans mon logiciel et ça m'énerve.Je n'arrive pas à régler.Ok, on va le faire autrement.Sinon, ça m'enlève le truc.Là, j'accepte les conditions.
00:06:03 :Je vais le faire.Je vais le faire.Je vais le faire.Je vais le faire.Je vais le faire.Je vais le faire.Je vais le faire.
00:06:18 :Je vais le faire.Je vais continuer.Créer un nouveau projet.Nouveau projet.Ok.Donc là, c'est en train de créer le projet.Donc là, je suis bien sur le projet.
00:07:12 :Donc là, je suis bien sur le projet.Tic, tic, tic.Ok.Cliquer sur...Créer des identifiants.Et celle du chargement.Voilà.Oula.Non, à mon avis, c'était pas ça.
00:08:51 :Ça marche pas avec le truc que je t'ai envoyé ?Mais en fait, je suis en train de... ça ressemble pas.Ce que j'ai ne ressemble pas à ce qui est en...
00:09:05 :En photo sur l'écran.En photo sur l'écran, ouais.Donc je suis en train de chercher où est-ce que ce serait.Puis alors, comme c'est en anglais...
00:09:15 :Je vais essayer de regarder avec toi.T'as été sur ta console Google Cloud ?Ouais, ouais, ouais.Ok.En fait, sur le côté, il y a Bibliothèque Rédentielle.
00:09:45 :Donc c'est identifiant.Ok, je clique dessus.Créer des identifiants.Et donc là, idées clients out.Ok.C'est bon, j'ai trouvé où est-ce que c'était.C'est bon, t'as trouvé ? T'inquiète.
00:10:05 :Vous devez d'abord configurer votre écran de consentement.Bon.De toute façon, je n'ai pas le choix, c'est forcément...Ne serait-ce que vous devez faire nos... sur votre liste d'utilisateurs test.
00:10:23 :Une fois que votre application est prête pour l'application, il peut se que vous deviez la faire valider.Ok. Créer.Oh putain, ouais.Il demande de ces trucs.
00:10:52 :Ouais, il va demander pas mal de permissions, trucs comme ça, je pense.Ça aurait été un client mail lambda.Je pense que t'aurais pas eu autant de problèmes.
00:11:03 :Mais je pense que Gmail, ouais, sécurise pas mal leurs trucs.Ouais, ouais, ouais.Tac, tac, tac. Revenir au tableau de bord.Voilà. Alors, si je vais dans identifiant.
00:11:44 :Créer identifiant. Tac, tac.Type d'application.Application de bureau.Création.Je vais enregistrer ça ici.Tac.Client intérieur et client de secrète.Ok.Donc là, le Google Crescent, c'est bon, c'est créé.
00:12:41 :Ok.Par contre, il utilise Python 2. Ça change quelque chose avec Python 3 ?Après, il a mis à jour son code il y a un an, donc je pense que ça doit marcher sur Python 3 aussi.
00:13:07 :Bah...Suivez les étapes pour avoir les identifiants.Et avec les identifiants et clients secrets, run the following command.Tu fais Python 3 au lieu de Python 2 et tu vois si ça marche.
00:13:24 :Si on regarde juste en dessous, tu vois, il met Python 3.Donc je pense qu'il a juste pas mis à jour son readme à 100%.
00:13:31 :Mais vu qu'il l'a mis à jour il y a un an, je pense que c'est déjà du Python 3.Donc tu devrais pouvoir le voir fonctionner avec du Python 3, je pense.
00:13:44 :La syntaxe de la commande n'est pas correcte.Ah bah oui, forcément elle ne fonctionne pas, puisque je n'ai pas mis mes id.Alors, les id sont là normalement.
00:14:17 :Client id.Ça doit être ça.Et voilà.Client secret, il est là.Non, ça ne fonctionne pas.C'est avec quoi comme erreur ?La syntaxe de la commande n'est pas correcte.
00:15:20 :Quand tu fais Python 2 off 2 là ?Ouais.Alors, est-ce que c'est parce que je suis dans l'environnement virtuel ?Ah, peut-être. Je ne sais pas si Achille a mis dans son truc un...
00:15:40 :Il n'a pas l'air d'avoir mis de...Sors de l'environnement virtuel, je pense, parce qu'en fait il n'a pas mis de...Comment on appelle ça ?
00:15:53 :Il n'a pas mis de...J'ai oublié le nom.Tu sais le truc pour installer toutes les libs là, où tu fais Python install.Je bug complètement sur le nom du truc.
00:16:08 :Essaye son environnement virtuel.Ok, ça c'est bon.Tu n'as pas mis du requirement, c'est ça que je voulais dire.Non, toujours pareil.Toujours pareil ?
00:16:28 :T'as collé, t'as remplacé le 2 par un 3 ?J'ai mis Python 3 off 2.Faut que je mette off 3.Ah non, mais après il y a d'autres trucs derrière.
00:16:37 :Generate off 2 token.Client easy.Ouais, alors c'est peut-être ça le problème.Faut que tu remplaces après les...Si j'enlève ça.Faut que tu remplaces entre les trucs, entre les...
00:16:57 :Les crochets par...Python 3, alors là j'ai une autre erreur.Python 3 quand open file.C'est user cedric1.Errno2, no such file or directory.T'as mis quoi ?
00:17:22 :Ça m'a mis ça comme erreur.C'est relevé.T'es sûr que t'es bien dans le même chemin d'accèsde là où il y a ton fichier .python ?
00:17:48 :Normalement si t'es dans le même chemin.Regarde dans ton CMD, vu que t'as quitté ton environnement virtuel,si ton fichier off 2.py est bien au même endroit que tu l'utilises dans ton terminal.
00:18:00 :Comment on fait déjà ?Tu peux faire un ls pour voir ce qu'il y a dans ton dossier.Ls il me dit qu'il n'est pas reconnu en tant que commande interne.
00:18:15 :T'es sur Windows ?Ouais.Ouvre l'explorateur de fichiers et va dans le dossier où il y a ton off 2.py.Tu vas dans le dossier où il y est.
00:18:35 :En fait il est nulle part.Tu peux bien télécharger quelque part.J'ai jamais téléchargé ce truc là, je sais pas.C'est un truc qui est de base avec Python.
00:18:45 :Ah non mais il faut télécharger les fichiers sur le Github.Il faut que tu télécharges les fichiers du Github.Tu télécharges l'archive, tu l'extrais, tu la mets dans un dossier.
00:18:54 :Et tu utilises les fichiers Python que le mec a mis.Tu mets ça dans un dossier sur ton bureau ou quelque part.A chaque fois je mets par sur Github.
00:19:08 :Pour télécharger.Dans le zip.Voilà.Alors.Théoriquement je suis dans le même truc là.Ouais.Et il veut pas.Ouais.Et il veut pas.À moins que je fasse ça.
00:20:20 :Je sais pas si je refais la même.Alors là il m'a mis une autre erreur.Print missing option.Missing parenthèse in call to print.Did you mean print ?
00:20:42 :Dans quel fichier c'était ?Auth2.py.Donc c'est celui là.Line 297.297.Ah oui il a oublié des...Ah oui ok mais il a raté des trucs dans son code.
00:21:04 :Il manque des parenthèses à tous ses prints.Et il y en a en plus.Il faut que tu rajoutes les parenthèses des prints à la main.
00:21:18 :Sur tous les prints qu'il y a dans son fichier.Bon il y en a pas non plus tant que ça.Il doit en avoir une petite quinzaine.
00:21:24 :Tu fais un ctrl F et tu mets print.Et à chaque fois que tu vois un print tu mets une parenthèse devant et derrière.Comme un print classique de Python.
00:21:32 :Ouais.Voilà un petit nombre.Et à mon avis ce que j'ai fait n'était pas bon.Tu penses que t'as pas bien corrigé ?Ouais.Ouais c'est ça.
00:22:28 :Ok.Bon je recommence.Alors.Premier.Là je laisse comme ça.Celui là je laisse, celui là je laisse.Là.À mon avis la parenthèse.Euh.
00:22:49 :Tac, tac, tac, tac, tac.La parenthèse elle doit finir ici.J'en profite pour te demander.Est-ce que t'avais déjà fait toi des projets mensuels sur Doctrine ?
00:23:15 :Non.Parce qu'il n'y en avait plus.Ça c'est le dernier.C'était en décembre je crois.Oui après tu peux quand même les faire même s'ils sont terminés.
00:23:24 :Juste tu pourras pas poster ta solution.Mais ça rien ne t'empêche d'accéder normalement à l'énoncé pour le faire tu vois.Ouais.C'est juste que tu peux pas déposer.
00:23:34 :Mais ok.Parce que du coup là en fait on va en remettre un.J'en ai préparé un et on va le poster là dans trois jours le premier.
00:23:41 :Bah ça m'intéresse justement.Il y aura deux mois pour le faire et c'est un truc autour programmation orienté objet.L'idée c'est de faire une gestion de bibliothèque.
00:23:50 :Tu sais gérer des livres, l'ajout, retirer des livres etc.Mais tout via Terminal.Ouais.C'est un peu pour entraîner les étudiantes aux A mais ça peut être intéressant.
00:24:00 :Ok.Mais du coup je t'expliquerai ça au mentorat jeudi si jamais ça t'intéresse.Jeudi le mentorat ? Non il n'y en a pas jeudi ? C'est mercredi ?
00:24:11 :Non non il a été décalé à jeudi.Ah bah alors ça il faudrait qu'on reçoive un mail ou quelque chose je pense pour ça parce que...
00:24:19 :Normalement il a été décalé.Tu vois hier quand je me suis connecté sur DocStream pour justement regarder quand était les mentorats cette semaine.Ouais.C'était lundi, mercredi, vendredi.
00:24:30 :Du coup il a été décalé à jeudi 19h.Parce qu'en fait mercredi il y avait déjà un truc à 20h donc on n'a pas voulu mettre les deux.
00:24:42 :On est là.Donc hop, ajouter au calendrier.Et donc ça veut dire que celui-là il est supprimé.Voilà.Hop là comme ça c'est bon, c'est mis à jour.
00:24:56 :Normalement je serai là.Bon maintenant j'ai une autre erreur.J'ai l'impression qu'il y a pas mal d'erreurs sur son...Quand je regarde le truc j'ai du jaune partout.
00:25:10 :Ouais.Après souvent dans un environnement à un autre tu retrouves toujours un petit peu d'erreurs etc.Dictobjet anotastribuitaritens.Gros.En gros j'ai eu ça.Il va en manquer une partie.
00:25:46 :Oui, il en manque une partie.Où est-ce que ça s'est arrêté ? Je n'ai pas vu.Oula.Ah oui.Option scope.Ok.Donc après c'est ça qui s'est coupé.
00:26:11 :Ouais forcément les trucs sont censés... les accents sont censés être sous le bon truc mais ça apparaît pas bien.Non mais j'ai gâté.En fait il faut que tu remplaces le iteritems par juste items.
00:26:41 :Parce que du coup iteritems ça date de Python 2 du coup et il a peut-être oublié de mettre à jour ça.Sauf que Python 3 c'est passé en items tout court.
00:26:48 :Iteritems donc juste en items.Ouais.Comme ça.Ok.Save.Donc s'il y en a plusieurs, change les plusieurs cas et ça devrait être pas trop mal.
00:27:02 :Oui il y en a encore. Non il y en a qu'un seul.Ok.Ça c'était pas le problème.Module hurllib.Asso attribute quote.Line 147.
00:27:17 :C'est marqué quoi ?Donc line 147 il a un return hurllib.quote.Et en gros ça me dit qu'il n'y a pas d'attribute quote.Pareil ça doit être du truc qui n'existe plus sous Python 3.
00:27:36 :Ou alors il faut peut-être l'update.Alors je vais regarder ça a été changé par quoi.Ok.Tu rajoutes tout en haut de ce truc un import hurllib.parse.
00:27:53 :Et tu remplaces hurllib.Attends j'importe.Tu m'as dit ?Je t'ai mis l'import.Ah oui.Je t'ai copié-collé.Tu rajoutes cet import là en haut et tu remplaces ton hurllib.quote par ça.
00:28:08 :Hurllib.Parse.quote et je le remplace par parse.quote.Ok.Pareil il y a encore un truc qui a changé en Python 3.Unquote.Alors je suppose que le unquote ça va faire la même chose.
00:28:32 :Je t'ai pas dit après tu me dis si jamais.Je crois qu'il y en avait qu'un seul à changer.Alors line 326.Alors 326 qu'est-ce qu'on a de beau ?
00:28:54 :Autorisation code égale row input.Notification code.Name row input is not defined.Ok.Pareil ça doit être du truc de push.Comment ça s'appelle le truc qui n'existe plus ?
00:29:23 :Je vais regarder.C'est juste input en fait.C'est le input de base.Tu enlèves le row tiré du bas et tu mets juste input.Ok donc il n'y en a pas de doute c'est bon.
00:29:36 :C'est rigolo de voir le nombre de trucs qui ont changé.Ah alors.Tutoristo can visit this hurl and follow the direction.Ça y est t'as enfin ton lien.
00:29:50 :Contrôle click.Open.Accès bloqué.Test n'a pas terminé à la procédure de validation de Google.L'appli est en cours de test et que seuls les testeurs approuvés par le développeur y ont accès.
00:30:11 :C'est moi le développeur.Alors il faudrait que je retourne.Il faut que je retourne dansGoogle console.Voilà.Comment je le partage ?Comment je m'autorise à y accéder ?
00:31:02 :Pourtant je suis propriétaire donc théoriquement je dois accès complet à la plupart des ressources Google Cloud.Ça ne t'affiche pas le truc pour directement y accéder ?
00:31:13 :T'as une erreur comme quoi t'as pas les accès ?En fait quand j'y accède il me demande avec quel compte je veux y accéder.Donc celui-ci est le mien.
00:31:21 :Et là il me demande avec quel compte je veux y accéder.Et là il me demande avec quel compte je veux y accéder.Et là il me demande avec quel compte je veux y accéder.
00:31:30 :Donc celui-ci est le mien.Et ça me met accès refusé.Quand t'as fait la commande t'as bien mis ton client ID et ton client secrète ?
00:31:39 :Ouais.Et quand tu arrives sur l'URL ?Résultat j'ai pas le code de vérification.Vu que je peux pas y accéder.Alors après il m'aide que ça met entre 5 minutes et quelques heures.
00:32:03 :Peut-être que c'est encore pas complètement créé.Peut-être ouais faudrait essayer demain à la limite.Ou plus tard dans la soirée.Ouais je retesterai plus tard dans la soirée je pense.
00:32:14 :Et puis écoute à la limite si tu veux si tu reviens jeudi on pourrait avoir...Est-ce que ça a marché jeudi ?Ouais.Super.Est-ce qu'il y avait d'autres trucs que tu voulais voir ?
00:32:26 :C'est un peu une session privée.Ouais c'est chouette.Il y a personne d'autre donc profite-en si jamais t'avais quelque chose.Non bah là tu vois je me suis dit j'avance sur le projet là.
00:32:39 :Donc c'était ce point là qui me bloquait.Le reste alors je m'en suis beaucoup aidé avec ChatJPT.C'est pas forcément une bonne chose.Ouais après quand c'est un side project tu fais juste ça un petit peu pour toi te faciliter la vie.
00:32:53 :C'est pas mal tu vois.Tu m'as appris des trucs et j'ai vu des erreurs de ChatJPT où je lui disais attention là tu te trompes à tel endroit etc.
00:33:02 :Donc j'arrive à voir les erreurs.Si tu comprends déjà les erreurs c'est déjà bien ouais.Mais quand tu...J'ai recréé mon fichier d'import des agents parce qu'en fait j'ai un fichier Excel où j'ai mis les agents dedans avec leur nom de famille, prénom et la catégorie.
00:33:18 :Leur rôle en gros dans la société.Et je voulais récupérer les infos de ces trucs là pour créer une database avec ça etc.Enfin bon tout ça pour après y avoir sur Panda.
00:33:33 :J'aurais été incapable de le faire de moi même.Oui après c'est sûr que quand on a...C'est à part le niveau expert.Ah bah non.
00:33:45 :Donc voilà.Donc ChatJPT m'aide beaucoup.Ça me permet de voir les...Et t'as ChatJPT Premium ou t'as la version classique ?3.5.3.5 ? Ouais ok.
00:33:57 :Non c'est le 4 maintenant.C'est le 4 mais c'est limité.Ouais ça doit être 15 par jour une connerie comme ça.Non c'est même pas par jour c'est...
00:34:06 :Parce qu'en règle générale je faisais pas mal de...Je sais plus comment on appelle ça les demandes.Et au bout d'un moment ça me disait que voilà c'était bloqué mais c'était bloqué que quelques heures.
00:34:17 :En règle générale c'est bloqué 4 heures je crois un truc dans le genre.Ok.Et tu peux en faire autant après.Ok ok.Bah écoute je sais pas trop comment ça marche leur truc mais...
00:34:27 :Ouais je sais pas.C'est limité quand même.C'est limité mais bon ça...Ouais après ça fait le taf.Voilà.Ça fait le taf.C'est ça.
Aucune occurrence trouvée pour « ».
00:00:00
Introduction au projet
00:00:22
Objectifs du projet
00:00:52
Outils actuels utilisés
00:00:52
Problème de récupération des données
00:01:50
Méthode de réception des mails
00:02:28
Problème de connexion à Gmail
00:03:01
Consultation de ChatGPT pour aider
00:04:01
Création de la clé API
00:12:21
Modification du code pour Python 3
00:17:08
Erreur sur le client ID
00:24:00
Problèmes de validation Google
Bravo, tu es prêt à passer à la suite