だって楽したいじゃんか!

大学院(機械工学科)を首席で卒業した男がこれまでの経験を生かさず殺さず発信していく

【GAS】LINE Front-end FrameworkをGASで作ったWebアプリと連携させたらうまくいかなかった話【LIFF】

f:id:makimakimakino:20190114224927p:plain
GASで作ったサーバーレスWebアプリをLIFFから呼び出してみました。結論からいうとうまく動きませんでした。

LIFFとは

LIFF(LINE Front-end Framework)はLINEアプリのトークルーム内で動作するウェブアプリの実装を可能にするプラットフォームです。

LIFFって何がいいの?というところは

LIFFのメリット


  • LINEのアプリ内ブラウザでWebアプリを開くので、いちいちLINEとアプリを切り替える手間が無い。
  • LINEのコンテキスト(ユーザーIdやグループId、トークルームidなど)がWebアプリで扱えるので、ユーザーに紐付いたサービスが提供できる。
  • ユーザーの代わりにWebアプリからLINEにメッセージが送れるので、通知やログの連携が簡単。
  • sdkが用意されているうえに、特別な開発ツールなどを使う必要もないため、実装がめちゃくちゃ簡単。

みたいなところがあって、自分で作ったアプリとLINEの連携がとっても簡単にできるという嬉しいサービスのようです。

アプリへLIFFの実装

早速試してみたいと思います。

まずは、LIFFで呼び出すWebアプリケーションを作ります。

WebアプリはGAS(Google Apps Script)で作ります。

今回作るアプリはシンプルにLIFFに表示されたアプリからテキストを入力して、LINEのトークルームにユーザーidとアプリから入力された内容を投稿する、というものにします。

アプリ作成に必要なものはGoogleアカウントとブラウザのみです。

GASで下記ファイルをそれぞれ編集します。

コードはLINEのチュートリアルを参考にしました。

developers.line.biz

(確かDevelopersサイトを開くにはアカウントを作る必要があったかも?)

GASプロジェクトの作り方は【GAS】Google Apps Scriptとは - だって楽したいじゃんか!を参照してください。


コード.gs

function doGet(e) {
  var template = HtmlService.createTemplateFromFile('index');
  return template.evaluate().setTitle('GAS+LIFF').addMetaTag("viewport", "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0")
}


エンドポイントにGetでアクセスされたらindex.htmlを生成し、レスポンスとして返します。


index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <div>
      <input id="msg" type="text" placeholder="送信メッセージを入力してください。"/>
      <button onclick="alertMessage();">送信</button>
    </div>
    <?!= HtmlService.createHtmlOutputFromFile('js').getContent(); ?>
  </body>
</html>


html内にはテキストボックスとボタンを配置します。ボタンが押されたらjs.htmlのalertMessage関数を呼び出します。


js.html

<script src="https://d.line-scdn.net/liff/1.0/sdk.js"></script>
<script>
var userId="";
window.onload = function (e) {
  alert("onload");
  liff.init(
    data => {
      // Now you can call LIFF API
      alert(data);
      userId = data.context.userId;
      alert(data);
    },
    err => {
      // LIFF initialization failed
      alert(err);
    }
  );
};

function alertMessage(){
    var msg = document.getElementById("msg").value;
    alert(userId + " : " + msg);  
    liff.sendMessages([
      {
        type:'text',
        text:userId + " : " + msg
    }
      ]);
}
</script>


1行目でLIFFのsdkを呼び出します。

window.onloadで、アプリが表示された時の挙動を設定します。liff.init関数を呼び出してuserIdを取得しています。

失敗したらalertメッセージが表示されるようにしています。

alertMessageはアプリで送信ボタンを押した時の動作を記述します。

アラートメッセージで取得したuserIdとテキストボックスに入力された値を表示し、liff.sendMessagesで、メッセージをLINEのチャットルームへ送信します。

アプリを公開して、URLを控えます。

f:id:makimakimakino:20190420110621p:plain

※アプリの公開方法は【GAS】無料!!30分で作れるLINEチャットボット - だって楽したいじゃんか!を参照してください。

アプリをチャットボットに登録

チャットボットにLIFFを登録します。

Webから追加します。

LINEのディベロッパーサイトからBotチャンネルを開きます。

developers.line.biz

Botの追加については【GAS】無料!!30分で作れるLINEチャットボット - だって楽したいじゃんか!を参照してください。


Botの画面のLIFFタブを選択し、追加を押下します。

f:id:makimakimakino:20190420113849p:plain

名前とサイズ、エンドポイントURL、オプションを選択します。

サイズはLINE内でアプリを開く時のサイズです。

エンドポイントURLは登録したいWebアプリのURLを指定します。

オプションのBLEは今回LINE Thingsを使わないので、OFFに設定します。

保存を押下します。

f:id:makimakimakino:20190420114124p:plain

保存押下後、LIFFにアプリ登録が完了したらLIFF URLが発行されるので、こちらも控えておきます。

f:id:makimakimakino:20190420114720p:plain

このLIFF URLをLIFFを紐づけたチャットボットが参加しているトークルームに投稿すると、Webアプリが表示されるのですが、アプリを呼び出すたびにLIFF URLを打ち込むのイケていないので、リッチメニューから呼び出せるように設定します。

リッチメニューとの紐づけ

リッチメニューはURLやテキストなどの特定の文言をボタンとして登録できる機能です。

登録内容がURLであればウェブを開き、テキストならばトークルームにテキストを入力するなどの動きをします。

リッチメニューの登録はLINE@MANAGERから行います。

admin-official.line.me

アカウント一覧からリッチメニューを登録したいBotを選びます。

f:id:makimakimakino:20190420115316p:plain

メニューリストからリッチコンテンツ作成を選択します。

f:id:makimakimakino:20190420115449p:plain

新規作成を押下します。

f:id:makimakimakino:20190420115637p:plain

タイプは適当に設定してください。

f:id:makimakimakino:20190420115831p:plain

コンテンツの左側のブロックがメニューボタンのレイアウトになっていて、それぞれのボタンを押したときの挙動を右側で設定します。

アイコンや、ラベルはお好きに設定してもらって、大事なのは、リンクです。

LINE内でアプリを立ち上げられるようにするには、URLを選択し、先ほどのLIFF URLを記載します。

これで保存すると、リッチメニューボタンを押したときにアプリが表示されます。

f:id:makimakimakino:20190420120016p:plain

以上で動くようになったはずです。

それでは早速動かしてみましょう。

動作検証

ボットを開き、リッチメニューを表示させます。先ほど作ったLIFFTestメニューを押下します。

アプリがLINEブラウザ内で立ち上がり、sdkのinit関数が呼び出されます。

。。。ん?あれ?

認証できないと表示されました。

LINEにメッセージを送ってみます。

テキストボックスに文字を入力して送信ボタンを押下します。

やはり動かないようです。

認証に失敗しているのでuserIdが取得できていない上に、もちろんLINEメッセージも送信できていません。

まとめ

今回はGASのサーバーレスアプリとLINEの連携ということでLIFFを使ってみました。

結論として、アプリ自体をLINEの内部ブラウザで表示させることには成功したものの、認証周りでLINEとの連携まではできませんでした。

なぜ認証に失敗するのか、設定が間違えているのか、GAS特有の制約にはまっているのか、Webアプリ側でLINEログインを実装しないと動かないのか。。。ちょっとよくわからないので継続して調べてみます。