はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【GAS】LINEで送った動画・音声・画像をGoogle Driveに保存する

はじめに

先日このような記事を書かせていただきました。

www.hanachiru-blog.com

www.hanachiru-blog.com

ここでは画像のみをGoogleDriveに保存していましたが、動画・音声も同じ手法でできることが分かりました。

f:id:hanaaaaaachiru:20191110213115p:plain

では早速行きましょう。

コード

いきなりコードを書いちゃいます。

var ACCESS_TOKEN = 'LINE Developer画面に表示されているアクセストークン';

function doPost(e) {
    var json = JSON.parse(e.postData.contents);

    if (json.event[0].message.type !== 'image' && json.event[0].message.type !== 'video' && json.event[0].message.type !== 'audio')
        return;

    var url = 'https://api.line.me/v2/bot/message/' + json.events[0].message.id + '/content/';
    var content = getContent(url);

    // 画像・動画・音声の名前を今日の日本時間にする
    var today = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
    var fileBlob = response.getBlob().setName(today);

    var dir = DriveApp.getFileById("画像・動画・音声を中に入れたいフォルダのID");
    dir.createFile(fileBlob);
}

function getContent(url) {
    return UrlFetchApp.fetch(url, {
        "method": "get",
        'headers': {
            'Content-Type': 'application/json; charset=UTF-8',
            'Authorization': 'Bearer ' + ACCESS_TOKEN
        }
    });
}

説明

ユーザーが送信した画像、動画、音声、およびファイルを取得するには、以下のエンドポイントにリスエストを送ります。

GET https://api-data.line.me/v2/bot/message/{messageId}/content

ここのmessageIdはWebhookにPOSTされたJSONに載っているものです。

・画像

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "image",
    "contentProvider": {
      "type": "line"
    }
  }
}

・動画

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "video",
    "duration": 60000,
    "contentProvider": {
      "type": "external",
      "originalContentUrl": "https://example.com/original.mp4",
      "previewImageUrl": "https://example.com/preview.jpg"
    }
  }
}

・音声

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "audio",
    "duration": 60000,
    "contentProvider": {
      "type": "line"
    }
  }
}


message.idにあるやつがそれですね。

レスポンスはステータスコード200とコンテンツのバイナリデータを返します。

またメッセージが送信されてから一定期間後に、コンテンツは自動的に削除されるそうなのでご注意を。

Messaging APIリファレンス

さいごに

あとzipなどのファイルはBOTだと投稿できない?みたいなので、そちらは無理そうでした。

もしできる方法を知っている方がいらっしゃいましたら教えていただけると嬉しいです!