Créez des rendez-vous pour le concours AtCoder sur Google Agenda avec Python et GAS

en premier

Le concours AtCoder se déroule de manière irrégulière, mais j'oublie parfois de le programmer, et cela semble déranger ma famille, alors j'ai décidé de l'automatiser (je ne sais pas si je peux le faire). J'ai utilisé Google Colaboratory pour l'exécution. Étant un débutant en programmation, le code peut être désordonné ou erroné. Pardon.

D'AtCoder à Google Agenda

procédure

  1. Scraping d'AtCoder à l'aide de requêtes Python, Beautiful Soup, etc.
  2. Collectez les données récupérées dans Google Spread Sheets à l'aide du gspread de Python, etc.
  3. Créez un rendez-vous dans Google Agenda à l'aide de GAS à partir de Google SpreadSheets

1. Grattage

Code réel Obtenez uniquement le nom, la date et le lien du concours programmé AtCoder dans la "Liste des concours" sur la page d'accueil d'AtCoder et créez-en une liste.

from bs4 import BeautifulSoup #Importation de belle soupe
import requests #Importer des demandes
import datetime
import re

url = "https://atcoder.jp/contests/"
response = requests.get(url).text
soup = BeautifulSoup(response, 'html.parser') #Belle initialisation de soupe
tags = soup.select("tbody a") #Sélectionnez toutes les balises sous tbody

l=[]
l_n=[]
l_link=[]
l_n1=[]

now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M') #Obtenez l'année, le mois, le jour et l'heure en cours

for i in tags:
  l.append(i.text) #Récupérez le texte dans la balise a
  l.append(i.get("href")) #Obtenez le lien attaché à la balise a
l.remove("practice contest") 
l.remove("/contests/practice")
l.remove("AtCoder Library Practice Contest")
l.remove("/contests/practice2")
l=[l[i:i + 4] for i in range(0,len(l), 4)]
for i in range(len(l)):
  l[i][0]=l[i][0][0:16]
  del l[i][1]
  if (l[i][0][0:4] > now[0:4]) or (l[i][0][0:4] == now[0:4] and l[i][0][5:7] > now[5:7])
 or (l[i][0][0:4] == now[0:4] and l[i][0][5:7] == now[5:7] and l[i][0][8:10] >= now[8:10]): #Supprimer les concours passés de la liste
    l_n.append(l[i])
for i in range(len(l_n)):
  l_link.append("https://atcoder.jp"+l_n[i][2]) #Changer le lien relatif en lien absolu

Il était difficile d'obtenir l'heure de début, l'heure de fin, le classement et les pénalités du concours, alors j'ai sauté sur chaque lien pour l'obtenir.

for i in l_link:
  url_n=i
  response_n = requests.get(url_n).text
  soup_n = BeautifulSoup(response_n, 'html.parser') #Belle initialisation de soupe
  tags2=soup_n.select("span.mr-2")+soup_n.select("small.contest-duration") #Obtenez évalué, pénalité, temps d'attente, etc.
  for j in tags2:
    l_n1.append(j.text)
l_n1=[l_n1[i:i + 4] for i in range(0,len(l_n1), 4)]
for i in range(len(l_n1)):
  l_n1[i][1]=l_n1[i][1][13:]
  l_n1[i][1]=l_n1[i][1].replace("-","~")
  l_n1[i][2]=l_n1[i][2][9:]
  l_n1[i][3]=re.sub("\n","",l_n1[i][3])
  l_n1[i][3]=re.sub("\t","",l_n1[i][3])
  l_n1[i][3]=l_n1[i][3][54:60]
  del l_n1[i][0]
for i in range(len(l_n)):
  l_n[i]+=l_n1[i]

(Référence: https://dividable.net/programming/python/python-scraping)

2. Transférer les données vers une feuille de calcul

Collez les données récupérées dans une feuille de calcul.

from google.colab import auth
from oauth2client.client import GoogleCredentials
import gspread

auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())
worksheet = gc.open('AtCoderNewContestList').get_worksheet(0) #Spécifiez la première feuille d'une feuille de calcul nommée AtCoderNewContestList

for i in range(len(l_n)):
  if worksheet.update_acell("B"+str(i+2),l_n[i][1]) in worksheet.range('B2:B10'): #Ne pas traiter si le concours a déjà été ajouté
    continue
  else:
    worksheet.update_acell("B"+str(i+2),l_n[i][1])
    worksheet.update_acell("C"+str(i+2), l_n[i][0][0:4]+"/"+l_n[i][0][5:7]+"/"+l_n[i][0][8:10])
    worksheet.update_acell("D"+str(i+2),l_n[i][0][11:])
    worksheet.update_acell("E"+str(i+2),l_n[i][-1])
    worksheet.update_acell("F"+str(i+2),l_n[i][3])
    worksheet.update_acell("G"+str(i+2),l_n[i][4])
    worksheet.update_acell("H"+str(i+2),"https://atcoder.jp"+l_n[i][2])
  worksheet.update_acell("A"+str(i+2),"")

Le résultat est ci-dessous. image.png Cela fonctionne plutôt bien.

3. Ajouter un rendez-vous avec GAS

Ajoutez des rendez-vous à Google Agenda à l'aide de GAS. Pour diverses raisons, j'ai décidé de créer un nouveau compte Google, d'accéder à la feuille de calcul créée et de créer un calendrier pour extraire des données avec GAS. Je ne peux plus accéder au compte que j'ai créé au début. Pourquoi? Vous pouvez écrire du code GAS en sélectionnant "Script Editor" dans "Tools" dans la feuille de calcul. (GAS peut comprendre le contenu du code mais ne peut pas l'écrire, j'ai donc copié et édité le code sur le site ci-dessous.) (Référence: https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15)


