LINEとメールを連携させて、LINE未利用ユーザとLINEする方法(Ver.4)

前回からさらに更新です。
新しいグループに入るときや個人チャットを始める時にイチイチ管理者側で対応するのが面倒だったので、エイリアスをグループID・ユーザーID(以下、GID)にすることで自動でエイリアスが生成されるようにしました。

①LINE未利用ユーザがLINEグループに投稿

注:2行目、27行目、64行目は環境に合わせて入力してください。
47行目辺りで受信アドレスが"test+GID@gmail.com"の形式であることを前提に、GIDを抽出しています。

  1. // LINE Developersに書いてあるChannel Access Token
  2. var access_token = ""
  3. function getMail(){
  4.   
  5.   //スターの付いていないスレッドを最大5件取得
  6.   var myThreads = GmailApp.search("-is:starred", 0, 5);
  7.   //スレッド情報を取得し配列に格納
  8.   var myMessages = GmailApp.getMessagesForThreads(myThreads);
  9.   
  10.   //古いスレッドから確認
  11.   for(var i=myMessages.length-1; 0<=i; i--){
  12.     //古いメールから確認
  13.     for(var j in myMessages[i]){
  14.       //スターがついていないメールを処理
  15.       if(!myMessages[i][j].isStarred()){
  16.         
  17.         var strDate = myMessages[i][j].getDate();
  18.         var strSubject = myMessages[i][j].getSubject();
  19.         var strMessage = myMessages[i][j].getBody().slice(0,1000);
  20.         var to = myMessages[i][j].getTo();
  21.         var from = myMessages[i][j].getFrom();
  22.         var attachments = myMessages[i][j].getAttachments(); // 添付ファイル(配列で帰ってくる)
  23.         
  24.         // 特定アドレス以外からのメールは処理対象外
  25.         var MyMailFlag = 0;
  26.         var MyAddress = ["", "", "", ""];
  27.         for(var k=0; k<MyAddress.length; k++){
  28.           if(from.match(MyAddress[k])){
  29.             MyMailFlag = 1;
  30.             Logger.log(MyAddress[k])
  31.           }
  32.         }
  33.         if(MyMailFlag==0){
  34.           //処理済みフラグとしてスターをつける
  35.           myMessages[i][j].star();
  36.           return;
  37.         }
  38.         
  39.         //htmlメールは対象外
  40.         if(strMessage.match("html")){
  41.           MailApp.sendEmail(from , "htmlメールです", "htmlメールです。テキスト形式でメールを送信してください。", {replyTo:to});
  42.           myMessages[i][j].star();
  43.           return;
  44.         }
  45.         
  46.         //指定アドレス毎にトークン=送信先グループを変更
  47.           var user = to.split("@");
  48.           var GIDs = user[0].split("+");
  49.           var GID = GIDs[1];
  50.         
  51.         
  52.         //本文がある場合
  53.         if (0<strMessage.length){
  54.           //LINEにメッセージを送信する関数に日付、件名、メッセージ、トークンをセット
  55.           push(strMessage,GID);
  56.         }
  57.         
  58.         //添付ファイルがある場合
  59.         if (0<attachments.length){
  60.           //最初の添付ファイルのみ利用
  61.           var attachment = attachments[0];
  62.           //添付ファイルをGoogle Driveへアップし、そのURLを送信
  63.           var folder = DriveApp.getFolderById('');
  64.           var file = folder.createFile(attachment);
  65.           push(file.getUrl(),GID);
  66.         }
  67.       }
  68.       
  69.       //処理済みフラグとしてスターをつける
  70.       myMessages[i][j].star();
  71.     }
  72.   }
  73. }
  74. //実際にメッセージを送信する関数を作成します。
  75. function push(text, GID) {
  76.   //メッセージを送信(push)する時に必要なurlでこれは、皆同じなので、修正する必要ありません。
  77.   //この関数は全て基本コピペで大丈夫です。
  78.   var url = "https://api.line.me/v2/bot/message/push";
  79.   var headers = {
  80.     "Content-Type" : "application/json; charset=UTF-8",
  81.     'Authorization': 'Bearer ' + access_token,
  82.   };
  83.   
  84.   //toのところにメッセージを送信したいユーザーのIDを指定します。(toは最初の方で自分のIDを指定したので、linebotから自分に送信されることになります。)
  85.   //textの部分は、送信されるメッセージが入ります。createMessageという関数で定義したメッセージがここに入ります。
  86.   var postData = {
  87.     "to" : GID,
  88.     "messages" : [
  89.       {
  90.         'type':'text',
  91.         'text': text,
  92.       }
  93.     ]
  94.   };
  95.   
  96.   var options = {
  97.     "method" : "post",
  98.     "headers" : headers,
  99.     "payload" : JSON.stringify(postData),
  100.     "muteHttpExceptions" : true
  101.   };
  102.   
  103.   return UrlFetchApp.fetch(url, options);
  104. }

