【Looker × LINE】LINE 公式アカウントを使ったデータ活用を試してみた

2025年2月6日掲載

【Looker x GenAI】Looker と生成 AI で実現するパーソナライズドマーケティング:カスタム Action で顧客体験を向上

Google Cloud のデータプラットフォーム「 Looker 」のカスタムアクション を活用することで、データ分析結果を基にアクションを自動化することが可能になります。

また、外部の API を活用することで様々なシステムと連携でき、シームレスなデータ活用も実現できます。データを活用して対象者を絞り、消費者にとって身近なコミュニケーションツールである LINE に対してメッセージが送信できるようになると、プロモーション活動をより効果的に行うことができます。

本記事では Looker のアクション機能を実装して、Explore での分析によって抽出された顧客に対し、LINE 公式アカウントを通じてメッセージを送信するユースケースを解説します。

データ分析や LINE 公式アカウントを活用したプロモーション活動に関心がある方は、ぜひご一読ください。

目次

Looker について

Looker は、Google Cloud が提供する「データプラットフォーム」です。

集計前のデータ定義の作成、データの集計、ダッシュボードやレポートといったデータの可視化までの一連のデータ分析プロセスをカバーする機能を備えています。

Looker の機能概要については、ソフトバンクのテックブログ「データプラットフォーム「Looker」 の機能紹介」記事を参照してください。

今回は BigQuery にテスト用のテーブルを作成して、分析によって抽出されたユーザーに対し、LINE 公式アカウントを通じてメッセージを送信するアクション機能を実装しました。

完成イメージ

本記事では、まず前半では、完成イメージとして完成したシステムの操作手順を紹介し、後半で本アクションを構築するためのシステム構成と手順を詳しく解説していきます。

前半では、「単一の ID に送信する手順」と、「絞り込んだ複数の ID に送信する手順」の2パターンの操作手順を紹介します。それぞれ基本的な流れは同じですが、 Looker Explorer 上での最初の操作が異なりますのでご確認ください。

後半で、本アクションを構築するためのシステム構成と手順を詳しく解説していきます。

Looker から 1 人のユーザーに LINE を送信する手順

ここから完成イメージとして、完成したシステムの操作例を紹介します。

まず Looker で指定した条件(例:LINE ID の登録がある、売上が 10 万円以上、等)を基に抽出した顧客に対して、個別にメッセージを送信するアクションの動作を確認します。

Explore でターゲットを絞りこみます。

ExploreでLINE IDがnullでない顧客を抽出

LINE を送信したいユーザーの LINE ID が記載されたセルをクリックし、今回実装したアクションである「 LINE 公式 」をクリックします。(後半で説明しますが、/list エンドポイントで LINE 公式というメニューが出てくるように設定しています。)

LINE IDが記載されたセルをクリックし、LINE 公式をクリック

ポップアップが表示されるので、LINE 公式アカウントから通知したいメッセージを入力し、送信をクリックします。(/form エンドポイントでテキストボックスが出てくるように設定しています。)

LINE 公式アカウントから通知したいメッセージを入力し、送信

対象の LINE に、LINE 公式アカウントからメッセージが送信されます。(/execute エンドポイントで実行する処理を指定しています。)

対象の LINE にLINE 公式アカウントからメッセージが送信される

 

Looker から複数のユーザーに LINE を送信する

次に、Lookerで抽出した顧客に対して、一括でメッセージを送信するアクションの動作を確認します。

Explore でターゲットを絞りこみます。

ExploreでLINE IDがnullでない顧客を抽出

設定 > 送信 を選択します。

「設定」から「送信」を選択

「 LINE 公式 」を選択し、メッセージに送信したい文面を入力し、送信をクリックします。

「 LINE 公式 」を選択し、メッセージに送信したい文面を入力し、送信

表示されている LINE ID 全てに対し、公式 LINE アカウントからメッセージが送信されます。
※テスト用に同じ LINE ID を使用したため、今回は1つの LINE に2件のメッセージが送信されています。

