PythonでWikimedia APIを使ってWikipediaの記事を取得するのようにPythonとWikimedia APIを使ってWikipediaの記事を取得できるので、これを利用してWikipediaの日本の記念日一覧の記事を取得して、これをもとに記念日のGoogleカレンダーを作成する。
Raspberry PiとRaspbian Stretch。
PythonでWikimedia APIを使ってWikipediaの記事を取得するのコードの「ウィキペディア」を「日本の記念日一覧」に変更して実行する。結果をanniversary_list.txtとして保存しておく。以下のようなWikipedia書式(ヘルプ:書式整形)のテキストになる。
登録に失敗したときのことを考えて、使用中のカレンダーを使わずに記念日登録用のGoogleカレンダーを作成しておく。作成したら「カレンダーの設定」を開いて、「カレンダーの統合」の下にあるカレンダーIDをコピーしておく。
GoogleのCalendar APIでGoogleカレンダーへイベントとして記念日を登録できる。はじめてCalendar APIを使うときは、APIを有効にして認証キーをダウンロードする。
APIの有効化はPython Quickstartにあるリンク「Enable the Google Calendar API」から行う。ログインしたら既存のプロジェクトを選ぶか、新規プロジェクトを作成する。
続いて「DOWNLOAD CLIENT CONFIGURATION」をクリックして認証キーとなるcredentials.jsonをダウンロードする。
GoogleのCalendar APIとPythonでのGoogleカレンダーへのイベント登録は図書館の休館日をGoogleカレンダーに自動登録するでも行っているが、Python Quickstartの内容が更新されているので、改めて確認。
まずは必要ライブラリのインストール。
記念日一覧のテキストanniversary_list.txtと、APIの認証キーcredentials.jsonを同じディレクトリに置いて以下のコードを実行する。コード内の「カレンダーID」は、コピーしておいた登録対象のカレンダーIDと書き換えておく。
カレンダーAPIをはじめて使用するときは、端末にAPIの認証情報を保存する必要がある。ターミナルで実行する場合は以下のように--noauth_local_webserverオプションを付けて実行する。URLが表示されるので、それをコピーして、別PCなどのブラウザで開くとコードが表示される。それをコピーして、ターミナルのコード入力欄にペーストする。これで認証情報が端末に保存されるので、2回目以降は--noauth_local_webserverオプションは不要。
結果は以下のようにGoogleカレンダーに記念日が登録された。
それにしても、世の中にはいろんな記念日があるもんだ・・
環境
Raspberry PiとRaspbian Stretch。
Wikipediaの日本の記念日一覧の取得
PythonでWikimedia APIを使ってWikipediaの記事を取得するのコードの「ウィキペディア」を「日本の記念日一覧」に変更して実行する。結果をanniversary_list.txtとして保存しておく。以下のようなWikipedia書式(ヘルプ:書式整形)のテキストになる。
Googleカレンダーの作成
登録に失敗したときのことを考えて、使用中のカレンダーを使わずに記念日登録用のGoogleカレンダーを作成しておく。作成したら「カレンダーの設定」を開いて、「カレンダーの統合」の下にあるカレンダーIDをコピーしておく。
カレンダーAPIの有効化
GoogleのCalendar APIでGoogleカレンダーへイベントとして記念日を登録できる。はじめてCalendar APIを使うときは、APIを有効にして認証キーをダウンロードする。
APIの有効化はPython Quickstartにあるリンク「Enable the Google Calendar API」から行う。ログインしたら既存のプロジェクトを選ぶか、新規プロジェクトを作成する。

続いて「DOWNLOAD CLIENT CONFIGURATION」をクリックして認証キーとなるcredentials.jsonをダウンロードする。

