Erstellen Sie mit Python und GAS Termine für AtCoder-Wettbewerbe in Google Kalender

zunaechst

Der AtCoder-Wettbewerb findet unregelmäßig statt, aber ich habe manchmal vergessen, ihn zu planen, und es schien meine Familie zu stören, deshalb habe ich beschlossen, ihn zu automatisieren (ich weiß nicht, ob ich das kann). Ich habe Google Colaboratory für die Ausführung verwendet. Als Anfänger in der Programmierung kann der Code unordentlich oder falsch sein. Es tut uns leid.

Vom AtCoder zum Google Kalender

Verfahren

  1. Scraping von AtCoder mit Python-Anfragen, Beautiful Soup usw.
  2. Sammeln Sie die kratzenden Daten mit Pythons gspread usw. in Google Spread Sheets.
  3. Erstellen Sie einen Termin in Google Kalender mit GAS aus Google SpreadSheets

1. Schaben

Tatsächlicher Code Holen Sie sich nur den Namen, das Datum und den Link des geplanten AtCoder-Wettbewerbs aus der "Wettbewerbsliste" auf der AtCoder-Homepage und machen Sie daraus eine Liste.

from bs4 import BeautifulSoup #Import von schöner Suppe
import requests #Importanforderungen
import datetime
import re

url = "https://atcoder.jp/contests/"
response = requests.get(url).text
soup = BeautifulSoup(response, 'html.parser') #Schöne Suppeninitialisierung
tags = soup.select("tbody a") #Wählen Sie alle Tags unter tbody aus

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

now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M') #Holen Sie sich das aktuelle Jahr, Monat, Tag, Uhrzeit

for i in tags:
  l.append(i.text) #Holen Sie sich den Text in das a-Tag
  l.append(i.get("href")) #Holen Sie sich den Link an das a-Tag angehängt
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]): #Entfernen Sie vergangene Wettbewerbe aus der Liste
    l_n.append(l[i])
for i in range(len(l_n)):
  l_link.append("https://atcoder.jp"+l_n[i][2]) #Ändern Sie den relativen Link in den absoluten Link

Es war schwierig, die Startzeit, die Endzeit, die Bewertung und die Strafen des Wettbewerbs zu ermitteln, deshalb bin ich zu jedem Link gesprungen, um ihn zu erhalten.

for i in l_link:
  url_n=i
  response_n = requests.get(url_n).text
  soup_n = BeautifulSoup(response_n, 'html.parser') #Schöne Suppeninitialisierung
  tags2=soup_n.select("span.mr-2")+soup_n.select("small.contest-duration") #Bewertung, Strafe, Haltezeit usw.
  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]

(Referenz: https://dividable.net/programming/python/python-scraping)

2. Übertragen Sie Daten in eine Tabelle

Fügen Sie die abgerufenen Daten in eine Tabelle ein.

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) #Geben Sie das erste Blatt einer Tabelle mit dem Namen AtCoderNewContestList an

for i in range(len(l_n)):
  if worksheet.update_acell("B"+str(i+2),l_n[i][1]) in worksheet.range('B2:B10'): #Nicht verarbeiten, wenn der Wettbewerb bereits hinzugefügt wurde
    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),"")

Das Ergebnis ist unten. image.png Es funktioniert ziemlich gut.

3. Termin mit GAS hinzufügen

Fügen Sie mithilfe von GAS Termine zu Google Kalender hinzu. Aus verschiedenen Gründen habe ich beschlossen, ein neues Google-Konto zu erstellen, auf die erstellte Tabelle zuzugreifen und einen Zeitplan zum Extrahieren von Daten mit GAS zu erstellen. Ich kann nicht mehr auf das Konto zugreifen, das ich zu Beginn erstellt habe. Warum? Sie können GAS-Code schreiben, indem Sie "Skript-Editor" unter "Extras" in der Tabelle auswählen. (GAS kann den Inhalt des Codes verstehen, aber nicht schreiben, daher habe ich den Code auf der folgenden Site kopiert und bearbeitet.) (Referenz: https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15)


function myFunction() {
  //Holen Sie sich das Blatt der aktuell ausgewählten Tabelle
  var sheet = SpreadsheetApp.getActiveSheet();
  //Holen Sie sich den Inhalt der Zelle aus dem erhaltenen Blatt
  var values = sheet.getDataRange().getValues();
  var calendar = CalendarApp.getDefaultCalendar();
  //* Der 0. Teil von var i ist der Header. Beginnen Sie also bei 1.
  for (var i = 1; i < values.length; i++) {
    var status = values[i][0];
    if (
      status != "Bereits" // 連携の欄がBereitsになっていなかったら処理を行う
    ) {
      //geplantes Datum
      var date = values[i][2];

      //Startzeit
      var startTime = values[i][3];
      var startDateTime = new Date(date.getFullYear(),
                                   date.getMonth(),
                                   date.getDate(), 
                                   startTime.getHours(),
                                   startTime.getMinutes(), 0);
      //Endzeit
      var endTime = values[i][4];
      var endDateTime = new Date(date.getFullYear(),
                                 date.getMonth(),
                                 date.getDate(),
                                 endTime.getHours(),
                                 endTime.getMinutes(), 0);
      //Titel
      var title = values[i][1]+values[i][8];
      var options = {
        description: values[i][7]
      }
      // var event = calendar.createEvent(title, startDateTime, endDateTime);
      //Fügen Sie dem Argument einfach Optionen hinzu
      var event = calendar.createEvent(title, startDateTime, endDateTime, options);
      //Registrieren Sie sich im Kalender
      sheet.getRange(i + 1, 1).setValue("Bereits"); // 連携の欄をBereitsにする
    }
  }
}