表示されている LINE ID 全てに対し、公式 LINE アカウントからメッセージが送信される

システム構成

ここまでで完成イメージが理解いただけたかと思います。ここからは実装する方法を解説していきます。

Explore での分析によって抽出された顧客に対し、Looker のアクション機能を使って、LINE 公式アカウントを通じてメッセージを送信します。

本アクションでは、Looker Action API LINE公式アカウントのMessaging APIを利用しています。Looker Action API については以前の「【Looker x GenAI】Looker と生成 AI で実現するパーソナライズドマーケティング:カスタム Action で顧客体験を向上」記事でも紹介しているので、こちらも併せてご確認ください。

データベース(BigQuery)には、送信する LINE ID が格納されている状態を前提としています。LINE ID の取得方法については公式ドキュメント「ユーザーIDを取得する」をご確認ください。

サーバー側では、Looker Action API を使用してカスタム Action を作成します。Action API は、Looker からのアクションを受け入れる Incoming Webhook のような API です。Looker Action API の詳細は公式ドキュメント「アクション ハブを介したデータ共有」を参照してください。本カスタム Action は、以下の3つのエンドポイントで構成されます。

  • list エンドポイント: アクションのメタデータを定義します。アクションの名称やロゴ、対象レコードからどの属性( LINE ID など)を取得するかを指定します。
  • form エンドポイント: アクションの実行に必要なパラメータを定義します。アクション実行画面で表示されるフォームの内容を指定しています。今回は、送信するメッセージを入力できるようにします。
  • execute エンドポイント: アクションを実行します。今回は、LINE Messaging API を実行して LINE へメールを送信します。
アクションエンドポイントの構成図

本アクションでは execute エンドポイントで LINE Messaging API を使用するため、LINE 公式アカウント側での設定も必要です。LINE 公式アカウントのチャネルアクセストークン(長期)を取得して、execute エンドポイントに設定します。こうすることで execute エンドポイントが LINE 公式アカウントと連携でき、Looker で絞り込んだ LINE ID へメッセージを届けることが出来ます

LINE Messaging API は、LINE が提供している LINE 公式アカウントのオプション機能です。無料で利用開始することができ、毎月一定数のメッセージを無料で送信することができます。詳細は公式ドキュメント「 Messaging APIの概要 」をご確認ください。

では、順を追って詳細を見ていきましょう。

1.  list エンドポイント

このエンドポイントではアクション定義を作成し、レスポンスとして返します。
form / execute エンドポイントについてもここで定義します。


def action_list(request):
    """Return action hub list endpoint data for action"""
    auth = authenticate(request)
    if auth.status_code != 200:
        return auth

    response = {
        'label': 'LINE Official',
        'integrations': [{
            'name': 'LINE公式',
            'label': 'LINE公式',
            'supported_action_types': ['cell','query'],
            "required_fields": [{"tag":"cell_id"}],
            "icon_data_uri": icon_data_uri,
            'form_url': BASE_DOMAIN + 'form',
            'url': BASE_DOMAIN + 'execute',
            'supported_formats': ['json'],
            'supported_formattings': ['formatted'],
            'supported_visualization_formattings': ['noapply'],
            'params': []
        }]
    }

    print('returning integrations json')
    return Response(json.dumps(response), status=200, mimetype='application/json')

'supported_action_types' には 'cell' と 'query' を指定し、セルからの実行と Explore からの実行を可能にしています

また、セルからの実行を有効化するため、Looker 上で対象のセルを判別するためのタグとして "required_fields" に任意のタグ { "tag" : "cell_id" } を指定しています。この例では LookML で "cell_id" が付与されたフィールドに対して、アクションが実行できるようになります。

2. form エンドポイント

アクション実行画面でユーザーが入力するフォームを定義します。

