LINEボットでGoogleカレンダーを自然言語操作してみた(Ubuntu + OpenClaw + ngrok構成)
はじめに
「LINEグループで誰かがイベントを作ったら、自動でGoogleカレンダーにも登録したい」
シンプルな動機だった。ボランティアグループのLINEで、イベントのたびに手動でカレンダーに転記するのが面倒だったのだ。
「LINEボットを作ってAIに頼めばいいんじゃないか」
そこからOpenClawというツールを知り、半日の格闘が始まった。
(この辺の知識はゼロだったので、claudeに都度都度教えてもらい、この記事も備忘録としてclaudeにまとめてもらいました。)
システム構成
LINEメッセージ
↓
ngrok(固定ドメイン)
↓
OpenClaw(ポート18789 / Ubuntu)
↓
GPT-4o
↓
Google Calendar(gog CLI経由)
↓
LINE返信
OpenClawとは
OpenClawは、AIエージェントをローカルで動かすためのゲートウェイツール。LINEやSlack、Discordなどのチャンネルと接続でき、AIが各種CLIツール(スキル)を使ってタスクを実行できる。
環境
- Ubuntu 24.04 LTS
- Node.js 22
- OpenClaw 2026.3.8
- ngrok(固定ドメイン)
- OpenAI API(gpt-4o)
- LINE Messaging API
Step 1: OpenClawのインストール
npm install -g openclaw
Step 2: 設定ファイル(ここで最初のつまずき)
~/.openclaw/openclaw.json を作成する。
最終的に動いた設定:
{
"gateway": {
"port": 18789,
"mode": "local",
"auth": { "mode": "none" }
},
"agents": {
"defaults": {
"model": { "primary": "openai/gpt-4o" }
}
},
"channels": {
"line": {
"enabled": true,
"channelSecret": "YOUR_CHANNEL_SECRET",
"channelAccessToken": "YOUR_CHANNEL_ACCESS_TOKEN",
"dmPolicy": "open",
"groupPolicy": "open",
"allowFrom": ["*"],
"webhookPath": "/line"
}
}
}
つまずきポイント①:endpoint ではなく webhookPath
ドキュメントを読んで endpoint: "/line" と書いたら404。正しいキー名は webhookPath だった。
つまずきポイント②:gateway.mode が必須
gateway.mode: "local" がないと起動時にブロックされる。
つまずきポイント③:allowFrom が必要
dmPolicy: "open" を設定すると allowFrom: ["*"] も必須と怒られる。
Step 3: ngrokの設定
固定ドメインを使うと再起動のたびにLINE側のWebhook URLを変更しなくて済む。
ngrok http --domain=YOUR-FIXED-DOMAIN.ngrok-free.dev 18789
Step 4: LINE Developers Consoleの設定
| 項目 | 設定値 |
|---|---|
| Webhook URL | https://YOUR-DOMAIN.ngrok-free.dev/line |
| Webhook | ON |
| 自動応答メッセージ | OFF |
| 応答メッセージ | OFF |
| グループトークへの参加 | ON |
自動応答をOFFにしないと、AIより先にLINEが「このアカウントでは個別のお問い合わせは受け付けていません」と返答してしまう。
Step 5: 動作確認
# Webhookパスが開いているか確認
curl -X POST http://127.0.0.1:18789/line \
-H "Content-Type: application/json" \
-d '{"test": true}'
# → {"error":"Missing X-Line-Signature header"}
# 404でなければOK。署名エラーは正常。
Step 6: Bonjourクラッシュ対策
しばらく動かしていると突然落ちる。
AssertionError [ERR_ASSERTION]: Reached illegal state!
IPV4 address change from defined to undefined!
ネットワークインターフェースのIP変化でMDNS(Bonjour)がクラッシュする既知のバグ。起動時に環境変数で無効化する:
OPENCLAW_DISABLE_BONJOUR=1 openclaw gateway --port 18789 --verbose
Step 7: Google Calendar連携(gog CLI)
OpenClawには gog というGoogle Workspace CLIのスキルが組み込まれている。
gog CLIのインストール
npmには同名の別ツールがあるので注意。ソースからビルドする:
sudo apt-get install golang-go
git clone https://github.com/steipete/gogcli.git
cd gogcli
make
sudo cp ./bin/gog /usr/local/bin/
Google Cloud Console設定
- プロジェクト作成
- Google Calendar API を有効化
- OAuth同意画面 → Data Access タブ →
https://www.googleapis.com/auth/calendarを追加 - OAuth同意画面 → Audience タブ → テストユーザーに自分のGmailを追加
- 認証情報 → OAuthクライアントID作成(デスクトップアプリ)
OAuth認証
# client_secret.jsonを手動作成
cat > ~/client_secret.json << 'EOF'
{
"installed": {
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"redirect_uris": ["urn:ietf:wg:oauth:2.0:oob", "http://localhost"],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
}
EOF
gog auth credentials ~/client_secret.json
gog auth add your@gmail.com --force-consent --services calendar
動作確認
export GOG_ACCOUNT=your@gmail.com
gog calendar list --week
カレンダーの予定がJSON形式で表示されれば成功。
Step 8: 起動スクリプト
cat > ~/start-openclaw.sh << 'EOF'
#!/bin/bash
export GOG_ACCOUNT=your@gmail.com
OPENCLAW_DISABLE_BONJOUR=1 openclaw gateway --port 18789 --verbose
EOF
chmod +x ~/start-openclaw.sh
完成:LINEから予定を追加
グループで以下のようにメンションすると:
@Ciruzzo_AI 花見 4月5日12時から15時 代々木公園 カレンダーに追加して
AIがGoogleカレンダーに登録してくれる。共有カレンダーへの登録も、カレンダーIDを指定すればOK:
gog calendar create YOUR_SHARED_CALENDAR_ID \
--summary "花見" \
--from "2026-04-05T12:00:00+09:00" \
--to "2026-04-05T15:00:00+09:00"
やった。動いた。半日かけて構築した。
壁:本来やりたかったことはできなかった
そもそもの目的は「LINEグループでイベントが作成されたら自動でGoogleカレンダーに登録する」だった。
しかし調べてわかったこと:
LINEの「イベント」機能はMessaging APIのWebhookを送らない。
つまり、グループで誰かがイベントを作っても、ボットには何も届かない。ボット側からLINEイベントを作成するAPIも存在しない。
| やりたいこと | 可否 |
|---|---|
| LINEイベント作成をGoogleカレンダーに自動反映 | ❌ Webhookが来ない |
| ボットがLINEイベントを作成 | ❌ APIがない |
| ボットがGoogleカレンダーにイベント追加 | ✅ できる |
結局、グループメンバーが手動でボットにメンションしてカレンダー登録を依頼する運用になった。自動化の夢は儚く散った。
オチ
ところで、これと同じことをコマンド1行でやる方法がある。実は私のグループのイベントはExcelのファイルに入っているんです。
# Excelファイルから直接登録
gog calendar create primary \
--summary "花見" \
--from "2026-04-05T12:00:00+09:00" \
--to "2026-04-05T15:00:00+09:00"
あるいは、最初からGeminiにExcelを渡せばよかった:
gemini "このExcelのイベント一覧をGoogleカレンダーに登録して" events.xlsx
半日かけて構築したシステムが、コマンド1行で済んだ件について。
まあ、LINEから自然言語で話しかけられるのは便利だし、いろんなツールで遊べたので、無駄ではなかったと自分に言い聞かせている。
まとめ
| やったこと | 難易度 |
|---|---|
| OpenClaw設定 | ★★★(ドキュメントの罠が多い) |
| ngrok固定ドメイン | ★(簡単) |
| LINE Messaging API | ★★(自動応答OFFを忘れずに) |
| gog CLIのビルド | ★★(npmの同名パッケージに注意) |
| Google OAuth設定 | ★★★(UIが変わっていて迷った) |
誰かの参考になれば幸いです。