高専の KOSEN ハッカソン LINE にて、学生さんがいろいろと作品を作る間、自分でも LINE メッセージAPIで遊んでみた。
LINEボットのオーム返しの例
参考にしたサイトのプログラムを若干修正してある。
// line developersに書いてあるChannel Access Token
var access_token = "xxxxxx";
// pushしたいときに送る先のuser_id or group_idを指定する
var admin = "Uxxxx";
// postされたログを残すスプレッドシートのid
var spreadsheet_id = "xxxx";
// スプレッドシートの"user-db"シートにユーザIDと名前の対応表を保存
// 通常のサーバ処理なら、データベースに保存なんだろうけど、
// すべてをGoogle Driveで完結させたいので、Google Spredsheed を
// データベースのように使う。
var user_db_size = 10 ;
function get_user_name(source) {
// スプレッドシートのuser-dbシートに、IDと名前の一覧を記録
// Uxxxxxxxx なまえ
var array = SpreadsheetApp.openById(spreadsheet_id)
.getSheetByName('user-db')
.getRange(1,1,2,user_db_size).getValues() ;
for( var i = 0 ; i < array.length ; i++ ) {
if ( array[i][0] == "" ) // 無記入欄で終了
return source.userId ;
else if ( array[i][0] == source.userId )
return array[i][1] ; // 対応するものを見つけた
}
return source.userId ;
}
/**
* 指定のuser_idにpushをする
*/
function push(text,to) {
var url = "https://api.line.me/v2/bot/message/push";
var headers = {
"Content-Type" : "application/json; charset=UTF-8",
'Authorization': 'Bearer ' + access_token,
};
var postData = {
"to" : to,
"messages" : [
{
'type':'text',
'text':text,
}
]
};
var options = {
"method" : "post",
"headers" : headers,
"payload" : JSON.stringify(postData)
};
return UrlFetchApp.fetch(url, options);
}
/**
* 管理者宛にメッセージを送る
*/
function push_admin(text){
return push(text,admin);
}
/**
* reply_tokenを使ってreplyする
*/
function reply(event,text) {
var url = "https://api.line.me/v2/bot/message/reply";
var headers = {
"Content-Type" : "application/json; charset=UTF-8",
'Authorization': 'Bearer ' + access_token,
};
var postData = {
"replyToken" : event.replyToken,
"messages" : [
{
'type':'text',
'text':text ,
}
]
};
var options = {
"method" : "post",
"headers" : headers,
"payload" : JSON.stringify(postData)
};
return UrlFetchApp.fetch(url, options);
}
function do_reply(event) {
// リプライの処理
var text = '' ;
switch( event.message.type ) {
case 'text' : // メッセージ
text = event.message.text ;
break ;
case 'sticker' : // ステッカー
text = 'すてっかーID=' + event.message.id ;
break ;
case 'image' : // 画像
default :
text = 'event.message.type=' + event.message.type ;
break ;
}
return reply(event,'りぷらい:'+text);
}
/**
* push api で beacon 受信時の処理
*/
function do_beacon(event) {
var text = '' ;
var user = get_user_name( event.source );
var bcn = event.beacon ;
switch( bcn.type ) {
case 'enter' : // ビーコン領域に入った
text += 'ENTER' + bcn.hwid ;
break ;
case 'leave' : // ビーコン領域を抜けた(実験したけど通知は実質来ない!?)
case 'banner' : // ビーコンバナーをタップした
default :
text += bcn.type + '=' + bcn.hwid ;
break ;
}
return push_admin( 'びーこん=' + text + '(' + user + ')' , admin ) ;
}
/**
* postされたときの処理
*/
function doPost(e) {
var json = JSON.parse(e.postData.contents);
// 利用者のuseridを取得するためのlog
var data = SpreadsheetApp.openById(spreadsheet_id)
.getSheetByName('log')
.getRange(1, 1).setValue(json.events);
// 1回のPostで、メッセージと画像が複数のイベントで来る場合がある
for( var i = 0 ; i < json.events.length ; i++ ) {
var event = json.events[i] ;
switch( event.type ) {
case 'message' : // Message API の処理
do_reply(event);
break ;
case 'beacon' : // Beacon API の処理
do_beacon(event);
break ;
default: // デバッグのため
push_admin( 'それ以外=' + event.type ) ;
break ;
}
}
}
/**
* pushをしてみる
*/
function test() {
push_admin('test()の実行');
}
/**
* getされたときの処理
* URL?message=テキスト
*/
function doGet(e) {
// var data = SpreadsheetApp.openById(spreadsheet_id)
// .getSheetByName('log')
// .getRange(2, 1).setValue(e.parameter.message);
// https://script.google.com/macros/s/..../exec?message=メッセージ
if ( "message" in e.parameter )
push_admin(e.parameter.message);
}