0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LINEボットでGoogleカレンダーを自然言語操作してみた(Ubuntu + OpenClaw + ngrok構成)

0
Last updated at Posted at 2026-05-22

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設定

  1. プロジェクト作成
  2. Google Calendar API を有効化
  3. OAuth同意画面 → Data Access タブhttps://www.googleapis.com/auth/calendar を追加
  4. OAuth同意画面 → Audience タブ → テストユーザーに自分のGmailを追加
  5. 認証情報 → 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が変わっていて迷った)

誰かの参考になれば幸いです。


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?