Googleカレンダーへの記念日の登録
GoogleのCalendar APIとPythonでのGoogleカレンダーへのイベント登録は図書館の休館日をGoogleカレンダーに自動登録するでも行っているが、Python Quickstartの内容が更新されているので、改めて確認。
まずは必要ライブラリのインストール。
記念日一覧のテキストanniversary_list.txtと、APIの認証キーcredentials.jsonを同じディレクトリに置いて以下のコードを実行する。コード内の「カレンダーID」は、コピーしておいた登録対象のカレンダーIDと書き換えておく。
import os
import re
from collections import OrderedDict
from httplib2 import Http
from googleapiclient.discovery import build
from oauth2client import file, client, tools
# カレンダー編集用
SCOPES = 'https://www.googleapis.com/auth/calendar'
# 記念日を登録するカレンダーID
CALENDAR_ID = 'カレンダーID'
def get_credentials():
#認証情報の取得
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir, 'calendar-python-quickstart.json')
store = file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
credentials = tools.run_flow(flow, store)
return credentials
def add_event(anniv_dict):
#Googleカレンダーに記念日を登録
# API利用の認証
credentials = get_credentials()
service = build('calendar', 'v3', http=credentials.authorize(Http()))
# 記念日を登録
for anniv, date in anniv_dict.items():
# 登録イベントに記念日と日付を設定
event = {
'summary': anniv,
'start': {
'date': date,
'timeZone': 'Asia/Tokyo',
},
'end': {
'date': date,
'timeZone': 'Asia/Tokyo',
},
}
# 記念日を登録するGoogleカレンダーIDをcalendarIdに指定し、イベントを登録する
event = service.events().insert(calendarId=CALENDAR_ID, body=event).execute()
if event:
print(event['start'].get('date'), event['summary'])
else:
print('Failed to add an anniversary.')
def create_anniversary_dict():
# Wikipedia書式のテキストから、記念日名をキー、要素を日付とした辞書リストを作成
with open('anniversary_list.txt', 'r') as f:
wiki_list = f.readlines()
wiki_iter = iter(wiki_list)
anniv_dict = OrderedDict()
for i, line in enumerate(wiki_iter):
# 各月の行を取得
m = re.match('== (\d{1,2})月 ==', line)
if m:
try:
pat_day = re.compile('\[\[(\d{1,2})月(\d{1,2})日\|')
pat_name = re.compile('\[\[(.*?)\]\]')
pat_url = re.compile('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+/?')
while True:
anniv_line = next(wiki_iter)
# 日付と記念日部分を分割
# はじめの「-」のみ分割(記念日部分に「-」を含むURLがある場合がある)
anniv_split = anniv_line.strip().split('-', 1)
# 日付の取得
match_day = pat_day.search(anniv_split[0])
if match_day:
# 2月29日は2019年にないので除外
if match_day.group(1) == '2' and match_day.group(2) == '29':
break
# Gogleカレンダーへの登録用にYYYY-MM-DDのフォーマットにする
dt = '2019-{:0>2}-{:0>2}'.format(match_day.group(1), match_day.group(2))
else:
break
# 記念日部分からURLと「[」「]」を除去して記念名そ取得
anniv_name = pat_url.sub('', anniv_split[1]).strip()
match_name = anniv_name.replace('[', '').replace(']', '').split('、')
# 空の要素を除外
match_name = list(filter(lambda x: len(x) != 0, match_name))
for i, name in enumerate(match_name):
# 「|」で区切られているときは後の方が記念日名
name_split = name.split('|')
if len(name_split) > 1:
anniv_dict[name_split[1]] = dt
else:
anniv_dict[name] = dt
except StopIteration as e:
# イテレータの最後までいったらループを抜ける
break
return anniv_dict
if __name__ == '__main__':
add_event(create_anniversary_dict())
カレンダーAPIをはじめて使用するときは、端末にAPIの認証情報を保存する必要がある。ターミナルで実行する場合は以下のように--noauth_local_webserverオプションを付けて実行する。URLが表示されるので、それをコピーして、別PCなどのブラウザで開くとコードが表示される。それをコピーして、ターミナルのコード入力欄にペーストする。これで認証情報が端末に保存されるので、2回目以降は--noauth_local_webserverオプションは不要。
結果は以下のようにGoogleカレンダーに記念日が登録された。

それにしても、世の中にはいろんな記念日があるもんだ・・
0 件のコメント:
コメントを投稿