お題を伝えたらサンプルプログラムを教えてくれるGPTs「Python先生」
サンプルは初心者にやさしく、1つの.pyファイルで動作することを前提に生成してくれます。
ChatGPT - Python先生
お題を伝えればPythonのサンプルコードを作ってくれるPython先生。
1日1ネタ、思いつくままに作ってもらっています。
※デバッグは行っていません。プログラミングの参考にしてください。
エラーが出たらGPTさんに聞いてください。対処法も教えてくれるはず。
お題「Googleカレンダーのイベントを1時間前にLINEにリマインドする」
ステップ 2: Google Calendar APIの設定
- Google Cloud Platformでプロジェクトを作成し、Calendar APIを有効にします。
- OAuth2.0 クライアントIDを作成し、ダウンロードした認証情報を
credentials.json
として保存します。
ステップ 3: LINE Messaging APIの設定
- LINE Developers ConsoleでプロバイダーとMessaging APIチャネルを作成します。
- アクセストークンを取得し、保存します。
ステップ 4: Googleカレンダーのイベントを取得し、LINEでリマインドするスクリプト
以下のサンプルコードは、次の24時間以内に予定されているカレンダーイベントを検索し、イベント開始時間の1時間前にLINEでリマインドを送信します。
import datetime
import pickle
import os.path
import requests
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
# Google Calendar API設定
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
CREDENTIALS_FILE = 'credentials.json'
# LINE Messaging API設定
LINE_TOKEN = 'YOUR_LINE_CHANNEL_ACCESS_TOKEN'
LINE_HEADERS = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + LINE_TOKEN
}
def get_calendar_service():
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_FILE, SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return build('calendar', 'v3', credentials=creds)
def send_line_message(message):
payload = {
"to": "YOUR_USER_ID", # 実際にメッセージを送信するLINEユーザーまたはグループのID
"messages": [
{
"type": "text",
"text": message
}
]
}
requests.post('https://api.line.me/v2/bot/message/push', headers=LINE_HEADERS, json=payload)
def main():
service = get_calendar_service()
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
end = (datetime.datetime.utcnow() + datetime.timedelta(days=1)).isoformat() + 'Z'
events_result = service.events().list(calendarId='primary', timeMin=now, timeMax=end,
singleEvents=True, orderBy='startTime').execute()
events = events_result.get('items', [])
for event in events:
start_time_str = event['start'].get('dateTime', event['start'].get('date'))
start_time = datetime.datetime.fromisoformat(start_time_str[:-6]) # Remove timezone offset
reminder_time = start_time - datetime.timedelta(hours=1)
if reminder_time <= datetime.datetime.utcnow():
event_name = event['summary']
message = f"リマインダー: 「{event_name}」が1時間後に始まります!"
send_line_message(message)
if __name__ == '__main__':
main()
このスクリプトを実行する前に、YOUR_LINE_CHANNEL_ACCESS_TOKEN
とYOUR_USER_ID
を適切な値に置き換えてください。credentials.json
もGoogle Cloud Platformからダウンロードしたものに置き換えてください。
注意点
- LINEでメッセージを送信するユーザーIDは、特定の条件下でのみ取得可能です。通常はLINE Messaging APIを利用してメッセージを送信する際、ユーザーがあらかじめボットを友だちに追加している必要があります。
- このスクリプトはデモンストレーション目的のものであり、実際の運用にはさらにエラーハンドリングなどの改善が必要です。
- スクリプトを定期的に実行するには、サーバー上でcronジョブを設定するか、クラウドのスケジュール実行サービス(AWS Lambda、Google Cloud Functions等)を使用すると良いでしょう。
もしよろしければ、ブログランキングについても
ポチっとしていただければ嬉しいです。