はなちるのマイノート

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

【GAS】ラインで送られた画像をGoogleDriveに保存する

はじめに

今回はラインで送られた画像をGoogleDriveに保存する記事になります!

実際のやり取りはこんな感じ。

f:id:hanaaaaaachiru:20191106003311p:plain

この画像は後でラズパイの記事に使おうかなと思っている画像です。割とスマホで写真を撮ったものをそのままラインにあげることで保存できるのはありがたいですね。

こちらも思ったよりも簡単にできるので、早速やっていきましょう!

ラインからの画像の取得

LINEでBotに向かって画像を投稿すると、こののようなjsonがWebhookにPOSTされます。

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

Messaging APIリファレンス

ちなみに普通のテキストメッセージはこんな感じ。

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "text",
    "text": "Hello, world!"
  }
}

これら二つを見比べると、message.typeにてどんな種類のメッセージが送られてきたかを判断することができます

余談ですが、動画はvideo,音声はaudio,ファイルはfile,位置情報はlocation,スタンプはstickerになります。

これを考慮しながらコードをかいてみましょう。

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

function doPost(e) {
    var json = JSON.parse(e.postData.contents);
    if (json.event[0].message.type !== 'image')
        return;
    var url = 'https://api.line.me/v2/bot/message/' + json.events[0].message.id + '/content/';
    var image = getImage(url);
}

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

GoogleDriveに保存する

GoogleDriveに保存する方法はこれだけでOKです。

var dir = DriveApp.getFolderById("画像を中に入れたいフォルダのID");
dir.createFile(image);

フォルダのIDは、実際にGoogle Driveのフォルダを開いたときのURLから確認することができます。
f:id:hanaaaaaachiru:20191106002647p:plain

コード

この二つを組み合わせるとこんな感じ。

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

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

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

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

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

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

さいごに

こんな短いコードでできるなんて本当にすごいですよね。

最近はUnityに関する記事が少なくなってきていますが、もう少しGASに飽きるまでお付き合いいただければ…。

また名前を付けた場合はこちらの記事を是非!

www.hanachiru-blog.com