内容
Google Apps Scriptを使って、Googleドライブに置いた画像ファイルの本体とサムネイルへのURLを取得します。
背景
LINE Messaging APIで画像を送る際には、画像本体とサムネイル(240x240以下)へのURLが必要です。「本体はともかくサムネイルが必須って…」と悩んで調べ始めました。
https://developers.line.me/ja/reference/messaging-api/#image-message
- いまさらですが、リファレンスを見返すと、画像本体サイズも1024x1024以下となっていますね。
- ここでは 見なかったこと にします。
必要なサービス
- Google Apps Script
- DriveAppを使うにあたって、なにか許可が必要だったような、違ったような…
スクリプトと解説
// Googleドライブ上で共有設定した画像ファイルへのダイレクトリンク (本体とサムネイル)
var originalBase = 'https://drive.google.com/uc?export=view&id=';
var previewBase = 'https://drive.google.com/thumbnail?sz=w240-h240&id=';
- 変数定義です。
- 出オチでバレている気がしますが、上記のURLにGoogleドライブのファイルIDをくっつけると、目的のURLができあがります。
- previewBase のURLで指定している
sz=w240-h240
は、サムネイルサイズの上限(240x240)を示しています。画像のアスペクト比を保ったまま、指定の範囲に収まるように表示されます。
// 外部サーバにある画像のURL
var sourceUrl = 'http://xxxx/.../xx.jpg';
// Googleドライブに保存するファイル名
var fileName = 'hogehoge.jpg';
// 画像を取得してGoogleドライブに保存
var fileBlob = UrlFetchApp.fetch(sourceUrl).getBlob().setName(fileName);
var file = DriveApp.createFile(fileBlob);
// 保存した画像に共有権を設定する (リンクを知っている全員が閲覧可)
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
// 画像のファイルIDを取得する
var fileId = file.getId();
- 画像を取得・保存 → 共有権を設定 → ファイルIDを取得する部分です。
- 外部サービス(LINE)から画像が参照できるように、共有権が必要です。
// for LINE Messaging API
var pushLINE = 'https://api.line.me/v2/bot/message/push';
var CHANNEL_ACCESS_TOKEN = 'xxxxxxxxxxxxxxxx';
var userId = 'xxxxxxxx';
// Googleドライブ上の画像をLINEへプッシュ
UrlFetchApp.fetch(pushLINE, {
'headers': {
'Content-Type' : 'application/json',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
},
'method' : 'POST',
'payload': JSON.stringify({
'to' : userId,
'messages' : [{
'type' : 'image',
'originalContentUrl': originalBase + fileId,
'previewImageUrl' : previewBase + fileId
}]
})
});
- LINEへの画像送信部分です。
- 「originalContentUrl」と「previewImageUrl」に、件のURLとファイルIDを指定します。
// 画像ファイル削除
file.setTrashed(true);
- 送信後は、すぐにファイルを削除しても構いません。(未読でも大丈夫)
最後に
悔しくて試していませんが、ここで苦労して指定したサムネイル項目、実はオリジナルの画像をそのまま渡しても問題ないらしいですね。悩んで損した気分ですが、勉強になったのでまぁヨシとします。