APIから撮影画像のURLを取得し、URLへアクセスして画像ファイルを保存することができます。
この記事では、Powershell スクリプト(.ps1)を利用した例を紹介します。
実行内容
本記事では、以下を実行するサンプルコードを公開しています。
- 現在時間(now)から24時間以内の撮影画像のURLを取得
- URLへアクセスしてJPEG画像を取得
- 取得したJPEG画像を日時のファイル名で指定のディレクトリへ保存
実行環境
- Windows11以上
- Windows Powershell 5.1 または Powershell 7 がインストールされている端末
サンプルコード
# PowerShell
# 現在の時間を取得
$now = Get-Date
# 時刻をUTCに変換
$nowUTC = $now.ToUniversalTime()
# 開始時間を設定(1日前)
$fromDate = $nowUTC.Date.AddDays(-1)
# 終了時間を設定(現在時刻)
$untilDate = $nowUTC.Date.AddDays(0)
# 日付を適切なフォーマットに変換 (ISO 8601形式)
$fromDatetime = $fromDate.ToString("yyyy-MM-ddTHH:mm:ssZ")
$untilDatetime = $untilDate.ToString("yyyy-MM-ddTHH:mm:ssZ")
# 利用するAPIのエンドポイントを指定
$urlApi = "https://lilz.io"
$urlPhotos = $urlApi + "/lilzgauge/api/photos/v2"
# トークンを指定
$authToken = "xxxxxxxxxx"
# パラメーターを指定
## APIの引数に必要なidの取得方法:https://support.lilz.jp/hc/ja/articles/8190547977241
$direction = "ascending" ## 降順の場合は descending を指定
$managementUnitId = "xxxxxxxxxx" ## 管理ユニットIDを指定
$pageSize = 50 ## 1~100の間で指定
# API Requestを実行
$headers = @{
"accept" = "application/json"
"Authentication-Token" = $authToken
}
$queryParams = @{
direction = $direction
management_unit_id = $managementUnitId
page_size = $pageSize
from_datetime = $fromDatetime
until_datetime = $untilDatetime
}
# クエリパラメータを文字列に変換
$queryString = ($queryParams.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join "&"
# 最終的なURIを作成
$uri = $urlPhotos + "?" + $queryString
# 出力してURIを確認
# Write-Output "Generated URI: $uri"
$response = Invoke-RestMethod -Uri $uri -Headers $headers -Method Get
# 最初のページのデータを格納
$allRecords= $response.records | Select-Object @{
Name = 'camera_id';
Expression = { $_.camera.id }
}, @{
Name = 'datetime';
Expression = {
## 日時:UTCで取得する場合
# $datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
# $utcDatetime = $datetime.ToUniversalTime() ## UTCに変換(Powershell 7.xでは、UTCはローカルタイムゾーンに変換されるのでUTCに戻す)
# $utcDatetime.ToString("yyyy-MM-dd_HHmmss") + "_utc" ## フォーマットを指定
## 日時:ローカルタイムゾーンに変換して取得する場合
$datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
$localDatetime = $datetime.ToLocalTime() ## ローカルタイムゾーンに変換(Windows Powershell 5.1では、UTCのままのため変換する)
$localDatetime.ToString("yyyy-MM-dd_HHmmss") + "_local" ## フォーマットを指定
}
}, url
# 次のページのURLを格納
$nextPage = $response.navigation.next_page
# 次のページが存在する限りループ
while ($nextPage) {
Write-Output "Fetching data from: $nextPage"
# 次のページのリクエスト
$nextUri = $urlApi + $nextPage
$nextResponse = Invoke-RestMethod -Uri $nextUri -Headers $headers -Method Get
# レスポンスデータを格納
$nextdata = $nextResponse.records | Select-Object @{
Name = 'camera_id';
Expression = { $_.camera.id }
}, @{
Name = 'datetime';
Expression = {
## 日時:UTCで取得する場合
# $datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
# $utcDatetime = $datetime.ToUniversalTime() ## UTCに変換(Powershell 7.xでは、UTCはローカルタイムゾーンに変換されるのでUTCに戻す)
# $utcDatetime.ToString("yyyy-MM-dd_HHmmss") + "_utc" ## フォーマットを指定
## 日時:ローカルタイムゾーンに変換して取得する場合
$datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
$localDatetime = $datetime.ToLocalTime() ## ローカルタイムゾーンに変換(Windows Powershell 5.1では、UTCのままのため変換する)
$localDatetime.ToString("yyyy-MM-dd_HHmmss") + "_local" ## フォーマットを指定
}
}, url
# 次のページのデータを $allRecords に追加
$allRecords += $nextdata
# 次のページのURLを更新
$nextPage = $nextResponse.navigation.next_page
}
# $allRecordsを確認
# Write-Output "Generated allData: " $allRecords | Format-Table -AutoSize
# 画像を保存するディレクトリのパスを指定
$outputDir = "xxxxxxxxxx" ## ex) "C:\Users\{username}\Downloads\lilz_photos"
# ディレクトリが存在しない場合は作成
if (-not (Test-Path $outputDir)) {
New-Item -ItemType Directory -Path $outputDir
}
# 画像URLのリストをループ処理
foreach ($record in $allRecords) {
# レコードからデータ取得
$cameraId = $record.camera_id
$imageUrl = $record.url
$datetime = $record.datetime ## 2024-10-10_123000
# cameraIdごとのディレクトリを作成
$cameraDir = Join-Path -Path $outputDir -ChildPath $cameraId
if (-not (Test-Path $cameraDir)) {
New-Item -ItemType Directory -Path $cameraDir
}
# ファイル名に指定
$fileName = "image_$datetime.jpg"
# 保存先のフルパスを作成
$outputFile = Join-Path -Path $cameraDir -ChildPath $fileName
# URLから画像をダウンロードして指定のディレクトリに保存
try {
Invoke-WebRequest -Uri $imageUrl -OutFile $outputFile
# Write-Output "Downloaded: $imageUrl to $outputFile"
} catch {
Write-Output "Failed to download: $imageUrl"
Write-Output "Error: $_"
}
}
# 処理完了のメッセージ
Write-Output "All images processed."
詳細
下記の3つの変数及びパラメーターはご利用アカウント及び実行環境によって適宜変更してください。
$authToken = "xxxxxxxxxx"
$managementUnitId = "xxxxxxxxxx"
$outputDir = "xxxxxxxxxx"
$pageSize で指定したレコード数に収まらない場合は、レスポンスデータの next_page から次のページのデータを取得します。
ここでは、最後のページまで繰り返し取得し、すべてのデータを結合しています。1ページに収まるレコード数であれば本コードの記述は不要です。
# 次のページのURLを格納
$nextPage = $response.navigation.next_page
# 次のページが存在する限りループ
while ($nextPage) {
Write-Output "Fetching data from: $nextPage"
# 次のページのリクエスト
$nextUri = $urlApi + $nextPage
$nextResponse = Invoke-RestMethod -Uri $nextUri -Headers $headers -Method Get
# レスポンスデータを格納
$nextdata = $nextResponse.records | Select-Object @{
Name = 'camera_id';
Expression = { $_.camera.id }
}, @{
Name = 'datetime';
Expression = {
## 日時:UTCで取得する場合
# $datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
# $utcDatetime = $datetime.ToUniversalTime() ## UTCに変換(Powershell 7.xでは、UTCはローカルタイムゾーンに変換されるのでUTCに戻す)
# $utcDatetime.ToString("yyyy-MM-dd_HHmmss") + "_utc" ## フォーマットを指定
## 日時:ローカルタイムゾーンに変換して取得する場合
$datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
$localDatetime = $datetime.ToLocalTime() ## ローカルタイムゾーンに変換(Windows Powershell 5.1では、UTCのままのため変換する)
$localDatetime.ToString("yyyy-MM-dd_HHmmss") + "_local" ## フォーマットを指定
}
}, url
# 次のページのデータを $allRecords に追加
$allRecords += $nextdata
# 次のページのURLを更新
$nextPage = $nextResponse.navigation.next_page
}
データ取得が完了したら指定のディレクトリに画像を保存します。
ここでは、さらに指定ディレクトリの配下に camera_id のディレクトリを作成し、画像を分類して保存するように処理しています。
また、保存する画像のファイル名は datetime から作成しています。APIのレスポンスはUTCであるため、JSTなどローカルタイムゾーンで保存したい場合は変換が必要になります。サンプルコードではローカルタイムゾーンに変換しているため、UTCのまま取得したい場合は本記事の最後に記載していますのでご参照ください。
# 画像を保存するディレクトリのパスを指定
$outputDir = "xxxxxxxxxx" ## ex) "C:\Users\{username}\Downloads\lilz_photos"
# ディレクトリが存在しない場合は作成
if (-not (Test-Path $outputDir)) {
New-Item -ItemType Directory -Path $outputDir
}
# 画像URLのリストをループ処理
foreach ($record in $allRecords) {
# レコードからデータ取得
$cameraId = $record.camera_id
$imageUrl = $record.url
$datetime = $record.datetime ## 2024-10-10_123000
# cameraIdごとのディレクトリを作成
$cameraDir = Join-Path -Path $outputDir -ChildPath $cameraId
if (-not (Test-Path $cameraDir)) {
New-Item -ItemType Directory -Path $cameraDir
}
# ファイル名に指定
$fileName = "image_$datetime.jpg"
# 保存先のフルパスを作成
$outputFile = Join-Path -Path $cameraDir -ChildPath $fileName
# URLから画像をダウンロードして指定のディレクトリに保存
try {
Invoke-WebRequest -Uri $imageUrl -OutFile $outputFile
# Write-Output "Downloaded: $imageUrl to $outputFile"
} catch {
Write-Output "Failed to download: $imageUrl"
Write-Output "Error: $_"
}
}
以上で撮影画像の取得~保存の処理まで完了しました。
実行手順はこちらを参考にしてください。
◆ファイル名の datetime をUTCで保存する場合
データ格納時とファイル名指定のソースコードを下記の内容に変更します(2か所)。
① 「日時:UTCで取得する場合」下部3行の「#」を外し、「日時:ローカルタイムゾーンに変換して取得する場合」の下部3行のコードをコメントアウトする
## 日時:UTCで取得する場合
$datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
$utcDatetime = $datetime.ToUniversalTime() ## UTCに変換(Powershell 7.xでは、UTCはローカルタイムゾーンに変換されるのでUTCに戻す)
$utcDatetime.ToString("yyyy-MM-dd_HHmmss") + "_utc" ## フォーマットを指定
## 日時:ローカルタイムゾーンに変換して取得する場合
# $datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
# $localDatetime = $datetime.ToLocalTime() ## ローカルタイムゾーンに変換(Windows Powershell 5.1では、UTCのままのため変換する)
# $localDatetime.ToString("yyyy-MM-dd_HHmmss") + "_local" ## フォーマットを指定
② 次ページのデータも同様
# レスポンスデータを格納
$nextdata = $nextResponse.records | Select-Object @{
Name = 'camera_id';
Expression = { $_.camera.id }
}, @{
Name = 'datetime';
Expression = {
## 日時:UTCで取得する場合
$datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
$utcDatetime = $datetime.ToUniversalTime() ## UTCに変換(Powershell 7.xでは、UTCはローカルタイムゾーンに変換されるのでUTCに戻す)
$utcDatetime.ToString("yyyy-MM-dd_HHmmss") + "_utc" ## フォーマットを指定
## 日時:ローカルタイムゾーンに変換して取得する場合
# $datetime = [datetimeoffset]::Parse($_.datetime) ## DateTimeOffset型に変換(Windows PowershellとPowershellの型合わせ)
# $localDatetime = $datetime.ToLocalTime() ## ローカルタイムゾーンに変換(Windows Powershell 5.1では、UTCのままのため変換する)
# $localDatetime.ToString("yyyy-MM-dd_HHmmss") + "_local" ## フォーマットを指定
}
}, url
ファイル名のフォーマットは適宜ご変更ください。