②LINEグループの投稿をLINE未利用ユーザに転送

注:1行目、60行目、65行目、71行目、78行目、152行目、162行目は環境に合わせて入力してください。
60行目、65行目はgmailアカウントが"test@gmail.com"の時の例となります。返信先アドレスが"test+GID@gmail.com"になるようにしています。

  1. var ACCESS_TOKEN = '';
  2. function doPost(e) {
  3.   
  4.   // メッセージ返信
  5.   
  6.   replyMessage(e);
  7.   return ContentService.createTextOutput(JSON.stringify({ content: 'post ok' })).setMimeType(ContentService.MimeType.JSON);
  8. };
  9. var replyMessage = function (e) {
  10.   var line = JSON.parse(e.postData.contents).events[0]; //メッセージ
  11.   switch(line.message.type){
  12.     // テキストメッセージ
  13.     case 'text':
  14.       var strBody = line.message.text;
  15.       break;
  16.     // 画像
  17.     case 'image':
  18.       var LINE_END_POINT = "https://api-data.line.me/v2/bot/message/" + line.message.id + "/content";
  19.       var image_temp = getImage(LINE_END_POINT);
  20.       var strBody = '画像です:' + saveImage(image_temp);
  21.       break;
  22.     //動画
  23.     case 'video':
  24.       var strBody = '動画です。アップロードに成功した場合URLが通知されます。失敗した場合通知されません。';
  25.       var attatchFlag = 1;
  26.       break;
  27.     //音声
  28.     case 'audio':
  29.       var strBody = '音声です。アップロードに成功した場合URLが通知されます。失敗した場合通知されません。';
  30.       var attatchFlag = 1;
  31.       break;
  32.     //ファイル
  33.     case 'file':
  34.       var strBody = 'ファイルです。アップロードに成功した場合URLが通知されます。失敗した場合通知されません。';
  35.       var attatchFlag = 1;
  36.       break;
  37.     //スタンプ
  38.     case 'sticker':
  39.       var blob_attach = UrlFetchApp.fetch('https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png').getBlob();
  40.       var strBody = 'スタンプです:' + 'https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png';
  41.       break;
  42.   }
  43.   
  44.   var userId = JSON.parse(e.postData.contents).events[0].source.userId;
  45.   var username = getUsername(userId);
  46.   if (username == 0){
  47.     username = '不明なユーザ';
  48.   }
  49.   
  50.   //グループIDの取得
  51.   var GID = line.source.groupId;
  52.   // 返信先と件名の設定
  53.   switch(GID){
  54.       
  55.     case undefined: // 個人チャット
  56.       var replyto = "test+" + userId + "@gmail.com";
  57.       var strSubject="個人 LINE転送";
  58.       break;
  59.       
  60.     default: // その他のグループ
  61.         var replyto = "test+" + GID + "@gmail.com";
  62.         var GroupName = getGroupname(GID);
  63.         var strSubject="グループ LINE転送 [" + GroupName + "]";
  64.         break;
  65.   }
  66.   var strTo="";
  67.   
  68.   MailApp.sendEmail(strTo , strSubject, "[" + username + "]" + strBody, {replyTo:replyto, attachments: blob_attach});
  69.   
  70.   //画像以外の添付ファイルの場合の追加処理(アップロードとURL取得)
  71.   if (attatchFlag == 1){
  72.     var blob = get_line_content(line.message.id);
  73.     var folder = DriveApp.getFolderById('');
  74.     var file = folder.createFile(blob);
  75.     var strBody = '添付ファイルURLです:' + file.getUrl();
  76.     MailApp.sendEmail(strTo , strSubject, "[" + username + "]" + strBody, {replyTo:replyto, attachments: blob_attach});
  77.   }
  78. }
  79. //グループの表示名取得
  80. function getGroupname(GroupId) {
  81.   var url = 'https://api.line.me/v2/bot/group/' + GroupId + '/summary';
  82.   try {//エラー処理
  83.     var response = UrlFetchApp.fetch(url, {
  84.       'headers': {
  85.         'Authorization': 'Bearer ' + ACCESS_TOKEN
  86.       }
  87.     })
  88.     }catch(e){ //表示名を取得できなかったら
  89.       return 0;
  90.     }
  91.   return JSON.parse(response.getContentText()).groupName;
  92. }
  93. //Userの表示名取得
  94. function getUsername(userId) {
  95.   var url = 'https://api.line.me/v2/bot/profile/' + userId;
  96.   try {//エラー処理
  97.     var response = UrlFetchApp.fetch(url, {
  98.       'headers': {
  99.         'Authorization': 'Bearer ' + ACCESS_TOKEN
  100.       }
  101.     })
  102.     }catch(e){ //表示名を取得できなかったら
  103.       return 0;
  104.     }
  105.   return JSON.parse(response.getContentText()).displayName;
  106. }
  107. //Blob形式で画像を取得する
  108. function getImage(LINE_END_POINT){
  109.   //ファイル名に使う現在日時をMomentライブラリーを使って取得
  110.   var date = Moment.moment(); //現在日時を取得
  111.   var formattedDate = date.format("YYYYMMDD_HHmmss");
  112.   try {
  113.     var url = LINE_END_POINT;
  114.     var headers = {
  115.       "Content-Type": "application/json; charset=UTF-8",
  116.       "Authorization": "Bearer " + ACCESS_TOKEN
  117.     };
  118.     var options = {
  119.       "method" : "get",
  120.       "headers" : headers,
  121.     };
  122.   var res = UrlFetchApp.fetch(url, options);
  123.   //Blob形式で画像を取得し、ファイル名を設定する
  124.   //ファイル名: LINE画像_YYYYMMDD_HHmmss.png
  125.   var imageBlob = res.getBlob().getAs("image/png").setName("LINE画像_" + formattedDate + ".png")
  126.   //変数imageBlobを関数saveImageに渡し、saveImageを起動する
  127.   return imageBlob;
  128.   } catch(e) {
  129.   //例外エラーが起きた時にログを残す
  130.   Logger.log(e.message);
  131.   }
  132. }
  133. //画像をGoogle Driveのフォルダーに保存する
  134. function saveImage(imageBlob){
  135.   try{
  136.     var folder = DriveApp.getFolderById("");
  137.     var file = folder.createFile(imageBlob);
  138.     return file.getUrl();
  139.   } catch(e){
  140.     //例外エラーが起きた時にログを残す
  141.     outputLog(e)
  142.   }
  143. }
  144. function outputLog(txt) {
  145.   var id = "";
  146.   var spreadSheet = SpreadsheetApp.openById(id);
  147.   var sheetName = "シート1";
  148.   
  149.   spreadSheet.getSheetByName(sheetName).appendRow(
  150.     [new Date(), txt]
  151.   );
  152. }
  153. // Get content of LINE
  154. function get_line_content(message_id) {
  155.   var headers = {
  156.     'Authorization': 'Bearer ' + ACCESS_TOKEN
  157.   };
  158.   var options = {
  159.     'headers': headers
  160.   };
  161.   var url = 'https://api-data.line.me/v2/bot/message/' + message_id + '/content';
  162.   try{
  163.     var blob = UrlFetchApp.fetch(url, options);
  164.   }catch(e){
  165.     outputLog(e)
  166.   }
  167.   return blob;
  168. }

コメント

このブログの人気の投稿

湾岸ミッドナイトの聖地についてまとめてみる

MakeMKVでリッピングに失敗する時の対処方法

中華タブレットのバッテリー交換に挑戦した話