LINEとメールを連携させて、LINE未利用ユーザとLINEする方法(Ver.2)
【追記】更新版(Ver.3)の記事を書きました。
前回の続きというか更新版です。
使っていくうちに、以下のような不満が出始めました。
・1分間に複数でメールを送ると送ったのとは逆の順番でLINEグループに投稿される
・絵文字が文字化けする
・画像、動画のやり取りが出来ない
・スタンプは処理の対象外なので場合によっては会話が繋がらない
そこで今回、上記の問題を解消してみました。
①LINE未利用ユーザがLINEグループに投稿
コードは以下のように変更しました。
for文でデクリメントを利用することで正しい順番でグループに投稿されるようにしました。
また、添付ファイルがある場合はGoogle Driveにファイルをアップロードし、そのURLをグループに投稿します。
そのフォルダはDriveApp.getFolderByIdやDriveApp.getFilesByNameで指定します。
この辺りの詳細は以下のページを参考にしました。
なお、添付ファイルを保存するフォルダは公開に設定しておく必要があります。
若干変更した点として、画像や動画はGoogleドライブにアップロードされ、そのURLがメール転送されるようにした点があります。
このアップロードするフォルダは①と同様公開しておく必要があります。
画像とスタンプはメールへの添付も行われます。
また、前回(Ver.1)の時はメール送信をGmailAppクラスで行っていましたが、GmailAppクラスでは絵文字が文字化けするバグがあるため、MailAppクラスに変更しました。
前回の続きというか更新版です。
使っていくうちに、以下のような不満が出始めました。
・1分間に複数でメールを送ると送ったのとは逆の順番でLINEグループに投稿される
・絵文字が文字化けする
・画像、動画のやり取りが出来ない
・スタンプは処理の対象外なので場合によっては会話が繋がらない
そこで今回、上記の問題を解消してみました。
①LINE未利用ユーザがLINEグループに投稿
コードは以下のように変更しました。
- // 適合条件をセット
- var FindSubject = 'from:(test@ezweb.ne.jp) to:(test@gmail.com)';
- function getMail(){
-
- //指定した件名のメールを検索して最大5件取得
- var myThreads = GmailApp.search(FindSubject, 0, 5);
- //メール情報を取得し配列に格納
- var myMessages = GmailApp.getMessagesForThreads(myThreads);
-
- // 古いスレッドから先に処理
- for(var i=myMessages.length-1; 0<=i; i--){
- //スレッドにおける最新の返信のみ利用
- j = myMessages[i].length-1
-
- //スターがついていないものを処理
- if(!myMessages[i][j].isStarred()){
-
- var strDate = myMessages[i][j].getDate();
- var strSubject = myMessages[i][j].getSubject();
- var strMessage = myMessages[i][j].getBody().slice(0,200);
-
- //本文がある場合
- if (0<strMessage.length){
- //LINEにメッセージを送信する関数に日付、件名、メッセージをセット
- sendLine(strDate,strSubject,strMessage);
- }
-
- //添付ファイル
- var attachments = myMessages[i][j].getAttachments(); //配列で帰ってくる
-
- //添付ファイルがある場合
- if (0<attachments.length){
- //最初の添付ファイルのみ利用
- var attachment = attachments[0];
- //添付ファイルをGoogle Driveへアップし、そのURLを送信
- var folder = DriveApp.getFolderById('フォルダのIDを指定');
- var file = folder.createFile(attachment);
- sendLine(strDate,strSubject,file.getUrl());
- }
- }
-
- //処理済みフラグとしてスターをつける
- myMessages[i][j].star();
- }
- }
- function sendLine(strDate,strSubject,strMessage){
-
- //Lineに送信するためのトークン情報は書き換えてください
- var strToken = "トークン";
- var options =
- {
- "method" : "post",
- "payload" : "message=" + strMessage,
- "headers" : {"Authorization" : "Bearer "+ strToken}
-
- };
- UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
- }
for文でデクリメントを利用することで正しい順番でグループに投稿されるようにしました。
また、添付ファイルがある場合はGoogle Driveにファイルをアップロードし、そのURLをグループに投稿します。
そのフォルダはDriveApp.getFolderByIdやDriveApp.getFilesByNameで指定します。
この辺りの詳細は以下のページを参考にしました。
なお、添付ファイルを保存するフォルダは公開に設定しておく必要があります。
スプレッドシート・フォルダのID確認方法
googleスプレッドシートやドキュメント、プレゼンテーションを使用しているなら、【すべてのデータに固有なIDがふられている】ようになっています。 このIDは、google apps scriptを書く上で必ず必要になってくる情報なので、その確認方法をご紹介します。 ◆...
②LINEグループの投稿をLINE未利用ユーザに転送
こちらのページの内容を参考に、コードは以下のように変更しました。Google Apps Script(GAS)を用いてLINE Botが受信した情報をSlackに送る
どうもオーカワ(@okawa_compass)です。以前LINE Botに関するいくつか記事を書かせて頂きました。 routecompass.net 1 user 25 poc …
- var ACCESS_TOKEN = 'アクセストークン';
- var url = 'https://api.line.me/v2/bot/message/reply'; // 応答メッセージ用のAPI URL
- function doPost(e) {
-
- // メッセージ返信
- replyMessage(e);
- return ContentService.createTextOutput(JSON.stringify({ content: 'post ok' })).setMimeType(ContentService.MimeType.JSON);
- };
- // メッセージ返信
- var replyMessage = function (e) {
-
- var line = JSON.parse(e.postData.contents).events[0]; //メッセージ
- switch(line.message.type){
- // テキストメッセージ
- case 'text':
- var strBody = line.message.text;
- break;
- // 画像
- case 'image':
- var blob_attach = get_line_content(line.message.id);
- var folder = DriveApp.getFolderById('フォルダID');
- var file = folder.createFile(blob_attach);
- var strBody = '画像です:' + file.getUrl();
- break;
- //動画
- case 'video':
- var blob = get_line_content(line.message.id);
- var folder = DriveApp.getFolderById('フォルダID');
- var file = folder.createFile(blob);
- var strBody = '動画です:' + file.getUrl();
- break;
- //音声
- case 'audio':
- var blob = get_line_content(line.message.id);
- var folder = DriveApp.getFolderById('フォルダID');
- var file = folder.createFile(blob);
- var strBody = '音声です:' + file.getUrl();
- break;
- //ファイル
- case 'file':
- var blob = get_line_content(line.message.id);
- var folder = DriveApp.getFolderById('フォルダID');
- var file = folder.createFile(blob);
- var strBody = 'ファイルです:' + file.getUrl();
- break;
- //スタンプ
- case 'sticker':
- var blob_attach = UrlFetchApp.fetch('https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png').getBlob();
- var strBody = 'スタンプです:' + 'https://stickershop.line-scdn.net/stickershop/v1/sticker/' + line.message.stickerId + '/android/sticker.png';
- break;
- }
-
- var userId = JSON.parse(e.postData.contents).events[0].source.userId;
- var username = getUsername(userId);
- if (username == 0){
- username = '不明なユーザ';
- }
-
- var strTo="test@ezweb.ne.jp";
- var strSubject="LINE転送";
-
- MailApp.sendEmail(strTo , strSubject, "[" + username + "]" + strBody, {attachments: blob_attach});
- }
- //Userの表示名取得
- function getUsername(userId) {
- var url = 'https://api.line.me/v2/bot/profile/' + userId;
- try {//エラー処理
- var response = UrlFetchApp.fetch(url, {
- 'headers': {
- 'Authorization': 'Bearer ' + ACCESS_TOKEN
- }
- })
- }catch(e){ //表示名を取得できなかったら
- return 0;
- }
- return JSON.parse(response.getContentText()).displayName;
- }
- // Get content of LINE
- function get_line_content(message_id) {
- var headers = {
- 'Authorization': 'Bearer ' + ACCESS_TOKEN
- };
- var options = {
- 'headers': headers
- };
- var url = 'https://api.line.me/v2/bot/message/' + message_id + '/content';
- var blob = UrlFetchApp.fetch(url, options);
- return blob;
- }
若干変更した点として、画像や動画はGoogleドライブにアップロードされ、そのURLがメール転送されるようにした点があります。
このアップロードするフォルダは①と同様公開しておく必要があります。
画像とスタンプはメールへの添付も行われます。
また、前回(Ver.1)の時はメール送信をGmailAppクラスで行っていましたが、GmailAppクラスでは絵文字が文字化けするバグがあるため、MailAppクラスに変更しました。
コメント
コメントを投稿