Twilioに電話があったら、公式LINEに通知するシステムを構築してみた

2025年4月10日掲載

キービジュアル

ご覧いただきありがとうございます。Twilioプロダクトチームです。

今回は、TwilioとLINEを連携させて、電話を受けた際に公式LINEに通知を送信するシステムを構築する方法を紹介します。

LINE連携に関する実装方法を調べていると、Twilio Channelsを使った方法が見つかりましたが、現在LINEはTwilio Channelsではサポートされていないことが分かり、少し困惑していました。しかし、Twilioに精通した方から新しい方法を教えていただき、実際に実装することができました。

 

目次

Twilioとは

Twilioとは、電話やSMS・ビデオ・チャットなど世の中にあるさまざまなコミュニケーションチャネルをWeb・モバイルアプリケーションへ組み込むクラウドコミュニケーションプラットフォームです。従量課金制のため、コンタクトセンターや新規ビジネスをスモールスタートで構築することが可能です。

今回構築するシステム

TwilioとLINEを連携させる構成例として、Twilioに電話がかかってきたら、LINEに通知するシステムを構築します。細かな要件は以下のとおりです。

  • 電話番号はTwilioで購入します
  • 電話の内容は録音します
  • 電話の内容を、LINEの公式アカウントに通知します

実装方法

まず、LINE側でアクセストークンを発行し、Twilio側で電話を受けて録音する処理、LINEへメッセージを送信する処理の順番で構築し、最後に動作検証します。

LINE側の準備

LINE側の準備をします。本記事ではLINE公式アカウントが開設済みの前提で進めます。 LINE公式アカウントを持っていない方は開設してから読み進めてください。

1.LINE Developersにログインします。

2.公式アカウントのMessaging API設定からチャネルアクセストークンをコピーします。

Twilio側の準備

1.Twilioコンソールにログインします。

2.Functionに遷移し、Serviceを作成します。

3.Service内でFunctionの処理を記載します。

まずはユーザーIDを取得する処理を記載します。


exports.handler = function(context, event, callback) {
  const response = new Twilio.Response();
  response.appendHeader('Content-Type', 'application/json');
  response.setBody({ status: 'success' });


  // もし line からの JSON が event.body に文字列として入る場合:
  let parsedBody;
  if (typeof event.body === 'string') {
    try {
      parsedBody = JSON.parse(event.body);
    } catch (e) {
      console.error('JSON parse error:', e);
      parsedBody = {};
    }
  } else {
    // そもそも event.body が存在しない、またはすでにパース済みなら:
    parsedBody = event;
  }


  // ここで parsedBody.events があればユーザーIDを取得
  if (parsedBody.events && parsedBody.events.length > 0) {
    let userId = parsedBody.events[0].source.userId;
    console.log('User ID:', userId);
  } else {
    console.log('No events found in parsedBody');
  }
  callback(null, response);
};

4.Functionをデプロイ後、URLをコピーしてLINE DevelopersのWebhookに設定します。

5.Live logsをオンにしてからLINEでメッセージを送信してください。

LINE側で何かしらのメッセージを送信するとコンソール側でユーザーIDが表示されます。

Twilio Function内のコンソールログにユーザーIDが表示されたら、コピーしておきます。

6.次に録音の処理を記載します。自動音声で留守電の案内とビープ音がした後に録音が開始されます。


exports.handler = function(context, event, callback) {
    const VoiceResponse = require('twilio').twiml.VoiceResponse;
    let response = new VoiceResponse();

    response.say({ language: 'ja-JP' }, 'この電話は留守番電話に接続されます。メッセージをどうぞ。');

    response.record({
        maxLength: 60, // 最大録音時間
        playBeep: true,
        recordingStatusCallback: 'https://voicemail-line-1956.twil.io/recording-complete',
        recordingStatusCallbackMethod: 'POST',
        statusCallback: 'https://voicemail-line-1956.twil.io/recording-complete',
        statusCallbackMethod: 'POST',
        statusCallbackEvent: ['ringing', 'answered', 'completed'] ,
        timeout: 5
    });

    response.hangup();
    return callback(null, response);
};

7.環境変数に先ほどコピーしたユーザーIDとLINEチャネルのアクセストークンを設定します。

8.LINEへメッセージを送信する処理を作成します。


exports.handler = async function(context, event, callback) {
    const axios = require('axios');
    let recordingUrl = event.RecordingUrl + '.mp3';
    let callSid = event.CallSid;
    let recordingDuration = event.RecordingDuration;
    let callTime = new Date().toLocaleString("ja-JP", { timeZone: "Asia/Tokyo" });  // 日本時間の通話時刻

    console.log("🔍 受け取った event データ:", JSON.stringify(event, null, 2));

    // Twilio の `+81` を日本の電話番号形式(0から始まる)に変換
    let fromNumber = event.From || "不明";


    // ログ出力: Twilio から受け取った `event.From` の値を確認
    console.log(`🔍 Twilioから受け取った発信元番号 (event.From): ${fromNumber}`);

    if (fromNumber.startsWith("+81")) {
        fromNumber = "0" + fromNumber.slice(3);  // `+81` を `0` に置き換え
    }

    console.log(`📞 変換後の発信元番号: ${fromNumber}`);

    let messageText = `📞 留守電がありました。\n🕒 通話時間: ${callTime}\n📱 発信元: ${fromNumber}\n🔹 CallSID: ${callSid}\n⏳ 録音時間: ${recordingDuration}秒\n🎵 音声URL: ${recordingUrl}`;

    // 環境変数から複数のLINE IDを取得
    let userIds = context.LINE_TARGET_USER_ID.split(',');

    try {
        // 各ユーザーIDに対して通知を送る
        await Promise.all(userIds.map(async (userId) => {
            let response = await axios.post(
                'https://api.line.me/v2/bot/message/push',
                {
                    to: userId.trim(),
                    messages: [{ type: 'text', text: messageText }]
                },
                {
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': `Bearer ${context.LINE_CHANNEL_ACCESS_TOKEN}`
                    }
                }
            );
            console.log(`✅ LINE通知送信成功 (UserID: ${userId}):`, response.data);
        }));

        return callback(null, { status: 'success' });
    } catch (error) {
        console.error('❌ エラー:', error);
        return callback(error);
    }
};

9.Active Numbersに紐づけます。任意の050番号を選択してください。電話番号の購入方法はTwilio上で日本とアメリカの電話番号を購入する方法(2025年1月版)を参照してください。

10.A call comes inにFunctionを設定、ServiceにはLINE連携処理を記載したFunction Service名を設定、Function Pathには録音機能を記載したパスを設定します。

11.設定した050番号宛に架電し、数秒後電話を切ります。LINEに画像のようなメッセージが通知されたら成功です。

まとめ

本記事では、Twilioで購入した電話番号に着信があると、公式LINEに通知を送信する方法について解説しました。LINEと連携したシステムを作りたい方や、Twilioの使い方を学んでいる方々の参考になれば幸いです。

また、Twilio APIを活用した他の実装方法や、電話番号の購入方法についても別の記事で紹介していますので、ぜひ合わせてご覧ください。

今後もTwilioの活用方法や最新の情報を発信していきますので、引き続きご注目ください。

関連サービス

Twilioは、電話、SMS、ビデオ、チャットなど、多様化するお客さまとのコミュニケーションチャネルを1つにつなぐクラウドコミュニケーションAPIです。

おすすめの記事

条件に該当するページがございません