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

【追記】更新版(Ver.3)の記事を書きました。






前回の続きというか更新版です。
使っていくうちに、以下のような不満が出始めました。
・1分間に複数でメールを送ると送ったのとは逆の順番でLINEグループに投稿される
・絵文字が文字化けする
・画像、動画のやり取りが出来ない
・スタンプは処理の対象外なので場合によっては会話が繋がらない

そこで今回、上記の問題を解消してみました。


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


コードは以下のように変更しました。


  1. // 適合条件をセット
  2. var FindSubject = 'from:(test@ezweb.ne.jp) to:(test@gmail.com)';
  3. function getMail(){
  4.   
  5.   //指定した件名のメールを検索して最大5件取得
  6.   var myThreads = GmailApp.search(FindSubject, 0, 5);
  7.   //メール情報を取得し配列に格納
  8.   var myMessages = GmailApp.getMessagesForThreads(myThreads);
  9.   
  10.   // 古いスレッドから先に処理
  11.   for(var i=myMessages.length-1; 0<=i; i--){
  12.     //スレッドにおける最新の返信のみ利用
  13.     j = myMessages[i].length-1
  14.     
  15.     //スターがついていないものを処理
  16.     if(!myMessages[i][j].isStarred()){
  17.       
  18.       var strDate = myMessages[i][j].getDate();
  19.       var strSubject = myMessages[i][j].getSubject();
  20.       var strMessage = myMessages[i][j].getBody().slice(0,200);
  21.       
  22.       //本文がある場合
  23.       if (0<strMessage.length){
  24.         //LINEにメッセージを送信する関数に日付、件名、メッセージをセット
  25.         sendLine(strDate,strSubject,strMessage);
  26.       }
  27.       
  28.       //添付ファイル
  29.       var attachments = myMessages[i][j].getAttachments(); //配列で帰ってくる
  30.       
  31.       //添付ファイルがある場合
  32.       if (0<attachments.length){
  33.         //最初の添付ファイルのみ利用
  34.         var attachment = attachments[0];
  35.         //添付ファイルをGoogle Driveへアップし、そのURLを送信
  36.         var folder = DriveApp.getFolderById('フォルダのIDを指定');
  37.         var file = folder.createFile(attachment);
  38.         sendLine(strDate,strSubject,file.getUrl());
  39.       }
  40.     }
  41.     
  42.     //処理済みフラグとしてスターをつける
  43.     myMessages[i][j].star();
  44.   }
  45. }
  46. function sendLine(strDate,strSubject,strMessage){
  47.   
  48.   //Lineに送信するためのトークン情報は書き換えてください
  49.   var strToken = "トークン";
  50.   var options =
  51.       {
  52.         "method" : "post",
  53.         "payload" : "message=" + strMessage,
  54.         "headers" : {"Authorization" : "Bearer "+ strToken}
  55.   
  56.   };
  57. UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
  58. }




for文でデクリメントを利用することで正しい順番でグループに投稿されるようにしました。
また、添付ファイルがある場合はGoogle Driveにファイルをアップロードし、そのURLをグループに投稿します。
そのフォルダはDriveApp.getFolderByIdやDriveApp.getFilesByNameで指定します。
この辺りの詳細は以下のページを参考にしました。
なお、添付ファイルを保存するフォルダは公開に設定しておく必要があります。









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

こちらのページの内容を参考に、コードは以下のように変更しました。








  1. var ACCESS_TOKEN = 'アクセストークン';
  2. var url = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL
  3. function doPost(e) {
  4.   
  5.   // メッセージ返信
  6.   replyMessage(e);
  7.   return ContentService.createTextOutput(JSON.stringify({ content: 'post ok' })).setMimeType(ContentService.MimeType.JSON);
  8. };
  9. // メッセージ返信
  10. var replyMessage = function (e) {
  11.   
  12.   var line = JSON.parse(e.postData.contents).events[0]; //メッセージ
  13.   switch(line.message.type){
  14.     // テキストメッセージ
  15.     case 'text':
  16.       var strBody = line.message.text;
  17.       break;
  18.     // 画像
  19.     case 'image':
  20.       var blob_attach = get_line_content(line.message.id);
  21.       var folder = DriveApp.getFolderById('フォルダID');
  22.       var file = folder.createFile(blob_attach);
  23.       var strBody = '画像です:' + file.getUrl();
  24.       break;
  25.     //動画
  26.     case 'video':
  27.       var blob = get_line_content(line.message.id);
  28.       var folder = DriveApp.getFolderById('フォルダID');
  29.       var file = folder.createFile(blob);
  30.       var strBody = '動画です:' + file.getUrl();
  31.       break;
  32.     //音声
  33.     case 'audio':
  34.       var blob = get_line_content(line.message.id);
  35.       var folder = DriveApp.getFolderById('フォルダID');
  36.       var file = folder.createFile(blob);
  37.       var strBody = '音声です:' + file.getUrl();
  38.       break;
  39.     //ファイル
  40.     case 'file':
  41.       var blob = get_line_content(line.message.id);
  42.       var folder = DriveApp.getFolderById('フォルダID');
  43.       var file = folder.createFile(blob);
  44.       var strBody = 'ファイルです:' + file.getUrl();
  45.       break;
  46.     //スタンプ
  47.     case 'sticker':
  48.       var blob_attach = UrlFetchApp.fetch('https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png').getBlob();
  49.       var strBody = 'スタンプです:' + 'https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png';
  50.       break;
  51.   }
  52.   
  53.   var userId = JSON.parse(e.postData.contents).events[0].source.userId;
  54.   var username = getUsername(userId);
  55.   if (username == 0){
  56.     username = '不明なユーザ';
  57.   }
  58.   
  59.   var strTo="test@ezweb.ne.jp";
  60.   var strSubject="LINE転送";
  61.   
  62.   MailApp.sendEmail(strTo , strSubject, "[" + username + "]" + strBody, {attachments: blob_attach});
  63. }
  64. //Userの表示名取得
  65. function getUsername(userId) {
  66.   var url = 'https://api.line.me/v2/bot/profile/' + userId;
  67.   try {//エラー処理
  68.     var response = UrlFetchApp.fetch(url, {
  69.       'headers': {
  70.         'Authorization': 'Bearer ' + ACCESS_TOKEN
  71.       }
  72.     })
  73.     }catch(e){ //表示名を取得できなかったら
  74.       return 0;
  75.     }
  76.   return JSON.parse(response.getContentText()).displayName;
  77. }
  78. // Get content of LINE
  79. function get_line_content(message_id) {
  80.   var headers = {
  81.     'Authorization': 'Bearer ' + ACCESS_TOKEN
  82.   };
  83.   var options = {
  84.     'headers': headers
  85.   };
  86.   var url = 'https://api.line.me/v2/bot/message/' + message_id + '/content';
  87.   var blob = UrlFetchApp.fetch(url, options);
  88.   return blob;
  89. }






若干変更した点として、画像や動画はGoogleドライブにアップロードされ、そのURLがメール転送されるようにした点があります。
このアップロードするフォルダは①と同様公開しておく必要があります。
画像とスタンプはメールへの添付も行われます。
また、前回(Ver.1)の時はメール送信をGmailAppクラスで行っていましたが、GmailAppクラスでは絵文字が文字化けするバグがあるため、MailAppクラスに変更しました。

コメント

このブログの人気の投稿

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

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

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