Dieses Mal möchte ich beliebige Zeitpläne aus den folgenden Kalendern extrahieren. Ich wusste nicht, wie ich ** willkürlichen Zeitplan ** anzeigen sollte, also suchte ich ziemlich viel. Immerhin war es ein Blick auf das offizielle Dokument ...
Also dachte ich: "Warum schreibe ich nicht alles?", Also schrieb ich es in Qiita.
Die Grundeinstellungen sind im offiziellen Dokument Python Quickstar beschrieben, daher werde ich die Details überspringen.
Dinge notwendig
Datei --credits.json
Sie können die Datei von [hier] herunterladen (https://developers.google.com/calendar/quickstart/python). Legen Sie es in dasselbe Verzeichnis wie das von Ihnen erstellte Skript "main.py".
Die Kalender-ID finden Sie in Ihren Google Kalender-Einstellungen. Wenn Sie es nicht wissen, googeln Sie bitte oder sehen Sie hier. Wenn Sie [Mein Kalender] → [Name] verwenden, ist die Kalender-ID die Google Mail-Adresse. Davon abgesehen (z. B. "Test" in der folgenden Abbildung) können Sie dies nicht ohne Überprüfung herausfinden.
Wenn Sie die Google Client-Bibliothek nicht installiert haben, installieren Sie sie bitte.
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Die offizielle Beispieldokumentation lautet wie folgt. Wenn Sie dies ein wenig verbessern, können Sie tun, was Sie wollen.
sample1.py
from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
def main():
"""Shows basic usage of the Google Calendar API.
Prints the start and name of the next 10 events on the user's calendar.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
print('Getting the upcoming 10 events')
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=10, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
if not events:
print('No upcoming events found.')
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
print(start, event['summary'])
if __name__ == '__main__':
main()
Die erste Hälfte des offiziellen Dokuments enthält viel Code, aber die Grundlagen sind in Ordnung. Wir werden den Code von "# Call the Calendar API" transformieren. Stellen Sie zunächst die Liste von "events_result" wie folgt als Beispiel ein.
events_result = service.events().list(
calendarId = calendar_id,
q = "test",
timeMin = "2020-02-01T00:00:00+00:00",
timeMax = "2020-02-29T00:00:00+00:00",
timeZone = None,
singleEvents = True,
orderBy = "startTime",
).execute()
events = events_result.get("items", [])
q =" test "
zeigt auf das gesuchte Schlüsselwort. Die Elemente der Liste werden unter hier auf verschiedene Weise beschrieben. Probieren Sie sie daher aus, wenn Sie sie benötigen.
Als Beispiel möchte ich den Zeitplan für Februar 2020 anzeigen, daher geben "timeMin" und "timeMax" den Bereich von Februar mit "datetime" an. Sie müssen hier vorsichtig sein.
Als nächstes werden wir das nachfolgende Skript verbessern. Sie können dies frei einstellen, aber seien Sie vorsichtig, wenn Sie die Beschreibung "Beschreibung" von Google Kalender lesen.
if not events:
print("not found")
for event in events:
start = event['start'].get('dateTime',event['start'].get('date'))
description = event.get('description', "not found")
print(start)
print("Event :",event['summary'])
print("Description :",description,"\n")
Verwenden Sie get. ()
As description = event.get ('description'," not found ")
anstelle vonevent ['description']
. Übrigens, wenn die Beschreibung nicht im Zeitplan steht, wird "nicht gefunden" zurückgegeben.
Ähnliches gilt für "start = event ['start']. Get ('dateTime', event ['start']. Get ('date'))", wenn der Zeitplan eine Zeiteinstellung hat, "dateTime" Wird zurückgegeben, und wenn der Zeitplan den ganzen Tag ist, wird "event ['start']. Get ('date')" zurückgegeben.
Ich werde den obigen Code verbinden. Ich habe den fertigen Mantel darauf gelegt, aber ich habe ihn für andere Arbeiten selbst gemacht. Bitte haben Sie etwas Geduld mit der schlechten Verwendung von Klassen und Funktionen.
main.py
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']
calendar_id = "your calendar id"
class Writer(object):
def __init__(self):
"""Shows basic usage of the Google Calendar API.
Prints the start and name of the next 10 events on the user's calendar.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
self.service = build('calendar', 'v3', credentials=creds)
def google_calendar_reader(self):
events_result = self.service.events().list(
calendarId= calendar_id,
q="test",
timeMin = "2020-02-01T00:00:00+00:00",
timeMax = "2020-02-29T00:00:00+00:00",
timeZone = None,
singleEvents=True,
orderBy="startTime",
).execute()
events = events_result.get("items", [])
if not events:
print("not found")
for event in events:
start = event['start'].get('dateTime',event['start'].get('date'))
description = event.get('description', "not found")
print(start)
print("Event :",event['summary'])
print("Description :",description,"\n")
writer = Writer()
writer.google_calendar_reader()
Das Ausgabeergebnis sieht folgendermaßen aus.
2020-02-03
Event : test 1
Description : This is description of test_1.
2020-02-10T10:00:00+09:00
Event : test 3
Description : not found
2020-02-11
Event : Test
Description : not found
Wenn Sie sagen, dass Sie richtig extrahieren konnten, wissen Sie, dass dies nicht der Fall ist. Schauen wir uns noch einmal den Beispielkalender an.
Natürlich wird "Test" im Testkalender nicht angezeigt, aber "test_4" wird auch nicht angezeigt. Im Gegenteil, das Kapital "Test" wird ausgegeben. Es kann gelesen werden, dass "q =", das hier verwendet wird, nach einem Wort mit einer genauen Schreibweise sucht.
Wenn Sie also "test" anzeigen möchten, müssen Sie "q =" test "setzen, und wenn Sie" test_4 "anzeigen möchten, müssen Sie" q = test_4 "setzen.
Es scheint, dass es je nach Anwendung auf verschiedene Arten verwendet werden kann. Ich habe das Gefühl, dass ich auch Verhaltensweisen analysieren kann, z. B. wie oft und was ich aus meinem Zeitplan heraus mache.
Ich denke darüber nach, es anders zu verwenden ...
Ich hoffe es hilft dir. Bitte weisen Sie auf Fehler hin. (Bitte beachten Sie, dass "" "und" "durcheinander sind. Es tut mir leid.)
Recommended Posts