Es mag in Ordnung sein, aber ich möchte den Kalender verknüpfen, wenn die Tabelle aktualisiert wird. Setzen Sie also einen Auslöser. (Referenz: [https://auto-worker.com/blog/?p=1646](https://auto-worker.com/blog/?p=1646 https://auto-worker.com/blog/? p = 1646))) Führen Sie unter "Auslöser des aktuellen Projekts" die Funktion aus, wenn das Blatt geändert wird.

Nach der Ausführung Kalender image.png Kalkulationstabelle image.png Ich habs gemacht.

4. Ergänzung

Ich wollte wirklich, dass der Python-Code regelmäßig automatisch ausgeführt wird, aber ich habe ihn gestoppt, weil es ein Ärger wäre.

Recommended Posts

Erstellen Sie mit Python und GAS Termine für AtCoder-Wettbewerbe in Google Kalender
Erstellen und bearbeiten Sie Tabellenkalkulationen in einem beliebigen Ordner auf Google Drive mit Python
Ich habe versucht, den Google-Kalender mit CSV-Terminen mithilfe von Python und Google API zu aktualisieren
Ein Memo mit Python2.7 und Python3 in CentOS
Erstellen und entschlüsseln Sie Caesar-Code mit Python
Lösen mit Ruby und Python AtCoder Tenka1 Programmer Contest C Kumulative Summe
Erstellen Sie eine Python3-Umgebung mit pyenv auf einem Mac und zeigen Sie NetworkX-Diagramme an
Versuchen Sie, Google Chrome mit Python und Selenium auszuführen
Installieren Sie OpenCV 4.0 und Python 3.7 unter Windows 10 mit Anaconda
Löse AtCoder 167 mit Python
Hinweise zur HDR- und RAW-Bildverarbeitung mit Python
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Automatisches Folgen auf Twitter mit Python und Selen! (RPA)
Lösen mit Ruby, Perl, Java und Python AtCoder diverta 2019 Programmierwettbewerb C String Manipulation
Erhalten Sie Kommentare auf Youtube Live mit [Python] und [Pytchat]!
PIL in Python unter Windows8 (für Google App Engine)
Ubuntu 20.04 auf Himbeer-Pi 4 mit OpenCV und mit Python verwenden
E-Mail Hipchat mit Postfix, Fluentd und Python auf Azure
Automatisieren Sie Chrome mit Python und Selen auf Ihrem Chromebook
Bis Sie mit Python unter Windows 7 eine maschinelle Lernumgebung erstellen und ausführen
Erstellen Sie unter Windows eine anständige Shell- und Python-Umgebung
Lassen Sie von Google Text-to-Speech Audiodaten (Kommentare) für Videomaterial erstellen (mit C # - und Python-Beispielen).
Lösen mit Ruby und Python AtCoder ARC 059 C Minimum-Quadrat-Methode
Bis Sie Python Virtualenv unter Windows erstellen und Jupyter starten
Lösen mit Ruby und Python AtCoder ABC178 D Dynamische Planungsmethode
So extrahieren Sie einen Termin in Google Kalender mit Python
Lösen mit Ruby und Python AtCoder ABC151 D Suche nach Breitenpriorität
Lösen mit Ruby und Python AtCoder ABC133 D Kumulative Summe
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
IP-Spoof mit tor unter macOS und mit Python prüfen
Testen Sie Python mit Miniconda unter OS X und Linux mit travis-ci
Lösen mit Ruby und Python AtCoder AISING2020 D Iterative Square-Methode
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 A.
Erstellen Sie ein automatisches Tool zum Überspringen von YouTube-Anzeigen mit Python und OCR
Lösen mit Ruby und Python AtCoder ABC011 C Dynamische Planungsmethode
Lösen mit Ruby und Python AtCoder ABC153 E Dynamische Planungsmethode
Lösen mit Ruby und Python AtCoder ARC067 C Primfaktorisierung
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 B.
Lösen mit Ruby und Python AtCoder ABC138 D Benachbarte Liste
Hinweise zum Bereitstellen von pyenv mit Homebrew und zum Verwalten von Python-Versionen
Deep Learning mit Shogi AI auf Mac und Google Colab
Betreiben Sie die eingeschränkte Freigabe von Google Kalender mit Lambda (Python) [Cloudpack Osaka]
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Löse AtCoder ABC166 mit Python
Hellblau mit AtCoder @Python
Python und Hardware-Verwenden von RS232C mit Python-
Python auf Ruby und wütend Ruby auf Python
Atcoder Acing Programmierwettbewerb Python
Erstellen Sie ein 3D-GIF mit Python3
Lernen Sie Python mit Google Colaboratory
Python mit Pyenv und Venv
Greifen Sie mit Python auf Google Drive zu
Erstellen Sie ein Verzeichnis mit Python
Atcoder Anfänger Wettbewerb 152 Kiroku (Python)
Funktioniert mit Python und R.