def action_form(request):
    """Return form endpoint data for action"""
    auth = authenticate(request)
    if auth.status_code != 200:
        return auth

    response = [
        {
        'name': 'message',
        'label': 'メッセージ',
        'description': '送信メッセージを入力してください',
        'type': 'textarea',
        'required': True
    }]

    print('returning form json: {}'.format(json.dumps(response)))
    return Response(json.dumps(response), status=200, mimetype='application/json')

本アクションでは、'required' に True を指定することで対象の LINE ユーザーに送信するメッセージを必須で入力するようにしています。

送信するメッセージを必須入力にする

3. execute エンドポイント

以下が execute エンドポイントの全体像になります。 execute エンドポイントでは、エンドポイント宛にアクション実行時に選択されたセルの情報( cell )もしくは分析結果( query )の情報が送信されます。 execute エンドポイントでは、送信されたデータを基に LINE Messaging API へのリクエストを送信します。

なお、今回は Google の Cloud Run 関数上で作成しているため、LINE Messaging API を利用する際のチャネルアクセストークン "CHANNEL_ACCESS_TOKEN" と、Big Query 上で LINE ID が格納されているカラム名 "LINE_ID_COLUMN" については、ランタイム環境変数として設定しています。詳細は公式ドキュメント「環境変数を構成する」をご確認ください。

def action_execute(request):
    """Generate a response from Generative AI Studio from a Looker action"""
    auth = authenticate(request)
    if auth.status_code != 200:
        return auth
    request_json = request.get_json()
    attachment = request_json['attachment']
    action_params = request_json['data']
    form_params = request_json['form_params']
    print(action_params)
    print(form_params)

    configuration = linebot.v3.messaging.Configuration(
        host = "https://api.line.me"
    )
    # access_tokenを設定
    configuration = linebot.v3.messaging.Configuration(
        access_token=os.environ.get("CHANNEL_ACCESS_TOKEN")
    )

    message = '{\"to\":\"\",\"messages\":[{\"type\":\"text\",\"text\":\"\"}]}'

    message_dict = json.loads(message)

    #query処理
    try:
        all_data = sanitize_and_load_json_str(attachment['data'])
        print(f"all_data {all_data}")

    except Exception as e:
        body = 'Warn: Attachment Data loading Error: ' + str(e)
        print(body)
    try:
        for key in all_data:
            if not key[os.environ.get("LINE_ID_COLUMN")] is None:
                print(os.environ.get("LINE_ID_COLUMN"))

                message_dict['to'] = key[os.environ.get("LINE_ID_COLUMN")]
                message_dict['messages'][0]['text'] = form_params['message']
                with linebot.v3.messaging.ApiClient(configuration) as api_client:
                    api_instance = linebot.v3.messaging.MessagingApi(api_client)
                    push_message_request = linebot.v3.messaging.PushMessageRequest.from_dict(message_dict)
                    api_response = api_instance.push_message(push_message_request)
                    print("The response of MessagingApi->push_message:\n")
                    pprint(api_response)
        return Response(status=200, mimetype='application/json')
    except Exception as e:
        body = 'Warn: Attachment Data loop Error: ' + str(e)
        print(body)
        
    #cell処理
    message_dict['to'] = action_params['value']
    message_dict['messages'][0]['text'] = form_params['message']

    with linebot.v3.messaging.ApiClient(configuration) as api_client:
        api_instance = linebot.v3.messaging.MessagingApi(api_client)
        push_message_request = linebot.v3.messaging.PushMessageRequest.from_dict(message_dict)

        try:
            api_response = api_instance.push_message(push_message_request)
            print("The response of MessagingApi->push_message:\n")
            pprint(api_response)
        except Exception as e:
            print("Exception when calling MessagingApi->push_message: %s\n" % e)

    return Response(status=200, mimetype='application/json')

それでは、LINE Messaging API を使用して 上記の query 処理と cell 処理を作成する方法を確認していきましょう。

