Pixabay API を使って検索文字列から画像を取得できるPowerShellスクリプト

コンピュータ

以前Pixabayから画像を検索するNode.jsのスクリプトを書きましたが、PowerShell版をつくって見ます。

事前準備

Pixabay API キーを取得

  1. Pixabay にログイン
  2. 以下のページから API キーを取得
    Pixabay API Documentation
    Documentation to Pixabay's API for searching and retrieving free images and videos.
  3. 取得した API キーを環境変数、またはコードに直接書きます(今回は環境変数例)。

環境変数の設定

取得したAPIキーを環境変数に設定

PowerShellのプロファイルにセット

code $profile

以下を追記

$env:PIXABAY_KEY = "取得したAPIキー"

ソースコード

<#
.SYNOPSIS
Pixabayを画像検索

.DESCRIPTION
PixabayのAPIを使ってキーワードによる画像検索を行いURIの一覧を取得する。

.EXAMPLE
PixabaySearch.ps1 -Query "キーワード" -PerPage 50 -ImageType "photo"

#>
param(
    [Parameter(Mandatory = $true, Position = 0)]
    [string]$Query,

    [int]$PerPage = 50,

    [string]$ImageType = "photo"   # photo / illustration / vector など
)

# API キー取得
$apiKey = $env:PIXABAY_KEY
if (-not $apiKey) {
    Write-Error "環境変数 PIXABAY_KEY が設定されていません。`n`$env:PIXABAY_KEY に API キーを設定してください。"
    exit 1
}

# クエリを URL エンコード
$encodedQuery = [System.Uri]::EscapeDataString($Query)

# API URL 作成
$url = "https://pixabay.com/api/?key=$apiKey&q=$encodedQuery&image_type=$ImageType&per_page=$PerPage"

try {
    # API 呼び出し
    $res = Invoke-RestMethod -Uri $url -Method Get
}
catch {
    Write-Error "Pixabay API の呼び出しに失敗しました: $_"
    exit 1
}

if (-not $res.hits -or $res.hits.Count -eq 0) {
    Write-Warning "ヒットがありませんでした。"
    exit 0
}

# largeImageURL を 1行ずつ出力(パイプライン前提)
foreach ($hit in $res.hits) {
    $hit.largeImageURL
}

実行

PixabaySearch.ps1 cat

https://pixabay.com/get/xxx1.jpg
https://pixabay.com/get/xxx2.jpg
https://pixabay.com/get/xxx3.jpg

URLだけが出力されるので、PowerShellのパイプラインでつなげて処理する。

最初の 1 件だけダウンロード

PixabaySearch.ps1 cat `
  | Select-Object -First 1 `
  | ForEach-Object { Invoke-WebRequest -Uri $_ -OutFile "cat.jpg" }

ダウンロードした画像

全件ダウンロード

PixabaySearch.ps1 sky `
  | ForEach-Object {
      $name = Split-Path $_ -Leaf
      Invoke-WebRequest -Uri $_ -OutFile $name
    }

ランダムに1件ダウンロード

PixabaySearch.ps1 cat `
  | Get-Random `
  | ForEach-Object {
      # タイムスタンプ生成(例: 20251203-203455)
      $timestamp = (Get-Date).ToString("yyyyMMdd-HHmmss")

      # ファイル名を設定
      $name = "$timestamp.jpg"

      Invoke-WebRequest -Uri $_ -OutFile $name
      Write-Host "Downloaded: $name"
    }

ダウンロードした画像

コメント