アラフォーから色々始めるリケジョの独り言

アラフォーになって色々始めてみました手探りでがんばります。

djangoでGoogleカレンダーに予定を登録するアプリを作りたい【1】

DjangoをUdemyの

【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!

でとりあえずかじってみたので、GCPとの連携にチャレンジしたいメモ。

 

【私のレベル】

・100本ノックでPythonを少しかじって、webスクレイピングを何となくと、データ操作を何となく。

・応用情報を学生時代にとって早10数年で、プログラミングとかをやるのはそれ以来ぶり(要はひよっこ以下)

・HTML/CSS/JavaScript等々雰囲気はわかるけどググりながらじゃないと書けない

 

【やりたいこと】

推し関連のイベントの情報をGoogleカレンダーにまとめたい。

登録された情報を任意のGoogleアカウントのカレンダーにエクスポートできるようにしたい。

同じイベントについては情報を更新できるようにしたい。

 

----------------------------

ではスタート。

 

(1)djangoの環境構築

(2)ChatGPTに「djangoGoogleカレンダーに予定を登録するプログラムを作りたい」と聞く

GCP認証情報(クライアント ID、クライアント シークレット)を取得しろとのこと。

(3)以下のサイトを見ながら「クライアントID」と「クライアントシークレット」を発行。(結局これが何なのかは理解してない)

credentials.jsonはmanage.pyと同じフォルダに保存。

dev.classmethod.jp

 

(4)Pythonコードの作成。

 

●ライブラリインストール

pip install google-api-python-client

 

●setting.pyの編集

 ・appの追加(「calenderapp」を作りました)

 ・TEMPLATESにtemplatesフォルダの追加

'DIRS': [BASE_DIR, "templates"],

 ・Googleの認証情報の追加

#Googleの認証情報
GOOGLE_CALENDAR_CLIENT_ID = 'your_client_id'
GOOGLE_CALENDAR_CLIENT_SECRET = 'your_client_secret'
GOOGLE_CALENDAR_REDIRECT_URI = 'your_redirect_uri'

最後のURIって言うのがよくわからず。更にChatGPTに聞く。

すると

GOOGLE_CALENDAR_REDIRECT_URI は、Google Cloud Platform の認証情報設定で指定したリダイレクト URI と一致する必要があります。これは、ユーザーが認証を完了した後にリダイレクトされる URI です。一般的な場合、ローカル環境で開発している場合は、http://localhost:8000 のようなローカルホストの URI を使用できます。ただし、本番環境にデプロイする場合は、実際のドメインやサーバーの URI を使用する必要があります。例えば、https://example.com/google-auth-callback のような URI を使用できます。リダイレクト URI は、Google Cloud Platform の認証情報設定で許可されたものでなければなりません。許可された URI のリストに、開発中や本番環境で使用する URI を追加してください。

とのこと。いったん「http://localhost:8000」で設定しておく。

 

これでsetting.pyはおしまい。

 

●views.pyの編集

ChatGPTの言うままに。

 

# views.py

from django.shortcuts import render
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
import datetime
import pytz

def create_event(request):
    if request.method == 'POST':
        # Google Calendar API にアクセスするための認証フロー
        flow = InstalledAppFlow.from_client_secrets_file(
            'client_secret.json', ['https://www.googleapis.com/auth/calendar.events'])

        creds = flow.run_local_server(port=0)

        # 認証情報をセッションに保存
        request.session['google_token'] = creds.to_json()

        # Google Calendar API のクライアントを構築
        service = build('calendar', 'v3', credentials=creds)

        # イベントの開始時間と終了時間を設定
        start_time = datetime.datetime.now(pytz.utc)
        end_time = start_time + datetime.timedelta(hours=1)

        # イベントのデータ
        event = {
            'summary': 'Test Event',
            'description': 'This is a test event',
            'start': {
                'dateTime': start_time.isoformat(),
                'timeZone': 'UTC',
            },
            'end': {
                'dateTime': end_time.isoformat(),
                'timeZone': 'UTC',
            },
        }

        # イベントをカレンダーに追加
        event = service.events().insert(calendarId='primary', body=event).execute()

        return render(request, 'success.html')
    else:
        return render(request, 'create_event.html')

 

ソースコードの上手い貼り方がわからない・・・)

 

timezoneを「Asia/Tokyo」とかにしてみる。

runserverしてみると、無いModuleが複数あったので、都度pipで補充していく。(この辺も全部ChatGPTに聞きながら)

 

create_event.htmlにPOSTで「登録する」ボタンを作る。

 

プログラムにエラーが出なくなったと思ったら次はGoogle側のエラー。

エラー 400: redirect_uri_mismatch」

って言うのが出た。

 

GCPの方を色々いじってみたけど、結局私はこれで解決した。理由は不明。

note.com

 

まだまだエラーは続く。

次は「このアプリは現在テスト中で、デベロッパーに承認されたテスターのみがアクセスできます。」って出た。

 

これはGCPの「OAuth同意画面」のテストユーザを追加することで解決。

 

これで一応「The authentication flow has completed. You may close this window.」って言うのが出た。

長かった~~~~~