まずGoogle Apps Scriptで、Webアプリとして公開しておき、その公開されたページのURLをメモしておく。「現在のウェブアプリケーションのURL」の部分。
Line Messaging APIを設定する。Lineのアクセストークンを発行し、メモしておく。
Webhock URLに先ほどメモしたURLを貼り付ける。そして、Messaging APIのアプリのアクセストークンを発行し、メモしておく。
最後に、Google Drive上に画像を保存するフォルダを作成し、そのフォルダのIDをメモしておく。URLのランダムな文字列の部分をメモしておく。
https://drive.google.com/drive/folders/[ランダムな文字列]
処理の流れとしては、
- Lineアプリで画像ファイルを送信する
- Line Messaging APIで、Webhock URLに設定したGoogle Apps Scriptが起動する
- Google Apps Scriptで、Lineから送られたメッセージIDを取得して、画像が一時保存されているURLから画像をバイナリ形式で取得する
- 取得したいバイナリ形式の画像ファイルを、Google Driveに保存する
という流れになる。
それぞれの値を任意のPROPERTY値を設定して、保存しておく。
で、ロジックとしては大体こんな感じのコードを書けば実装できる。
// プロパティ取得 var PROPERTIES = PropertiesService.getScriptProperties();//ファイル > プロジェクトのプロパティから設定した環境変数的なもの //Google Driveの画像を保存するフォルダの設定 var GOOGLE_DRIVE_FOLDER_ID = PROPERTIES.getProperty('GOOGLE_DRIVE_FOLDER_ID') //LINE・DMMの設定をプロジェクトのプロパティから取得 var LINE_ACCESS_TOKEN = PROPERTIES.getProperty('LINE_ACCESS_TOKEN') var LINE_END_POINT = "https://api.line.me/v2/bot/message/reply" //LINEからPOSTリクエストを受けたときに起動する function doPost(e){ if (typeof e === "undefined"){ /* * debug用の処理です * imageUrlに、任意のAV女優の画像を挿入しています。 */ imageEndPoint = "http://eropalace21.com/wordpress/wp-content/uploads/2016/01/sakuramana_thumb.jpg" //検証用の画像 } else { /* * Lineからメッセージが送られたときの処理です * LineのmessageIdを取得し、そこからバイナリ形式の画像データを取得します */ //messageIdから、Line上に存在するバイナリ形式の画像URLを取得します var json = JSON.parse(e.postData.contents); reply_token= json.events[0].replyToken; var messageId = json.events[0].message.id; imageBlob = getImageBlobByImageUrl(imageEndPoint); imageUrl = saveImageBlobAsPng(imageBlob) } function getImageBlobByImageUrl(url){ /* LineのメッセージIDから、送られた画像をBlob形式で取得します、 * @params - url{string}: 取得したい画像のURLです * @return * - imageBlob<string>: Blob形式で取得した画像ファイル */ try { var res = UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN, }, 'method': 'get' }); var imageBlob = res.getBlob().getAs("image/png").setName("temp.png") Logger.log("imageBlobの取得に成功しました") Logger.log("ContentType:" + imageBlob.getContentType()) Logger.log("Name: " + imageBlob.getName()) //Logger.log("") return imageBlob; } function saveImageBlobAsPng(imageBlob){ /* @params - imageBlob @void - Google Drive上の指定されたフォルダに画像を保存します */ try{ var folder = DriveApp.getFolderById(GOOGLE_DRIVE_FOLDER_ID); var file = folder.createFile(imageBlob); Logger.log("[INFO] Google Driveに以下のURLに画像が保存されました: " + folder.getUrl()) Logger.log("file.getUrl():" + file.getUrl()) return file.getUrl() } catch (e){ Logger.log("[ERROE]Google Driveに画像を保存できませんでした") Logger.log(e) } }