高専の 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); }