今回はグループチャットのメッセージにも反応するLINE BOTを作成する。
とはいったものの基本的にはグループのへの参加を許可にするだけで良く(後述)あとは通常のBOTと同様。
LineのBotはSSL証明書が必要。
Let's Encrypt
というフリーのSSL証明書を使う方法もありそうだが、自前でサーバーを用意する場合は更に独自ドメインも必須(IPアドレスをWebhook
URLに設定出来ない噂。未検証)
Google App Script
を使って無料で作成幸いなことにGoogle App Script
(以下GAS
)という無料のサーバが存在する。
使用量に制限があるがそれを除けばSSL証明やドメイン等新規取得せず常時稼働するBOTが作成できる。
デメリットとしては
JavaScript
で書かなければならないGAS
特有のメソッドや動作概念などを学習する必要があるとは言えそれほど難しくなく自前でサーバーを用意するぐらいならこちらのほうがよっぽど簡単かと思う。
ここから順番に私が実際にBOTを作成した手順を記す。
Webhook
を使った場合はデータ量と回数に制限がある模様。
とりあえず回数が2万回を超えなければよさそう。
不特定多数に公開する場合は厳しいかも。個人なら十分。
画像は公式の制限
CPUの時間制限が記述されていないのが気になる。長期的に使用する場合は万が一に備えて裏で時間制限があるのではと疑っておいたほうが良さそう。
公式の開発WEB「Line Developers」から
Messaging APIを利用するには に従ってチャンネルを開設する。
たったこれだけでユーザーで言うところのアカウントが1つ作られたような状態になる。
Line Official Account Managerの「チャット」画面を通して手動でBOTからチャットを送信できるようになっている。
グループチャットへの参加は明示的に許可しておかないと招待してもBOTが参加しない。
Line Official Account Managerから
2020/07/07追記
BOTは無料コースだと1ヶ月1000通しかメッセージが送れない(10人のグループなら1回で10カウント)
そこで同じアカウントから別のBOTを作ってみたところBOTごとにメッセージの最大値が1000で分けられているようなので
「もしかして複数のBOTで処理を分ければ1000通の無料枠突破できるんじゃ?」
と思って実験してみた。
しかしここもうまいこと出来ているようで一つのグループに別のBOTを招待出来ない(botがグループに参加してくれない)
恐らく別の配信者のBOTなら複数招待できて同一配信者の場合は一つのみなのではないだろうか。
実験では2BOTいた場合、片方をキックした後もう片方を招待すると入ってくるということがわかっている。
あくまで私のテストの結果なので他の方法があったり仕様が変更されることもあると思うので参考までに。
続けて「応答設定」で「応答モード」を「Bot」に変更。
確かデフォルトではBot
になっていた記憶。私はテストで設定を変更していた。
ここからBOT本体(自動でメッセージを送信するプログラム)の作成に入っていく。
誰でも勝手にBOTを操作できないようにBOT側から認証が必要。
LINE DevelopersのConsoleを開く
Providersから該当のチャンネルを選択
Messaging API
画面から取得
私は以前取得したものが残っていたが消去というコマンドはない模様。
ここではトークンが無効になるまでの制限時間を指定できるが0hours
にしておけば無制限となる。
Issue
ボタンで発行。
Googleドライブにログインする。
マイドライブ>その他>Google App Script
メニューにGAS
が表示されていない場合はアプリを追加する必要がある。
とりあえずテストコードをコピペしてみよう。
先程のアクセストークンだけ冒頭にペーストするのを忘れないように。
const TOKEN = 'ここにトークンを入れる'
const doGet = (e) => {
return ContentService.createTextOutput("OK")
}
const doPost = (e) => {
const replyToken = JSON.parse(e.postData.contents).events[0].replyToken
//userMessageにユーザーから送られてくるメッセージが入る
const userMessage = JSON.parse(e.postData.contents).events[0].message.text
const url = 'https://api.line.me/v2/bot/message/reply'
const response =
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': 'うけるw',
}],
}),
})
return response.getResponseCode()
}
'text': 'うけるw',
の行にメッセージを入れる。いまは何が送ってきても固定メッセージとなっている。
doGet
はテストコードなので必要ないかも。
ファイルから保存
かCTRL+S
で保存しておこう。
メニューの「公開」から「ウェブアプリケーションとして導入」
初めて公開する場合ダイアログが違うが概ね一緒かと思う。
上書きして更新する場合はProject version
をnew
に毎回設定すること。
Execute
は自分で良い。
次が重要!
一番下のWho has access to the app
をAnyone, even anonymous
に設定すること。
日本語になっている環境がある?私は英語だが、これは「匿名の接続を許可」しているのでもし日本語ならそのあたりの選択があると思う。
余談:もしこの設定を間違えて「全員」というオプションにした場合、これは匿名を弾いているのでLINE BOT
で使用できない。
「更新」ボタンを押す。
ここにWebhook
のURLが表示されている(コピーしにくいがWindows
ならトリプルクリックすると全部選択できる)
これでBOT側のプログラムが完成した。
次は先程のBOTにLINE側から接続する。
メッセージに反応するたびにこのURLにPOST
が送られる模様。
Webhook
URLは先程のURLを入れる。
Verify
ボタンを押して「SUCCESS」が表示されたら完了。
Use webhook
をオンにするのを忘れずに。
GAS
はデフォルトでhttps
なのでSSLの証明書関連の面倒な作業がすべてスキップできる。
基本的にソースコードの改変やトークン等のコピペミスをしていなければ特別いじっている設定はないのでエラーはでないはず。
もしレスポンスコードが200
ではない旨のエラーが出た場合は「匿名のアクセス」を弾いているので上記設定を見直すこと。
2020/06/02現在のテストで成功しているが、LINE
かGoogle
側の仕様変更によりこの方法がつかえなくなる可能性はある。
次のようにメッセージが送信されてくれば正常終了。
これだけあればあとはGAS
側のスクリプトを各自で用意してもらえばなんでもできるはずだ。
GAS
の仕組みであるトリガーと呼ばれるものを使えば特定の時間単位でスクリプトを起動できるので、メッセージに反応するだけではなく自走するBOT
も作れそうだ。
GAS
から更に自作サーバーと通信するなどしてより重い処理やクライアント側に用意したUIから自在にBOTを操作するなんてこともできそうだ。
友人や仕事関係のグループにプログラムで生成したメッセージを一斉送信したい用途であれば全て無料でできるので試してみて欲しい。