見出し画像

LINE Messaging APIを2年間触って感じた「かゆい所」

※本記事は、PharmaX Advent Calendar 2022の 20日目の記事です。

PharmaX株式会社、SM事業部エンジニアの江田(@asamuzakE)です。
SM事業部ではLINEで気軽に薬剤師と相談することができ、体質にあった漢方薬・サプリを購入することができるサービス「YOJO」を提供しています。

僕は今年新卒1年目なのですが、インターンだった時期を含めると実質2年間このサービスの開発に携わっていることになります。
そこで今回は自分がLINE botの開発を続けてきて感じた課題について紹介していこうと思います!


LINE botのサービス概要

まず「YOJO」のサービス構成について説明します。
かなり簡略化すると以下のような感じになります。


公式アカウント

基本的にユーザーは、LINEの公式アカウント上でやりとりします。

公式アカウントのメッセージ
チャット画面下部に表示されるリッチメニュー

公式アカウントでの会話、ボタンの押下などのイベントはWebhookを通じてRailsサーバーで処理されます。
公式アカウントからメッセージを送信する場合は、RailsサーバーからLINE Messaging APIを叩きます。


管理画面・LIFFアプリ

管理画面では解約手続きやチャット、配送の確認などができます。

管理画面

LIFFアプリは、LINE上で動くブラウザ(LIFF)で動くアプリです。
設定ページや購入ページなど、LINEのチャットだけでは難しい部分をLIFFアプリで実装しています。
また、LIFF上ではLINEのユーザーIDなども取得可能なため、そのためにLIFFアプリを使うこともあります。

LIFFアプリ

管理画面・LIFFアプリもRailsサーバーにアクセスすることによって必要な情報を処理します。


LINE Messaging APIで感じた課題

LINE Messaging APIでは自由度の高いbotを作ることができますが、一方で開発する過程で実現できなかったこと、困ったこともありました。


①支払いが失敗した直後にAPIが叩けなくなる

ある日、急に本番環境でチャットの送受信ができなくなるということが起こりました。
エラーを見ていくとMessaging APIで401(Unauthorizedエラー)が返っていることが確認され、クレジットカード決済が失敗したことによってアカウントが停止されていたことが発覚したのです。

カード会社に問い合わせると金額の大きさ・時間帯・第3者による不正利用が多い取引相手という理由で支払いがリジェクトされていました。
その後は、クレジットカードのリジェクト解除、LINEでの再決済で解決したのですが、半日ほどサービスが止まってしまいました。

新しいサービスを利用する際、クレジットカード決済がリジェクトされるというのはよくあることだと思いますが、自動更新が急にリジェクトで止まるのは完全に予想外でした。こういう防ぎようのない決済の失敗が起きた際、即時でAPIの利用が止まってしまうのはすごく困りました。


②ボタンを非活性にできない

Messaging APIにはボタンメッセージが用意されています。YOJOでは体質チェックの質問などに使用しています。

体質チェックの質問の流れ

このボタンは非活性にする方法が用意されていません。一時的にボタンを押せなくする機能もなければ、有効期限もありません。そのため、ダブルサブミット対策や意図しない状況でのボタン押下対策などの制御は、全てwebhookを受信するRailsサーバーで処理する必要があります。

YOJOでは購入などの重要な処理はLIFFアプリ側で行うようにしており、ボタンメッセージの部分でも基本的には対策をしていますが、それでもwebhook受信のタイミング次第で時々重複したレコードが作られてしまうことがあります。

また、バックエンドのソースコードを書く際に、大昔に送られたボタンを押された場合などの対策を常に考慮しなければなりません。実行可能なデータ状態かを厳密に判定しなければならないため、面倒です。

③イメージマップはポストバックアクションが指定できない

イメージマップメッセージは、画像に対してタップ領域を指定することで別のwebページへの遷移や、指定したメッセージをユーザーに送ってもらうことが可能です。主にボタンメッセージでは選択肢が足りない場面などで使用しています。

症状選択のイメージマップメッセージ

イメージマップもボタンメッセージ同様、ボタン領域を非活性にする方法がないことは一旦置いておいて、一番の難点はポストバックアクションがないということかなと思ってます。

ボタンメッセージの場合は、ボタンを押した際のアクションとしてポストバックアクションが用意されており、アクションデータに値を仕込むことによってwebhook経由で値を受け取ることができます。

しかし、イメージマップをこのように使いたい場合、アクションとしてはユーザーに特定のテキストを送信させるメッセージアクションしかありません。つまり、ボタンのような挙動をさせるためには、常にユーザーからのメッセージに、メッセージアクションで指定した特定の文字列が含まれていないかチェックし、存在したら実行するというようなことをする必要があります。
これは結構面倒で、DBのレコードのIDなどを仕込めず文字列一致での制御が必要だったり、ユーザーが手動でたまたま特定の文字列を送ってしまわないよう文字列を考慮する必要があったりします。

④数値入力のフォームがない

ボタンメッセージのアクションには日時選択などは存在するのですが、数値入力などのフォームは用意されていません。

そのためYOJOでは、体質チェックの身長や体重の項目はチャット欄に直接入力してもらい、それぞれの質問がされた直後であれば、入力値を受け取って処理するようにしています。

身長の質問と回答

LINEのトーク画面の仕様上、ボタンを押して体質チェックを進めているとキーボードが下に折りたたまれてしまうため、一部だけキーボードを開き直して回答しなければならないのはあまりいい体験ではありません。
文字入力部分だけLIFF上で行う方法もあるとは思いますが、完全にトーク画面のタップだけで一連の体験ができるともっと良いなと思っています。

まとめ

YOJOではLINE Messaging APIを利用して、かなり自由度の高いチャットボットを開発しており、この自由度はYOJOの成長に重要である「なめらかな患者体験」の追求に欠かせないものとなっています。
その上で、さらなる患者体験の向上のためにはこの辺の仕様とどううまく付き合っていくかが重要だなと考えています。
とはいえ、まだまだアプリケーション側の制御で改善の余地はありそうなので、引き続きよりよい対処方法を探していきたいと思います!


PharmaXでは定期的にテックイベントをオンラインで開催しています!
2023年1月は、金融業界・花き業界・薬局業界という異なる業界でDX推進をリードするスタートアップ企業3社が集まり、それぞれのオペレーションを担っているドメインエキスパートとプロダクト開発チームがどのように連携しながらプロダクトや開発組織を作っているのかについてディスカッションします。
ぜひお気軽にご参加ください。


この記事が気に入ったらサポートをしてみませんか?