【サンプルでPython学習】Googleカレンダーの予定をLINEでリマインドするプログラム

AI
この記事は約7分で読めます。

お題を伝えたらサンプルプログラムを教えてくれるGPTs「Python先生」

サンプルは初心者にやさしく、1つの.pyファイルで動作することを前提に生成してくれます。

ChatGPT - Python先生
お題を伝えればPythonのサンプルコードを作ってくれるPython先生。

1日1ネタ、思いつくままに作ってもらっています。

 

※デバッグは行っていません。プログラミングの参考にしてください。

エラーが出たらGPTさんに聞いてください。対処法も教えてくれるはず。

 

 

スポンサーリンク

お題「Googleカレンダーのイベントを1時間前にLINEにリマインドする」

GoogleカレンダーのイベントをLINEでリマインドする自動化スクリプトを作成するには、Google Calendar APIとLINE Messaging APIの両方を使用します。このプロセスにはいくつかのステップがあります:

  1. Google Calendar API を使用してカレンダーイベントの情報を取得します。
  2. LINE Messaging API を使用してリマインダーメッセージを送信します。
  3. スクリプトを定期的に実行するためのスケジューリング(例:cronジョブ)

ステップ 1: 必要なライブラリのインストール

まず、必要なPythonライブラリをインストールします。

pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib requests

ステップ 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_TOKENYOUR_USER_IDを適切な値に置き換えてください。credentials.jsonもGoogle Cloud Platformからダウンロードしたものに置き換えてください。

注意点

  • LINEでメッセージを送信するユーザーIDは、特定の条件下でのみ取得可能です。通常はLINE Messaging APIを利用してメッセージを送信する際、ユーザーがあらかじめボットを友だちに追加している必要があります。
  • このスクリプトはデモンストレーション目的のものであり、実際の運用にはさらにエラーハンドリングなどの改善が必要です。
  • スクリプトを定期的に実行するには、サーバー上でcronジョブを設定するか、クラウドのスケジュール実行サービス(AWS Lambda、Google Cloud Functions等)を使用すると良いでしょう。

 

もしよろしければ、ブログランキングについても

ポチっとしていただければ嬉しいです。

 


セミリタイアランキング

 

にほんブログ村 その他生活ブログ 早期リタイアへ
にほんブログ村

 

 

タイトルとURLをコピーしました