
この世界の多くのプログラムは「会社の業務を回すため」に書かれています。 でも、あなたの生活を便利にするプログラムは、誰も用意してくれません。 PCはあなたの道具であるはずなのに、なぜ他人の仕事ばかりを処理しているのでしょうか?
この連載では、「生活を変えるプログラミング」をテーマに、 LINEとPythonを使って、自分だけの“AI執事ボット”を構築していきます。 第1回は、「LINEに“今日の予定”と送ると、Googleカレンダーから予定を返してくれる」 ──そんな第一歩を、あなたと一緒に作ってみましょう。
このAI執事ボットでできること
「AI執事」と聞いて、最初に何を思い浮かべますか? 実はこのボット、LINEに「今日の予定ある?」と送るだけで、Googleカレンダーから自分の予定を取得して返信してくれるんです。 アプリを開く必要も、カレンダーを探す必要もありません。あなたが送った一言だけで、1日のスタートが整います。
LINEで送るだけで今日の予定がわかる
このAI執事ボットの魅力は、何と言っても「カジュアルに予定を確認できること」です。 普段使っているLINEアプリで「今日の予定」と送るだけ。カレンダーアプリを起動する必要もなく、あなたのスマホに予定が返ってきます。
サンプル送信と返信のイメージ
実際にどんなやりとりになるのか、以下は実際のLINE画面を想定したサンプルです。
ユーザーのメッセージ | AI執事の返信 |
---|---|
今日の予定ある? | 本日(2025年4月14日)の予定は以下の通りです: ・10:00〜 会議(プロジェクトA) ・14:30〜 歯医者 |
あなただけの“自分専用ツール”として活躍
スマートスピーカーやアプリ通知のように、すでに決まったパターンのリマインドとは異なり、 このAI執事ボットはあなたの行動に応じて柔軟に対応します。たとえば「明日の予定は?」「今週の予定教えて」など、 拡張すればどんどん自分好みにカスタマイズできる余地があるのも魅力です。
まずは動作のイメージを掴もう
このAI執事ボットがどのように動いているのか、ざっくりとした流れを見てみましょう。 難しい技術の前に、まずは「どんな順番で処理が進むのか?」を視覚的に理解することで、後のコード理解がスムーズになります。
ボットが動く全体の流れを理解する
このボットは、あなたがLINEで送った言葉を起点として、以下のような流れで動作します。
ステップ | 処理の内容 |
---|---|
① LINEからメッセージ送信 | 「今日の予定ある?」というメッセージが送信される |
② FlaskサーバがWebhookで受信 | FlaskアプリがLINEからのリクエストを受け取る |
③ Googleカレンダーにアクセス | Google APIを使って「今日の予定」を取得する |
④ 予定をLINEへ返信 | 取得した予定をLINE上で返信する |
実際に送ってみたLINE画面のイメージ
以下は実際にAI執事ボットとやり取りしたLINEの例です。スマホで使える自然な操作感を体験できます。

