GoogleAppsScript
Line
bot
linebot
LINEmessagingAPI

Google Apps ScriptでPushメッセージのLINE Botを作る。

こちらの記事の続編です。

Pushメッセージとは

基本的にBotは送信されたメッセージに反応しますが、PushメッセージはBotからメッセージを送ることができます。
企業のアカウントなどを友達登録していたら、よくBotメッセージがくると思いますが、それがPushメッセージになります。

今回は、GASを使って毎朝決まった時間にメッセージを送ってくるBotを作ろうと思います。

準備

アクセストークンの取得やGASのエディタの開き方などのは前回の記事を参考にしてください。(この記事を書いてる間にサイトのデザインが変わりましたがあまり気にしない...)

プランについて

Pushメッセージを送るにはとりあえず「Developer Trial」のプランを使用すれば大丈夫です。

ユーザーIDについて

Pushメッセージを送るには送信する人のユーザーIDが必要になります(グループに送る場合はgroupIDが必要)。Botをフォローしているユーザー全員に送りたい場合はそれぞれのユーザーIDをBotのフォローイベントなどを使って取得して、それをDBに保存する必要があり少々面倒です。
なので、今回はとりあえず自分にだけPushメッセージが送ることができればいいので、自分のアカウントのユーザーIDを取得します。
ユーザーIDはチャネル基本設定の一番下の「Your user ID」にあります。
LINE_Developers.jpg

こちらをコピーしておきましょう。

開発

APIトークンとuserIDを取得したということで、GAS上で開発していきます。
コードはこんな感じです。

var CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN'; 
var USER_ID = 'YOUR_USER_ID';

function pushMessage() {
    //deleteTrigger();
  var postData = {
    "to": USER_ID,
    "messages": [{
      "type": "text",
      "text": "おはよう",
    }]
  };

  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };
  var response = UrlFetchApp.fetch(url, options);
}

トークンとユーザーIDを入力したら、保存して
関数pushMessageを選択して実行してみましょう。(その前にBotのアカウントに友達登録をしておいてください)
push_test.jpg

このように、事前にメッセージを入れなくてもBotからメッセージが来たら成功です。
LINE.jpg

解説

やっていることは、前回のreplyメッセージとほとんど同様で、replyメッセージではユーザーから送られてきたメッセージに対応して、

https://api.line.me/v2/bot/message/reply

こちらのエンドポイントにPostを送ることで返信ができました。

こんかいのPushメッセージでは、ユーザーからのメッセージが来なくても

https://api.line.me/v2/bot/message/push

こちらのエンドポイントに直接Postを送ることでメッセージを送信しています。
ユーザーIDを必要とするのは送る人を限定するためです。

しかし、いちいちpushMessageの関数を手動で実行するのは面倒なので、自動でpushMessageを実行するよう設定しましょう。

自動実行の設定

GASには毎日決まった時間に実行するトリガーの機能があります。

編集 -> 現在のプロジェクトのトリガー
push_test.jpg

まだトリガーはないので新しく作成します。
push_test.jpg

ここで実行する関数と時間を設定できるのですが
push_test.jpg

写真のように0時〜1時までのように1時間のうちでどこかで実行するという風なアバウトな設定しかできません。

そこで、コードの方で決まった時間に実行されるトリガーを作成し、GUI上のトリガーでそのトリガーを作る関数を呼ぶようにします。
関数pushMessageが7時に実行されるようにする、以下のコードを追加します。

  //7時にトリガーを設定
function setTrigger() {
  var triggerDay = new Date();
  triggerDay.setHours(7);
  triggerDay.setMinutes(00);
  ScriptApp.newTrigger("push_message").timeBased().at(triggerDay).create();
}

さらに、GASでは実行したトリガーは自動で削除されず残ってしまうので、トリガーを削除するコードも追記します。

// トリガーを削除する関数(消さないと残る)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "push_message") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

そして、deleteTriggerをpushMessageの中で呼ぶように追記します。

function pushMessage() {
    deleteTrigger();
  var postData = {

そして、7時までにsetTrigger関数を実行するように設定します。
gomi.jpg

この状態で保存すると、毎朝の7時にBotから「おはよう」とメッセージが来るはずです。
これで完成です!

あとがき

そういえば、最近、「LINE BOOT AWARDS」が発表されましたね。
GASで何かBotを作って応募するのも楽しそうですね!