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

コンピュータ

Pixabay(ピクサベイ)は、写真・イラスト・動画を無料で利用できる素材サイトです。すべての画像は商用利用可能で、クレジット表記も不要という扱いやすさが特徴です。また公式 API が公開されており、キーワード検索で画像情報を取得できるため、スクリプトやアプリから手軽に利用できます。今回は、文字検索で画像をリンクを取得するスクリプトを作成します。

事前準備

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キー"

node-fetch をインストール

npm init -y
npm install node-fetch@3

ソースコード

#!/usr/bin/env node

const fetch = (...args) =>
  import('node-fetch').then(({default: fetch}) => fetch(...args));

const API_KEY = process.env.PIXABAY_KEY;
if (!API_KEY) {
  console.error("環境変数 PIXABAY_KEY が設定されていません。");
  process.exit(1);
}

const query = process.argv[2];
if (!query) {
  console.error("Usage: pixabay_search <keyword>");
  process.exit(1);
}

const url = `https://pixabay.com/api/?key=${API_KEY}&q=${encodeURIComponent(query)}&image_type=photo&per_page=50`;

const main = async () => {
  const res = await fetch(url);
  const json = await res.json();

  json.hits.forEach(hit => {
    console.log(hit.largeImageURL);
  });
};

main();

実行

node pixabay_search.js cat

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

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

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

node pixabay_search.js cat | Select-Object -First 1 | % { Invoke-WebRequest -Uri $_ -OutFile cat.jpg }

ダウンロードした画像

全件ダウンロード

node pixabay_search.js sky | % { $name = Split-Path $_ -Leaf; Invoke-WebRequest -Uri $_ -OutFile $name }

感想

Node.jsでコンソールアプリの組み合わせは、ミスマッチな感じもしますが、WebAPIを叩くことに向いているのでは無いかと思い作成してみました。

TypeScriptで作ろうかとも思ったのですが、プログラムの規模が非常に小さいので素のJavaScriptにしてあります。

APIキーをセットして、WebAPIを叩くプログラムはよくあるので、他のWebAPIにも流用出来るのでは無いかと思います。
コンソールアプリにした理由は、PowerShellのパイプラインなどで、他のプログラムと連動させることが出来き柔軟な操作につなげられるので、個人的な好みによるものです。

また、Pixabayから取得した画像のクオリティが高くて驚きました。無料材系のサイトだと玉石混交のイメージがありますが、その認識を改める必要があるようです。

コメント