Gmailから抽出した本文をOllamaに渡しGoogle カレンダーに登録する
touch main6.py
でファイルを作成
Gmailから抽出したメッセージの本文を、
PDFのテキスト抽出と同様にOllamaに渡すようにコードを変更
Gmailからの本文取得:
gmail_get_latest_unread_message_bodyを使用して、Gmailの本文を取得
Ollamaに渡す:
取得した本文をOllamaに渡して解析
解析結果のフィルタリングとカレンダーへの追加:
PDFからのテキスト処理と同様に、抽出されたイベントをフィルタリングしてカレンダーに追加
以下は、Gmailから抽出した本文をOllamaに渡すようにした修正版コード
from gmail_utils import gmail_init, gmail_get_latest_unread_message_body from ollama_module import parse_text_with_ollama from google_calendar_module import add_events_to_calendar from event_utils import filter_events # Gmail APIの初期化 service = gmail_init() # 最新の未読メッセージの本文を取得 label_id = '' # 取得するラベルID message_body = gmail_get_latest_unread_message_body(service, label_id) if message_body != "No unread messages found.": print("メール本文:") print(message_body) # Ollamaでメール本文を解析 raw_events = parse_text_with_ollama(message_body, model_name='elyza:jp8b') # 抽出されたイベントを表示 print("抽出されたイベント:") for event in raw_events: print(event) # イベントのフィルタリングとフォーマット events = filter_events(raw_events) # 有効なイベントを表示 print("有効なイベント:") for event in events: print(event) # 有効なイベントがある場合のみGoogleカレンダーに追加 if events: add_events_to_calendar(events, calendar_id='primary', token_file='token.json', credentials_file='credentials.json') else: print("有効なイベントがありません。") else: print("未読メッセージが見つかりませんでした。")
実行すると
「Request had insufficient authentication scopes」
これは、Google Calendar APIへのリクエストに対して適切な認証スコープが不足している
現在使用しているスコープがカレンダーイベントの追加(writeアクセス)を許可していないため
スコープに
https://www.googleapis.com/auth/calendar.events
または
https://www.googleapis.com/auth/calendar
を追加し、Googleカレンダーへの書き込み権限を付与する
gmail_utils.pyを修正する
# gmail_utils.py import os.path from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials import base64 import dateutil.parser # スコープの設定 SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'] def decode(encoded): decoded_bytes = base64.urlsafe_b64decode(encoded.encode('ASCII')) decoded_message = decoded_bytes.decode('utf-8') return decoded_message def gmail_get_latest_unread_message_body(service, labelIdsValue): messages = service.users().messages() msg_list = messages.list(userId='me', labelIds=[labelIdsValue], q="is:unread", maxResults=1).execute() if 'messages' not in msg_list: return "No unread messages found." msg = msg_list['messages'][0] msg_id = msg['id'] msg = messages.get(userId='me', id=msg_id, format='full').execute() body = "" if 'parts' in msg['payload']: for part in msg['payload']['parts']: if part['mimeType'] == 'text/plain' and part['body']['size'] > 0: body = decode(part['body']['data']) break else: body = decode(msg['payload']['body']['data']) return body # 本文のみを返す def gmail_get_messages_body_date(msg): headers = msg['payload']['headers'] date_header = next(header['value'] for header in headers if header['name'].lower() == 'date') date = dateutil.parser.parse(date_header).strftime("%Y-%m-%d %H:%M:%S") return date def gmail_init(): creds = None token_path = '../mail_auto/token.json' # token.jsonのパスを指定 if os.path.exists(token_path): creds = Credentials.from_authorized_user_file(token_path, SCOPES) 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.json', SCOPES) creds = flow.run_local_server(port=0) with open('token.json', 'w') as token: token.write(creds.to_json()) service = build('gmail', 'v1', credentials=creds) return service
を書き換えてみる
実験結果のログを見ると
Gmail関連の動作をさせるとエラーになる
このため、tokenが重複しているとエラーを起こす可能性があるのかもしれない
Gmailから取得し
Calendar書き込みするとエラーになり
その後はカレンダー機能を使う他のものも動作しなくなる
しかし一度token.jsonを削除し、再度認証すれば
カレンダー機能は使えるようになっている
とりあえず認証関連はこれで動くので
再度tokenを発行すれば解決するはず
先に顔認証したら週間予定を読み上げるのを作成する