LINE Messaging API との連携

本アクションは、LINE の Messaging API を使用して LINE 公式アカウントからメッセージ通知を行います。Messaging API の詳細は公式マニュアル「 Messaging API 」を参照してください。それでは、Messaging API の実装を確認していきましょう。

1. API キーの取得

LINE Developers コンソールで対象の LINE 公式アカウントを開き、Messaging API > チャネルアクセストークンからチャネルアクセストークン(長期)を取得します。

チャネルアクセストークンは、 execute エンドポイントで利用しますので、Cloud Run 関数の環境変数へ設定をおこないます。

LINE Messaging APIのチャネルアクセストークンを取得

2. query 処理の作成

Messaging API を利用することで、form で取得したメッセージを、分析結果に含まれる LINE ID に送信する事ができます。以下、execute エンドポイントから該当するコードの抜粋となります。

query 処理では分析結果から LINE ID を特定するため、LINE ID が記載されるカラム名を指定することで、対象の全ての LINE ID に対してメッセージを送信する処理を作成することができます。

    #Query処理
    try:
        all_data = sanitize_and_load_json_str(attachment['data'])
        print(f"all_data {all_data}")

    except Exception as e:
        body = 'Warn: Attachment Data loading Error: ' + str(e)
        print(body)
    try:
        for key in all_data:
            if not key[os.environ.get("LINE_ID_COLUMN")] is None:
                print(os.environ.get("LINE_ID_COLUMN"))

                message_dict['to'] = key[os.environ.get("LINE_ID_COLUMN")]
                message_dict['messages'][0]['text'] = form_params['message']
                with linebot.v3.messaging.ApiClient(configuration) as api_client:
                    api_instance = linebot.v3.messaging.MessagingApi(api_client)
                    push_message_request = linebot.v3.messaging.PushMessageRequest.from_dict(message_dict)
                    api_response = api_instance.push_message(push_message_request)
                    print("The response of MessagingApi->push_message:\n")
                    pprint(api_response)
        return Response(status=200, mimetype='application/json')
    except Exception as e:
        body = 'Warn: Attachment Data loop Error: ' + str(e)
        print(body)
        
   

3. cell 処理の作成

以下、execute エンドポイントから該当するコードの抜粋となります。

cell 処理では、query 処理と違い、 LINE ID が記載されたセルからアクションを起動するため、メッセージを1回送信する処理のみを作成します。

    #Cell処理
    message_dict['to'] = action_params['value']
    message_dict['messages'][0]['text'] = form_params['message']

    with linebot.v3.messaging.ApiClient(configuration) as api_client:
        api_instance = linebot.v3.messaging.MessagingApi(api_client)
        push_message_request = linebot.v3.messaging.PushMessageRequest.from_dict(message_dict)

        try:
            api_response = api_instance.push_message(push_message_request)
            print("The response of MessagingApi->push_message:\n")
            pprint(api_response)
        except Exception as e:
            print("Exception when calling MessagingApi->push_message: %s\n" % e)

    return Response(status=200, mimetype='application/json')

完成したら、完成イメージのように実行して動作確認をしてみてください。

まとめ

本記事では、Looker と LINE 公式アカウントによるメッセージ送信処理について解説しました。データを活用して対象者を絞り、消費者にとって身近なコミュニケーションツールである LINE に対してメッセージが送信できるようになると、プロモーション活動をより効果的に行うことができます。

Looker ではこのように外部の API を活用することで、様々なシステムと連携でき、シームレスなデータ活用を実現します。Looker とそのアクション機能を活用し、より便利にデータを活用できないか検討してみてはいかがでしょうか。

関連サービス

Looker は定義から集計、可視化の一連のデータ分析プロセスをカバーする BI ツールを超えるデータプラットフォームです。ソフトバンクは、顧客のニーズに合わせて柔軟なサポートを提供し、Looker を活用したデータドリブンな企業変革を支援しています。

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

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