2018-03-22

Lineから送った画像をGoogle Driveに保存する方法

Lineから送った画像ファイルを、Google Driveに保存することができたので、そのやり方についてメモ。





まず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)
  }

}


注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...