Gmailから抽出した本文をOllamaに渡しGoogle カレンダーに登録する
1 | touch main6.py |
でファイルを作成
Gmailから抽出したメッセージの本文を、
PDFのテキスト抽出と同様にOllamaに渡すようにコードを変更
Gmailからの本文取得:
gmail_get_latest_unread_message_bodyを使用して、Gmailの本文を取得
Ollamaに渡す:
取得した本文をOllamaに渡して解析
解析結果のフィルタリングとカレンダーへの追加:
PDFからのテキスト処理と同様に、抽出されたイベントをフィルタリングしてカレンダーに追加
以下は、Gmailから抽出した本文をOllamaに渡すようにした修正版コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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( "未読メッセージが見つかりませんでした。" ) |
実行すると
1 | 「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を修正する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # 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 # スコープの設定 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を発行すれば解決するはず
先に顔認証したら週間予定を読み上げるのを作成する