function myFunction() {
  //Obtenir la feuille de la feuille de calcul actuellement sélectionnée
  var sheet = SpreadsheetApp.getActiveSheet();
  //Récupérez le contenu de la cellule à partir de la feuille obtenue
  var values = sheet.getDataRange().getValues();
  var calendar = CalendarApp.getDefaultCalendar();
  //* La 0ème partie de var i est l'en-tête, donc commencez par 1.
  for (var i = 1; i < values.length; i++) {
    var status = values[i][0];
    if (
      status != "Déjà" // 連携の欄がDéjàになっていなかったら処理を行う
    ) {
      //date prévue
      var date = values[i][2];

      //Heure de début
      var startTime = values[i][3];
      var startDateTime = new Date(date.getFullYear(),
                                   date.getMonth(),
                                   date.getDate(), 
                                   startTime.getHours(),
                                   startTime.getMinutes(), 0);
      //heure de fin
      var endTime = values[i][4];
      var endDateTime = new Date(date.getFullYear(),
                                 date.getMonth(),
                                 date.getDate(),
                                 endTime.getHours(),
                                 endTime.getMinutes(), 0);
      //Titre
      var title = values[i][1]+values[i][8];
      var options = {
        description: values[i][7]
      }
      // var event = calendar.createEvent(title, startDateTime, endDateTime);
      //Ajoutez simplement des options à l'argument
      var event = calendar.createEvent(title, startDateTime, endDateTime, options);
      //S'inscrire au calendrier
      sheet.getRange(i + 1, 1).setValue("Déjà"); // 連携の欄をDéjàにする
    }
  }
}

Cela peut être bien tel quel, mais je veux lier le calendrier lorsque la feuille de calcul est mise à jour, alors définissez un déclencheur. (Référence: [https://auto-worker.com/blog/?p=1646](https://auto-worker.com/blog/?p=1646 https://auto-worker.com/blog/? p = 1646))) A partir de "Déclenchement du projet en cours", exécutez la fonction lorsque la feuille est modifiée.

Après exécution calendrier image.png Tableur image.png Je l'ai fait.

4. Supplément

Je voulais vraiment que le code Python s'exécute automatiquement sur une base régulière, mais je l'ai arrêté car ce serait un problème.

Recommended Posts

Créez des rendez-vous pour le concours AtCoder sur Google Agenda avec Python et GAS
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
Un mémo contenant Python2.7 et Python3 dans CentOS
Créer et décrypter du code César avec python
Résolution avec Ruby et Python AtCoder Tenka1 Programmer Contest C Somme cumulative
Créez un environnement Python 3 avec pyenv sur Mac et affichez des graphiques Network X
Essayez d'exécuter Google Chrome avec Python et Selenium
Installez OpenCV 4.0 et Python 3.7 sur Windows 10 avec Anaconda
Résolvez AtCoder 167 avec python
Remarques sur le traitement d'images HDR et RAW avec Python
Installez le sélénium sur votre Mac et essayez-le avec python
Suivi automatique sur Twitter avec python et sélénium! (RPA)
Résolution avec Ruby, Perl, Java et Python AtCoder Diverta 2019 Concours de programmation Manipulation de chaînes C
Obtenez des commentaires sur youtube Live avec [python] et [pytchat]!
PIL en Python sur Windows8 (pour Google App Engine)
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
E-mail hipchat avec postfix, fluentd et python sur Azure
Automatisez Chrome avec Python et Selenium sur votre Chromebook
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
Créez un environnement shell et python décent sur Windows
Demandez à Google Text-to-Speech de créer des données audio (narration) pour le matériel vidéo (avec des échantillons C # et Python)
Résolution avec Ruby et Python AtCoder ARC 059 C Méthode du carré minimum
Jusqu'à ce que vous créiez Python Virtualenv sur Windows et lanciez Jupyter
Résolution avec Ruby et Python AtCoder ABC178 D Méthode de planification dynamique
Comment extraire n'importe quel rendez-vous dans Google Agenda avec Python
Résolution avec Ruby et Python AtCoder ABC151 D Recherche de priorité de largeur
Résolution avec Ruby et Python AtCoder ABC133 D Somme cumulée
Créez des jeux LCD (16x2) avec Raspberry Pi et Python
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Usurpation d'adresse IP à l'aide de tor sur macOS et vérification avec python
Tester Python avec Miniconda dans un environnement OS X et Linux avec travis-ci
Résolution avec Ruby et Python AtCoder AISING2020 D Méthode carrée itérative
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
Créer un outil de saut automatique d'annonces YouTube avec Python et OCR
Résolution avec Ruby et Python AtCoder ABC011 C Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ABC153 E Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ARC067 C factorisation premier
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 B
Résolution avec Ruby et Python AtCoder ABC138 D Liste adjacente
Remarques sur le déploiement de pyenv avec Homebrew et la gestion des versions de Python
Apprentissage en profondeur avec Shogi AI sur Mac et Google Colab
Utilisez Google Agenda à partage limité avec Lambda (Python) [cloudpack Osaka]
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Résolvez AtCoder ABC166 avec python
Bleu clair avec AtCoder @Python
Python et matériel - Utilisation de RS232C avec Python -
Python sur Ruby et Ruby en colère sur Python
Concours de programmation Atcoder Acing Python
Créer un gif 3D avec python3
Étudiez Python avec Google Colaboratory
python avec pyenv et venv
Accédez à Google Drive avec Python
Créer un répertoire avec python
Concours Atcoder Débutant 152 Kiroku (python)
Fonctionne avec Python et R