Wenn Sie nicht an Code interessiert sind und nur einen Kalender hinzufügen möchten hier. Wenn Sie ein Google-Konto haben, können Sie es sofort hinzufügen.
In diesem Artikel möchten wir Informationen von HP erhalten und automatisch den folgenden Kalender generieren.
Dieser Wille
Hinatazaka 46 ist eine der Pistengruppen und eine Gruppe, deren Motto "Happy Aura" lautet. Natürlich gibt es viele Menschen, die sich für ihre "** visuelle ", " Helligkeit " und " Einstellung, hart an irgendetwas zu arbeiten **" interessieren, und ich bin einer von ihnen.
Der zuverlässigste Weg, um ihre Aktivitäten zu verfolgen, ist das Überprüfen der Seite "Zeitplan" auf HP. Ich sehe es oft.
Jedoch,
Durch die Einführung des Kalenders von dieser Site ist es auch möglich, wichtige Ereignisse, aber detaillierte Ereignisse (behoben) abzudecken. Es schien, dass es nicht abgedeckt war (unregelmäßige Aktivitäten, die nicht durchgeführt wurden).
Um diese Unzufriedenheit zu beseitigen, habe ich mir überlegt, ** "Ihren Zeitplan in meinem Google Kalender wiederzugeben" ** zu realisieren.
Sie benötigen die Google-API. Informationen zum Verfahren finden Sie in diesem Artikel.
Wenn Sie eine regelmäßige Ausführung durchführen möchten, ist es besser, Cron oder Heroku zu verwenden. Ich persönlich mag Heroku, das nicht auf meinem lokalen PC laufen muss, also benutze ich es. In Bezug auf Heroku habe ich zuvor in My hatena blog erklärt, wie man es verwendet. Wenn Sie möchten, lesen Sie dies bitte.
Die zu erfassenden Informationen sind die folgenden vier.
--Kategorie
Da es am selben Tag mehrere Auftrittsereignisse geben kann,
Informationen werden im Fluss erfasst.
def search_event_each_date(year, month):
url = (
f"https://www.hinatazaka46.com/s/official/media/list?ima=0000&dy={year}{month}"
)
result = requests.get(url)
soup = BeautifulSoup(result.content, features="lxml")
events_each_date = soup.find_all("div", {"class": "p-schedule__list-group"})
time.sleep(3) # NOTE:Beseitigen Sie die Belastung des Servers
return events_each_date
def search_event_info(event_each_date):
event_date_text = remove_blank(event_each_date.contents[1].text)[
:-1
] # NOTE:Erhalten Sie andere Informationen als den Tag
events_time = event_each_date.find_all("div", {"class": "c-schedule__time--list"})
events_name = event_each_date.find_all("p", {"class": "c-schedule__text"})
events_category = event_each_date.find_all("div", {"class": "p-schedule__head"},)
events_link = event_each_date.find_all("li", {"class": "p-schedule__item"})
return event_date_text, events_time, events_name, events_category, events_link
def search_detail_info(event_name, event_category, event_time, event_link):
event_name_text = remove_blank(event_name.text)
event_category_text = remove_blank(event_category.contents[1].text)
event_time_text = remove_blank(event_time.text)
event_link = event_link.find("a")["href"]
active_members = search_active_member(event_link)
return event_name_text, event_category_text, event_time_text, active_members
def search_active_member(link):
try:
url = f"https://www.hinatazaka46.com{link}"
result = requests.get(url)
soup = BeautifulSoup(result.content, features="lxml")
active_members = soup.find("div", {"class": "c-article__tag"}).text
time.sleep(3) # NOTE:Beseitigen Sie die Serverlast
except AttributeError:
active_members = ""
return active_members
def remove_blank(text):
text = text.replace("\n", "")
text = text.replace(" ", "")
return text
** [Ergänzung] ** In der Version 2020/10/14 war es nicht möglich, etwas anderes als medienbezogene Ereignisse korrekt zu erfassen. Ändern Sie es daher wie folgt. (Im obigen Code ist dies bereits wiedergegeben.)
** (vor der Korrektur) **
events_category = event_each_date.find_all(
"div", {"class": "c-schedule__category category_media"}
)
event_category_text = remove_blank(event_category.text)
(Überarbeitet)
events_category = event_each_date.find_all("div", {"class": "p-schedule__head"},)
event_category_text = remove_blank(event_category.contents[1].text)
Jetzt können Ereignisse wie "Geburtstag" und "LIVE" korrekt im Kalender angezeigt werden.
Besonders zeitlich, abhängig von der Notation ――Es ist der nächste Tag, wie "24: 20 ~ 25: 00"
def over24Hdatetime(year, month, day, times):
"""
Konvertieren Sie die Zeit über 24H in datetime
"""
hour, minute = times.split(":")[:-1]
# to minute
minutes = int(hour) * 60 + int(minute)
dt = datetime.datetime(year=int(year), month=int(month), day=int(day))
dt += datetime.timedelta(minutes=minutes)
return dt.strftime("%Y-%m-%dT%H:%M:%S")
def prepare_info_for_calendar(
event_name_text, event_category_text, event_time_text, active_members
):
event_title = f"({event_category_text}){event_name_text}"
if event_time_text == "":
event_start = f"{year}-{month}-{event_date_text}"
event_end = f"{year}-{month}-{event_date_text}"
is_date = True
else:
start, end = search_start_and_end_time(event_time_text)
event_start = over24Hdatetime(year, month, event_date_text, start)
event_end = over24Hdatetime(year, month, event_date_text, end)
is_date = False
return event_title, event_start, event_end, is_date
Das allgemeine Verfahren ist wie folgt.
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
def build_calendar_api():
SCOPES = ["https://www.googleapis.com/auth/calendar"]
creds = None
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as token:
creds = pickle.load(token)
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)
with open("token.pickle", "wb") as token:
pickle.dump(creds, token)
service = build("calendar", "v3", credentials=creds)
return service
Überprüfen Sie vor dem Hinzufügen anhand von "Ereignisname-Zeit", ob es sich um ein zuvor hinzugefügtes Ereignis handelt. Holen Sie sich die Liste dafür mit der Funktion search_events.
def search_events(service, calendar_id, start):
end_datetime = datetime.datetime.strptime(start, "%Y-%m-%d") + relativedelta(
months=1
)
end = end_datetime.strftime("%Y-%m-%d")
events_result = (
service.events()
.list(
calendarId=calendar_id,
timeMin=start + "T00:00:00+09:00", # NOTE:+09:Es ist wichtig, es auf 00 zu setzen. (UTC in JST konvertieren)
timeMax=end + "T23:59:00+09:00", # NOTE;Suchzeitraum bis zum nächsten Monat.
)
.execute()
)
events = events_result.get("items", [])
if not events:
return []
else:
events_starttime = change_event_starttime_to_jst(events)
return [
event["summary"] + "-" + event_starttime
for event, event_starttime in zip(events, events_starttime)
]
def change_event_starttime_to_jst(events):
events_starttime = []
for event in events:
if "date" in event["start"].keys():
events_starttime.append(event["start"]["date"])
else:
str_event_uct_time = event["start"]["dateTime"]
event_jst_time = datetime.datetime.strptime(
str_event_uct_time, "%Y-%m-%dT%H:%M:%S+09:00"
)
str_event_jst_time = event_jst_time.strftime("%Y-%m-%dT%H:%M:%S")
events_starttime.append(str_event_jst_time)
return events_starttime
def add_date_schedule(
event_name, event_category, event_time, event_link, previous_add_event_lists
):
(
event_name_text,
event_category_text,
event_time_text,
active_members,
) = search_detail_info(event_name, event_category, event_time, event_link)
#Vorbereitung der Informationen, die im Kalender berücksichtigt werden sollen
(event_title, event_start, event_end, is_date,) = prepare_info_for_calendar(
event_name_text, event_category_text, event_time_text, active_members,
)
if (
f"{event_title}-{event_start}" in previous_add_event_lists
): # NOTE:Bestehen, wenn der gleiche Termin bereits besteht
pass
else:
add_info_to_calendar(
calendarId, event_title, event_start, event_end, active_members, is_date,
)
def add_info_to_calendar(calendarId, summary, start, end, active_members, is_date):
if is_date:
event = {
"summary": summary,
"description": active_members,
"start": {"date": start, "timeZone": "Japan",},
"end": {"date": end, "timeZone": "Japan",},
}
else:
event = {
"summary": summary,
"description": active_members,
"start": {"dateTime": start, "timeZone": "Japan",},
"end": {"dateTime": end, "timeZone": "Japan",},
}
event = service.events().insert(calendarId=calendarId, body=event,).execute()
Dieses Mal versuche ich, den Zeitplan von diesem Monat bis zu drei Monaten in Google Kalender wiederzugeben. Nur calendarId muss die ID meines Kalenders festlegen.
import time
import pickle
import os.path
import requests
from bs4 import BeautifulSoup
import datetime
from dateutil.relativedelta import relativedelta
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
def build_calendar_api():
SCOPES = ["https://www.googleapis.com/auth/calendar"]
creds = None
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as token:
creds = pickle.load(token)
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)
with open("token.pickle", "wb") as token:
pickle.dump(creds, token)
service = build("calendar", "v3", credentials=creds)
return service
def remove_blank(text):
text = text.replace("\n", "")
text = text.replace(" ", "")
return text
def search_event_each_date(year, month):
url = (
f"https://www.hinatazaka46.com/s/official/media/list?ima=0000&dy={year}{month}"
)
result = requests.get(url)
soup = BeautifulSoup(result.content, features="lxml")
events_each_date = soup.find_all("div", {"class": "p-schedule__list-group"})
time.sleep(3) # NOTE:Beseitigen Sie die Belastung des Servers
return events_each_date
def search_start_and_end_time(event_time_text):
has_end = event_time_text[-1] != "~"
if has_end:
start, end = event_time_text.split("~")
else:
start = event_time_text.split("~")[0]
end = start
start += ":00"
end += ":00"
return start, end
def search_event_info(event_each_date):
event_date_text = remove_blank(event_each_date.contents[1].text)[
:-1
] # NOTE:Erhalten Sie andere Informationen als den Tag
events_time = event_each_date.find_all("div", {"class": "c-schedule__time--list"})
events_name = event_each_date.find_all("p", {"class": "c-schedule__text"})
events_category = event_each_date.find_all("div", {"class": "p-schedule__head"},)
events_link = event_each_date.find_all("li", {"class": "p-schedule__item"})
return event_date_text, events_time, events_name, events_category, events_link
def search_detail_info(event_name, event_category, event_time, event_link):
event_name_text = remove_blank(event_name.text)
event_category_text = remove_blank(event_category.contents[1].text)
event_time_text = remove_blank(event_time.text)
event_link = event_link.find("a")["href"]
active_members = search_active_member(event_link)
return event_name_text, event_category_text, event_time_text, active_members
def search_active_member(link):
try:
url = f"https://www.hinatazaka46.com{link}"
result = requests.get(url)
soup = BeautifulSoup(result.content, features="lxml")
active_members = soup.find("div", {"class": "c-article__tag"}).text
time.sleep(3) # NOTE:Beseitigen Sie die Serverlast
except AttributeError:
active_members = ""
return active_members
def over24Hdatetime(year, month, day, times):
"""
Konvertieren Sie die Zeit über 24H in datetime
"""
hour, minute = times.split(":")[:-1]
# to minute
minutes = int(hour) * 60 + int(minute)
dt = datetime.datetime(year=int(year), month=int(month), day=int(day))
dt += datetime.timedelta(minutes=minutes)
return dt.strftime("%Y-%m-%dT%H:%M:%S")
def prepare_info_for_calendar(
event_name_text, event_category_text, event_time_text, active_members
):
event_title = f"({event_category_text}){event_name_text}"
if event_time_text == "":
event_start = f"{year}-{month}-{event_date_text}"
event_end = f"{year}-{month}-{event_date_text}"
is_date = True
else:
start, end = search_start_and_end_time(event_time_text)
event_start = over24Hdatetime(year, month, event_date_text, start)
event_end = over24Hdatetime(year, month, event_date_text, end)
is_date = False
return event_title, event_start, event_end, is_date
def change_event_starttime_to_jst(events):
events_starttime = []
for event in events:
if "date" in event["start"].keys():
events_starttime.append(event["start"]["date"])
else:
str_event_uct_time = event["start"]["dateTime"]
event_jst_time = datetime.datetime.strptime(
str_event_uct_time, "%Y-%m-%dT%H:%M:%S+09:00"
)
str_event_jst_time = event_jst_time.strftime("%Y-%m-%dT%H:%M:%S")
events_starttime.append(str_event_jst_time)
return events_starttime
def search_events(service, calendar_id, start):
end_datetime = datetime.datetime.strptime(start, "%Y-%m-%d") + relativedelta(
months=1
)
end = end_datetime.strftime("%Y-%m-%d")
events_result = (
service.events()
.list(
calendarId=calendar_id,
timeMin=start + "T00:00:00+09:00", # NOTE:+09:Es ist wichtig, es auf 00 zu setzen. (UTC in JST konvertieren)
timeMax=end + "T23:59:00+09:00", # NOTE;Suchzeitraum bis zum nächsten Monat.
)
.execute()
)
events = events_result.get("items", [])
if not events:
return []
else:
events_starttime = change_event_starttime_to_jst(events)
return [
event["summary"] + "-" + event_starttime
for event, event_starttime in zip(events, events_starttime)
]
def add_date_schedule(
event_name, event_category, event_time, event_link, previous_add_event_lists
):
(
event_name_text,
event_category_text,
event_time_text,
active_members,
) = search_detail_info(event_name, event_category, event_time, event_link)
#Vorbereitung der Informationen, die im Kalender berücksichtigt werden sollen
(event_title, event_start, event_end, is_date,) = prepare_info_for_calendar(
event_name_text, event_category_text, event_time_text, active_members,
)
if (
f"{event_title}-{event_start}" in previous_add_event_lists
): # NOTE:Bestehen, wenn der gleiche Termin bereits besteht
pass
else:
add_info_to_calendar(
calendarId, event_title, event_start, event_end, active_members, is_date,
)
def add_info_to_calendar(calendarId, summary, start, end, active_members, is_date):
if is_date:
event = {
"summary": summary,
"description": active_members,
"start": {"date": start, "timeZone": "Japan",},
"end": {"date": end, "timeZone": "Japan",},
}
else:
event = {
"summary": summary,
"description": active_members,
"start": {"dateTime": start, "timeZone": "Japan",},
"end": {"dateTime": end, "timeZone": "Japan",},
}
event = service.events().insert(calendarId=calendarId, body=event,).execute()
if __name__ == "__main__":
# -------------------------step1:verschiedene Einstellungen-------------------------
#API-System
calendarId = (
"〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜" # NOTE:Meine Kalender-ID
)
service = build_calendar_api()
#Suchbereich
num_search_month = 3 # NOTE;Reflektiert im Kalender bis zum Zeitplan 3 Monate im Voraus
current_search_date = datetime.datetime.now()
year = current_search_date.year
month = current_search_date.month
# -------------------------step2.Informieren Sie sich über jedes Datum-------------------------
for _ in range(num_search_month):
events_each_date = search_event_each_date(year, month)
for event_each_date in events_each_date:
# step3:Holen Sie sich sofort Zeitpläne für einen bestimmten Tag
(
event_date_text,
events_time,
events_name,
events_category,
events_link,
) = search_event_info(event_each_date)
event_date_text = "{:0=2}".format(
int(event_date_text)
) # NOTE;Füllen Sie mit 0, so dass es 2 Stellen wird (z.0-> 01)
start = f"{year}-{month}-{event_date_text}"
previous_add_event_lists = search_events(service, calendarId, start)
# step4:Informationen zum Kalender hinzufügen
for event_name, event_category, event_time, event_link in zip(
events_name, events_category, events_time, events_link
):
add_date_schedule(
event_name,
event_category,
event_time,
event_link,
previous_add_event_lists,
)
# step5:Bis zum nächsten Monat
current_search_date = current_search_date + relativedelta(months=1)
year = current_search_date.year
month = current_search_date.month
In diesem Artikel habe ich vorgestellt, wie der Zeitplan von Hinatazaka 46 in Google Kalender wiedergegeben wird. Dieser Wille
Dieses Mal haben wir uns auf Hinatazaka 46 konzentriert. Wenn Sie jedoch "(1) Verschrotten der erforderlichen Informationen von HP" ändern, können Sie (2) wiederverwenden und den Zeitplan jeder Person in Google Kalender wiedergeben.
━━━━━━━━━━
Wenn Sie Hinatazaka 46 nicht kennen, warum interessieren Sie sich nicht dafür? Persönlich "Treffen wir uns in Hinatazaka", das jeden Sonntag ab 25:05 Uhr im Fernsehen Tokio ausgestrahlt wird. ** ist empfohlen. Sie werden erstaunt sein und sich von der Vielzahl der Fähigkeiten angezogen fühlen, die Sie sich nicht als Idol vorstellen können. Außerdem finde ich es gut, aus dem Song bei Hyugazaka 46 OFFICIAL YouTube CHANNEL zu wissen.
Abgesehen davon ist meine jüngste Empfehlung Herr Yoshika Matsuda, der ein sehr schönes Lächeln hat. Was ist gut?
So extrahieren Sie beliebige Ereignisse in Google Kalender mit Python
Hinzufügen eines Ereignisses zu Google Kalender mit Python
[Python] Abrufen / Hinzufügen von Google Kalender-Terminen mithilfe der Google Kalender-API
Informationen zu Python datetime
━━━━━━━━━━ Hyugazaka46 Homepage
Hyugazaka 46 OFFIZIELLER YouTube-KANAL
Recommended Posts