DjangoをUdemyの
【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!
でとりあえずかじってみたので、GCPとの連携にチャレンジしたいメモ。
【私のレベル】
・100本ノックでPythonを少しかじって、webスクレイピングを何となくと、データ操作を何となく。
・応用情報を学生時代にとって早10数年で、プログラミングとかをやるのはそれ以来ぶり(要はひよっこ以下)
・HTML/CSS/JavaScript等々雰囲気はわかるけどググりながらじゃないと書けない
【やりたいこと】
推し関連のイベントの情報をGoogleカレンダーにまとめたい。
登録された情報を任意のGoogleアカウントのカレンダーにエクスポートできるようにしたい。
同じイベントについては情報を更新できるようにしたい。
----------------------------
ではスタート。
(1)djangoの環境構築
(2)ChatGPTに「djangoでGoogleカレンダーに予定を登録するプログラムを作りたい」と聞く
→GCPで認証情報(クライアント ID、クライアント シークレット)を取得しろとのこと。
(3)以下のサイトを見ながら「クライアントID」と「クライアントシークレット」を発行。(結局これが何なのかは理解してない)
credentials.jsonはmanage.pyと同じフォルダに保存。
(4)Pythonコードの作成。
●ライブラリインストール
●setting.pyの編集
・appの追加(「calenderapp」を作りました)
・TEMPLATESにtemplatesフォルダの追加
・Googleの認証情報の追加
最後の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 pytzdef 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の方を色々いじってみたけど、結局私はこれで解決した。理由は不明。
まだまだエラーは続く。
次は「このアプリは現在テスト中で、デベロッパーに承認されたテスターのみがアクセスできます。」って出た。
これはGCPの「OAuth同意画面」のテストユーザを追加することで解決。
これで一応「The authentication flow has completed. You may close this window.」って言うのが出た。
長かった~~~~~