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を発行すれば解決するはず
先に顔認証したら週間予定を読み上げるのを作成する