ユーザーのメッセージ | AI執事の返信 |
---|---|
今日の予定ある? | 本日(2025年4月14日)の予定は以下の通りです: ・09:00〜 チームミーティング ・13:30〜 クライアント打ち合わせ |
コードで見るとこうなる
では、「今日の予定」と送られたときに反応して、LINEに返信を返す最低限のコードを見てみましょう。
from flask import Flask, request
from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage
app = Flask(__name__)
@app.route("/callback", methods=['POST'])
def callback():
body = request.get_data(as_text=True)
# 本来は署名検証など必要(ここでは簡略化)
event = ... # メッセージ解析処理(省略)
if event.message.text == "今日の予定ある?":
reply = "・09:00〜 チームミーティング\n・13:30〜 クライアント打ち合わせ"
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply))
return 'OK'
※これはあくまで簡略化したコードです。実際にはGoogle APIによるカレンダー取得処理が含まれます。
出力結果:(ユーザーがLINEで「今日の予定ある?」と送信すると、以下のような返信が返ってきます:)
Lineチャット画面
・09:00〜 チームミーティング
・13:30〜 クライアント打ち合わせ
AI執事ボットの完成コードを見る
ここでは、LINEで「今日の予定ある?」と送るとGoogleカレンダーの内容を返信してくれるAI執事ボットの完成コードを紹介します。 これから分解して説明していく各処理が、どのように1本のコードにまとまっているのかを、まずは全体像として把握してください。
このコードだけで最低限のAI執事が完成
以下は、Flask・LINE Messaging API SDK・Google Calendar APIを組み合わせて構築した最小構成のコードです。 このコードが、あなた専用の執事としてLINEメッセージに反応し、Googleカレンダーの予定を返す動作を実現します。
この記事のコードを動かすには、Google Cloud Platform(GCP)での設定作業(サービスアカウントの作成・API有効化・認証情報の取得など)が完了している必要があります。
これらの手順は、別記事「構築編(近日公開予定)」で詳しく解説予定です。設定がまだの方は、そちらを先に進めてください。
app.py(完成形)
※この記事は、LINE Developers と Google Cloud Platform の設定が完了していることを前提としています。設定手順の詳細は、別記事「構築編(VPS + LINE設定)」で解説しています。取得した値の使い方は以下の表をご確認ください。
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# FlaskとLINE SDK、GoogleカレンダーAPI、日付操作ライブラリをインポート from flask import Flask, request, abort from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage from google.oauth2 import service_account from googleapiclient.discovery import build from datetime import datetime # Flaskアプリケーションのインスタンスを作成 app = Flask(__name__) # LINE Messaging APIの認証情報を設定(各自のトークンとシークレットに置き換える) line_bot_api = LineBotApi("YOUR_CHANNEL_ACCESS_TOKEN") handler = WebhookHandler("YOUR_CHANNEL_SECRET") # LINE Developersで設定したWebhookの受信エンドポイント @app.route("/callback", methods=["POST"]) def callback(): # リクエストヘッダーから署名を取得 signature = request.headers.get("X-Line-Signature") # リクエストボディ(ユーザーからのメッセージなど)をテキスト形式で取得 body = request.get_data(as_text=True) try: # イベントハンドラに処理を渡す handler.handle(body, signature) except InvalidSignatureError: # 署名が不正な場合は400エラーを返す abort(400) return "OK" # メッセージイベント(テキスト)を受け取ったときの処理 @handler.add(MessageEvent, message=TextMessage) def handle_message(event): text = event.message.text # 「今日の予定」と送られてきた場合にGoogleカレンダーから予定を取得して返信 if "今日の予定" in text: reply = get_today_schedule() line_bot_api.reply_message( event.reply_token, TextSendMessage(text=reply) ) # Googleカレンダーから本日の予定を取得する関数 def get_today_schedule(): # Google Calendar API用のスコープ(読み取り専用) SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] # 認証情報(credentials.json)を読み込んで認証 creds = service_account.Credentials.from_service_account_file( "credentials.json", scopes=SCOPES) # Calendar APIクライアントの作成 service = build("calendar", "v3", credentials=creds) # 今日の日付の範囲(00:00〜23:59)をUTCで取得 now = datetime.utcnow() start = now.replace(hour=0, minute=0, second=0).isoformat() + 'Z' end = now.replace(hour=23, minute=59, second=59).isoformat() + 'Z' # Googleカレンダーから予定を取得(primaryはメインカレンダー) events_result = service.events().list( calendarId='primary', timeMin=start, timeMax=end, singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items', []) # 予定がなければその旨を返す if not events: return "本日の予定はありません" # 予定がある場合、リスト形式で整形して返す result = "本日の予定は以下の通りです:" for event in events: start = event['start'].get('dateTime', event['start'].get('date')) summary = event.get('summary', '(タイトルなし)') result += f"\n・{start}〜 {summary}" return result # Flaskアプリをポート5000で起動 if __name__ == "__main__": app.run(host="0.0.0.0", port=5000) |
設定名(記事②で取得) | 使用箇所(記事①のコード) | 備考 |
---|---|---|
LINEのチャネルアクセストークン | line_bot_api = LineBotApi("YOUR_CHANNEL_ACCESS_TOKEN") | .env または直書きでも可 |
LINEのチャネルシークレット | handler = WebhookHandler("YOUR_CHANNEL_SECRET") | .env 使用を推奨 |
Googleサービスアカウントの認証ファイル | service_account.Credentials.from_service_account_file("credentials.json") | 記事②で発行する JSON を配置 |
出力結果:
ユーザーがLINEで「今日の予定ある?」と送信すると、Googleカレンダーに登録された当日の予定がLINEで返信されます。
例:
本日の予定は以下の通りです:
・2025-04-14T10:00:00〜 チーム会議
・2025-04-14T14:30:00〜 歯科予約
このコードはどう構成されているか?
最小構成でも複数のファイルやライブラリを使っています。ここでは、ファイル構成と使用技術を整理します。
ファイル構成
ai-butler/
├── app.py # Flaskアプリ本体
├── credentials.json # Googleサービスアカウントの認証情報
└── requirements.txt # 使用ライブラリ一覧
requirements.txt の中身
flask==2.3.2
line-bot-sdk==2.4.2
google-api-python-client==2.100.0
google-auth==2.22.0
これらのライブラリをインストールすれば、LINEとGoogleカレンダーの連携が可能になります。 ※動作には Python 3.11 環境を想定しています。
コードの処理をひとつずつ理解しよう
先ほど紹介した完成コードの中身を、ひとつずつ具体的に解説していきます。 この章では、LINEからのメッセージ受信からGoogleカレンダーの予定取得、LINEでの返信までの処理を順番に分解して理解していきましょう。
FlaskでLINEメッセージを受け取る部分
LINEから送信されたメッセージは、LINE公式が指定されたURLにHTTPリクエスト(Webhook)を送ることで通知されます。 Flaskアプリでは、そのWebhookを `/callback` で受け取り、LINE SDKを使って処理に渡しています。
受信処理のコード
@app.route("/callback", methods=["POST"])
def callback():
signature = request.headers.get("X-Line-Signature")
body = request.get_data(as_text=True)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return "OK"
出力結果:
LINEユーザーがメッセージを送信すると、この関数が呼び出され、正常なリクエストであれば `"OK"` が返されます。
「今日の予定ありますか?」というメッセージを検出
ユーザーからのメッセージが `"今日の予定"` を含んでいるかどうかを判定します。 条件に一致した場合にのみ、予定を取得してLINEへ返信する処理が走ります。
キーワード検出のコード
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
text = event.message.text
if "今日の予定" in text:
reply = get_today_schedule()
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply)
)
出力結果:
ユーザーが「今日の予定ある?」と送ると、次のような返信がLINEに届きます:
本日の予定は以下の通りです:
・10:00〜 チーム会議
・14:30〜 歯科予約
Googleカレンダーから当日の予定を取得する
条件に一致した場合、Google Calendar APIを使って「今日の予定」を取得します。 日付をUTCで取得し、その日の予定だけを抽出することで、正確な情報が返せるようになっています。
予定取得のコード
def get_today_schedule():
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
creds = service_account.Credentials.from_service_account_file(
"credentials.json", scopes=SCOPES)
service = build("calendar", "v3", credentials=creds)
now = datetime.utcnow()
start = now.replace(hour=0, minute=0, second=0).isoformat() + 'Z'
end = now.replace(hour=23, minute=59, second=59).isoformat() + 'Z'
events_result = service.events().list(
calendarId='primary',
timeMin=start,
timeMax=end,
singleEvents=True,
orderBy='startTime'
).execute()
出力結果:
予定がある場合:
・2025-04-14T10:00:00〜 チーム会議
・2025-04-14T14:30:00〜 歯科予約
予定がない場合:
本日の予定はありません
対象カレンダーの指定について
`calendarId='primary'` は、Googleアカウントのメインカレンダーを指しています。
他のカレンダーを対象にしたい場合は、Googleカレンダーの「設定」からカレンダーIDを確認し、その文字列を `calendarId` に指定してください。
例:
xxxxx@group.calendar.google.com
また、サービスアカウントがそのカレンダーにアクセスできるよう、Googleカレンダーの共有設定で
credentials.json の中の「クライアントメールアドレス」に“閲覧権限”を付与しておく必要があります。
予定をLINEメッセージとして返す処理
取得した予定データをLINEに返すには、見やすい形式に整形してから `TextSendMessage` で送信します。 複数の予定がある場合にも、読みやすいよう1行ずつ表示されるように処理しています。
返信メッセージの整形と送信
result = "本日の予定は以下の通りです:"
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
summary = event.get('summary', '(タイトルなし)')
result += f"\n・{start}〜 {summary}"
出力結果:
本日の予定は以下の通りです:
・2025-04-14T10:00:00〜 チーム会議
・2025-04-14T14:30:00〜 歯科予約
Googleカレンダーをサービスアカウントとつなごう
このAI執事ボットでは、Googleカレンダーから予定を取得するために「サービスアカウント」という仕組みを使います。これは、Googleが提供しているクラウドサービス(Google Cloud Console)上で発行する「認証用のロボットアカウント」です。
もし「Google Cloud Consoleって何?」という方は、このあと紹介する設定手順の中で使うだけなので、ひとまずそのまま進めてください。
サービスアカウントのメールアドレスを確認する
まず、Google Cloud Consoleで発行した credentials.jsonファイルを開きます。中に記載されている client_emailという項目が、サービスアカウントのメールアドレスです。
ai-butler-bot@your-project-id.iam.gserviceaccount.com
このメールアドレスをコピーしておきましょう。
Googleカレンダーの共有設定を行う
次に、Googleカレンダー側で共有設定を行います。以下の手順で進めてください。
- Googleカレンダーを開く
- 左メニューから共有したいカレンダーの「︙」をクリックし、「設定と共有」を選択
- 「特定のユーザーと共有」セクションまでスクロール
- 先ほど確認したサービスアカウントのメールアドレスを入力
- 権限は「予定の閲覧(すべての予定の詳細)」を選択
これで、サービスアカウントがあなたのGoogleカレンダーを読み取れるようになります。
primaryとは何か?
Flaskのコード中では calendarId='primary'という指定をしています。これは「認証されたアカウントから見たメインカレンダー」を意味します。サービスアカウントに共有されたカレンダーがひとつだけであれば、自動的にそのカレンダーが対象になります。
複数カレンダーを操作する場合は、Googleカレンダーの「カレンダーID」を明示的に指定することも可能です。
Flaskアプリを起動してLINEボットの動作確認をしよう
ここまででプログラムのコードは完成しました。最後に、実際にFlaskアプリを起動し、LINEとGoogleカレンダーが正しく連携できるかを確認します。設定ミスがあるとLINEが反応しないため、慎重に確認しましょう。
仮想環境をアクティブにしてFlaskを起動する
まずは、作業ディレクトリに移動し、Pythonの仮想環境を有効化します。
cd ~/projects/ai_butler
source .venv/bin/activate
Flaskに必要なパッケージをインストールする
仮想環境をアクティブにした状態で、以下のコマンドを順番に実行してパッケージをインストールします。
pip install flask
pip install line-bot-sdk
pip install python-dotenv
pip install google-api-python-client
pip install google-auth
pip install google-auth-oauthlib
インストールが完了したら、次に進みましょう。
requirements.txtを作成しておこう
インストールしたパッケージは仮想環境にしか適用されません。そのため、 requirements.txtとして記録しておくことで、再現性の高い構成を保てます。
pip freeze > requirements.txt
以降、別の環境で動かす場合は以下の手順で同じ環境を復元できます。
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Flaskアプリを起動する
アプリの実行は以下のコマンドで行います。
python3 app.py
以下のように表示されれば起動成功です。
* Running on all addresses (0.0.0.0)
* Running on http://160.251.XXX.XXX:5000
※このときLINE SDKのバージョンが3.x系の場合、以下のような警告が出ることがあります:
LineBotSdkDeprecatedIn30: Call to deprecated class LineBotApi.
(Use v3 class; linebot.v3.<feature>)
これは現行コードが旧形式に依存しているためで、すぐにエラーにはなりません。動作確認後、必要に応じて新しい構文への書き換えを行ってください。
LINEから「今日の予定」と送信して動作確認
LINEアプリを起動して、自分のLINE Botに「今日の予定」とメッセージを送ってみてください。正常に連携できていれば、Googleカレンダーの予定が返ってきます。
動作例:
今日の予定は以下の通りです。
・10:00 定例ミーティング
・14:00 打ち合わせ(Zoom)
LINE Botが動作しないときのチェックリスト
- .envファイルのパスや内容が正しく設定されているか?
- Flaskアプリが起動しているか?( app.pyを実行中か)
- ポート5000番がFirewallで解放されているか?
- LINE DevelopersのWebhook URLが正しく設定されているか?
- Messaging APIのアクセストークンやチャンネルシークレットが間違っていないか?
- Google Cloudの認証情報(.jsonファイル)が正しく読み込めているか?
このコードだけでは動かない?
ここまでで、LINEからのメッセージに反応してGoogleカレンダーの予定を返すAI執事ボットのコードを完成させてきました。 しかし実際には、このコードをコピペしただけでは動作しません。なぜなら、裏側にある「設定」と「環境構築」が不可欠だからです。
裏側にはLINE DevelopersとGoogle APIの土台がある
このAI執事ボットが動作するには、LINEとGoogleそれぞれのAPIにアクセスするための準備が必要です。 それらはコードには書かれていませんが、以下のような“見えない土台”が支えています。
連携先 | 必要な構築・設定内容 |
---|---|
LINE Developers | - チャネル作成 - Messaging APIの有効化 - Webhook URLの登録 - アクセストークンとシークレットの取得 |
Google Cloud Platform | - プロジェクト作成 - Google Calendar APIの有効化 - サービスアカウントの作成 - credentials.json の取得 - カレンダーへの共有設定(権限付与) |
VPS環境 | - Flaskアプリを配置できるLinuxサーバ - Python 3.11環境の構築 - 必要なライブラリのインストール(requirements.txt使用) - HTTPSで公開できるようにWebhookを受信する仕組み(ngrokは非使用) |
これらの構築が揃っていなければ、どんなに正しいコードを書いてもLINEとGoogleは反応してくれません。 この見えない土台こそが、AI執事ボットを現実に動かすための「生命線」になります。
土台の作り方は別記事で解説
もしあなたが「このAI執事ボットを実際に動かしたい」と思ったなら、次に読むべきは土台構築に関する解説記事です。 VPSの立ち上げ、LINE DevelopersやGoogle Cloudの設定、Webhookが届くまでのステップをすべて順番に解説しています。
詳細は以下の記事で解説しています:
AI執事ボットのためのVPS環境構築マニュアル(LINE対応付き)
「コードが完成したあとに、土台の存在に気づく」ことは、決して遠回りではありません。 むしろ、作りたいという動機があるからこそ、構築にも意味が生まれます。ここで“動かすための条件”を理解して、次に進んでください。
さらに便利にしたい?次はChatGPTとの連携へ
ここまで作ってきたAI執事ボットは、「予定を聞かれたら返す」という条件ベースの仕組みです。 しかし実際には、「もっと自然に会話したい」「自分の意図を汲んで返信してほしい」と感じることもあるはずです。 そこで登場するのが、ChatGPTとの連携による“頭脳化”です。
意図を汲み取って返す“頭脳”を持たせる
ChatGPT APIと連携することで、ユーザーのメッセージに対して「予定を聞きたい」という“意図”を読み取って反応できるようになります。 単なるキーワード一致ではなく、「予定ある?」や「午後のスケジュールどうなってる?」といった多様な表現にも対応可能になります。
ChatGPTでの意図抽出(例)
ユーザー:午後の予定を教えてくれる?
ChatGPT(解析):これは「今日の午後の予定を確認したい」という意図と推定できます。
→ Googleカレンダーの14:00〜以降を抽出して返信
出力結果:
本日午後の予定は以下の通りです:
・14:30〜 歯科予約
カスタマイズ次第で“対話型AI”へ進化する
ChatGPTを連携させることで、単なる予定確認だけではなく、 「何時に出たらいい?」「それって昨日もあった予定?」といった質問にも対応できるようになります。 ユーザーのメッセージを自然言語として解析し、過去データと組み合わせた応答も可能です。
ChatGPT連携で広がる可能性(例)
ユーザーの質問 | AI執事の応答(ChatGPT活用) |
---|---|
明日何時に出れば間に合う? | 明日は10:00に会議があるので、9:30までに出発すれば余裕があります。 |
予定って昨日も同じのあった? | はい、昨日も14:30から同じクライアントとの定例会議がありました。 |
実装は少し複雑になりますが、そのぶん得られる体験はまったく違うものになります。 LINEという身近なツールに“自分の生活を理解してくれる相手”がいる感覚──それがAI執事の次なる進化です。
ChatGPT連携の拡張方法は、次の記事で具体的に解説していきます。 次は「【Pythonの基礎知識】AI執事ボットのためのVPS環境構築マニュアル(LINE対応付き)」の使い方に進むのがおすすめです。