PHPで API FLASHを使って指定サイトのスナップショットを取得する

(1/1)
PHPで API FLASHを使って指定サイトのスナップショットを取得する
ぱふぅ家のホームページでは、毎日定時に、週間天気予報や、台風が接近しているときに台風の進路画像Blueskyに投稿している。
これらはサーバの cronジョブで実現しているのだが、Webページに表示される最新の情報を画像データとして取得するのに、クラウドサービス「API FLASH」を利用している。そこで今回は、PHPで API FLASH を用いて、指定サイトのスナップショット画像を取得するプログラムを紹介する。

なお、今回紹介するプログラムは、上述のようにバッチ処理で動くことを前提としているので UIはない。すべてURLパラメータで指定し、結果は画面に表示するかサーバに保存するかのどちらかになる。

目次

サンプル・プログラムのダウンロード

圧縮ファイルの内容
getWebPage.phpサンプル・プログラム
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getWebPage.php 更新履歴
バージョン 更新日 内容
1.0.0 2025/09/27 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:各種定数など

getWebPage.php

  61: // 各種定数(START) ===========================================================
  62: 
  63: // アクセス・キーー
  64: if (isset($_ENV['PAHOO_APIFLASH_ACCESSKEY'])) {
  65:     define('ACCESS_KEY', $_ENV['PAHOO_APIFLASH_ACCESSKEY']);
  66: else {
  67:     define('ACCESS_KEY', '');
  68: }
  69: 
  70: // 画像サイズで指定できる最小値(単位:ピクセル)
  71: define('MIN_SIZE',  0);
  72: // 画像サイズで指定できる最大値(単位:ピクセル)
  73: define('MAX_SIZE',  9999);
  74: 
  75: // デフォルトで取得するページサイズ(単位:ピクセル)
  76: define('DEF_PAGE_WIDTH',  640);
  77: define('DEF_PAGE_HEIGHT', 730);
  78: 
  79: // デフォルトの切り取りサイズ
  80: define('DEF_CROP_LEFT',     0);     // 左端から切り取る長さ
  81: define('DEF_CROP_TOP',      0);     // 上端から切り取る長さ
  82: define('DEF_CROP_WIDTH',  640);     // 切り取る幅
  83: define('DEF_CROP_HEIGHT', 730);     // 切り取る高さ
  84: 
  85: // デフォルトの保存画像フォーマット jpeg|png|webp
  86: define('DEF_IMAGE_FORMAT', 'webp');
  87: 
  88: // デフォルトの画像品質 0~100
  89: define('DEF_IMAGE_QUALITY', 70);
  90: 
  91: // 各種定数(END) ===============================================================

各種パラメータは定数を defineしている。とくに記載のないものは、適宜変更してかまわない。

API FLASH を利用するにはアクセス・キーが必要である。取得方法は、「API FLASE - 各種クラウド連携サービス(WebAPI)の登録方法」を参照してほしい。取得したアクセス・キーは、.pahooEnvファイルに記入するか、本プログラムの定数に代入すること。

API FLASH

API FLASH」は、入力パラメータは GET 渡しで、出力結果(OUT)は画像データ(バイナリ)という REST API である。直近1ヶ月の作成画像データが100枚以内であれば無料で利用できる。
リクエストURL
URL
https://api.apiflash.com/v1/urltoimage

入力パラメータ
フィールド名 要否 内  容
access_key 必須 アクセス・キー
url 必須 ターゲットURL(スナップショットを撮りたいサイトのURL)
response_type 任意 出力データ形式。image(省略時) | json
format 任意 出力画像フォーマット。jpeg(省略時) | png | webp
quality 任意 出力画像品質。jpeg, webpの時に有効。1~100。省略時80
width 任意 ターゲットURLの幅(ピクセル)。省略時1920
height 任意 ターゲットURLの高さ(ピクセル)。省略時1080
crop 任意 切り取るサイズ(crop)。左端からの長さ,上端からの長さ,幅,高さ の4つのピクセル値を指定する。
これ以外にも様々なパラメータを指定できる。詳しくは、Documentation をご覧いただきたい。

解説:API FLASHのリクエストURLを生成

getWebPage.php

 121: /**
 122:  * API FLASHのリクエストURLを生成する
 123:  * @param   string $targetURL    ターゲットURL
 124:  * @param   string $imageFormat  画像フォーマット
 125:  * @param   int    $imageQuality 画像品質
 126:  * @param   int    $pageWidth    取得画像の幅
 127:  * @param   int    $pageHeight   取得画像の高さ
 128:  * @param   int    $cropLeft     左端から切り取る長さ
 129:  * @param   int    $cropTop      上端から切り取る長さ
 130:  * @param   int    $cropWidth    切り取りたい幅
 131:  * @param   int    $cropHeight   切り取りたい高さ
 132:  * @return  string URL
 133: */
 134: function getApiFlashURL($targetURL, $imageFormat, $imageQuality, $pageWidth, $pageHeight, $cropLeft, $cropTop, $cropWidth, $cropHeight) {
 135:     return 'https://api.apiflash.com/v1/urltoimage?access_key=' . ACCESS_KEY . '&url=' . urlencode($targetURL. '&format=' . $imageFormat . '&quality=' . $imageQuality . '&width=' . $pageWidth . '&height=' . $pageHeight . '&crop=' . $cropLeft . ',' . $cropTop . ',' . $cropWidth . ',' . $cropHeight . '&response_type=image';
 136: }

ユーザー定義関数 getApiFlashURL は、上述の使用に従い、API FLASHA のリクエストURLを生成する。

解説:メイン・プログラム

getWebPage.php

 138: // メイン・プログラム ======================================================
 139: 
 140: // パラメータ
 141: $errmsg = '';
 142: // ターゲットURL
 143: $url = getParam('url', FALSE, '');
 144: if ($url == '') {
 145:     echo 'error > Please specify the target URL.';
 146:     exit(1);
 147: }
 148: validURL($url, $errmsg);
 149: if ($errmsg !== '') {
 150:     echo 'error > The target URL has been specified incorrectly.';
 151:     exit(1);
 152: }
 153: // サーバに保存するファイル名(フルパス);空文字の時は画面表示
 154: $filename = getParam('filename', FALSE, '');
 155: // 保存画像フォーマット
 156: $imageFormat = getValidString('format', $errmsg, DEF_IMAGE_FORMAT, 1, 10, TRUE, ['/(jpeg|png|webp)/ui']);
 157: if ($errmsg !== '') {
 158:     echo 'error > The specified image format for saving is incorrect.';
 159:     exit(1);
 160: }
 161: // 画像品質
 162: $imageQuality = getValidNumber('quality', $errmsg, DEF_IMAGE_QUALITY, TRUE, 0, 100);
 163: if ($errmsg !== '') {
 164:     echo 'error > The image quality specification is incorrect.';
 165:     exit(1);
 166: }
 167: // 取得ページの幅
 168: $pageWidth = getValidNumber('pageWidth', $errmsg, DEF_PAGE_WIDTH, TRUE, MIN_SIZE, MAX_SIZE);
 169: if ($errmsg !== '') {
 170:     echo 'error > The specified width for the acquired image is incorrect.';
 171:     exit(1);
 172: }
 173: // 取得ページの高さ
 174: $pageHeight = getValidNumber('pageHeigh', $errmsg, DEF_PAGE_HEIGHT, TRUE, MIN_SIZE, MAX_SIZE);
 175: if ($errmsg !== '') {
 176:     echo 'error > The specified height for the acquired image is incorrect.';
 177:     exit(1);
 178: }
 179: // 左端から切り取る長さ
 180: $cropLeft = getValidNumber('cropLeft', $errmsg, DEF_CROP_LEFT, TRUE, MIN_SIZE, MAX_SIZE);
 181: if ($errmsg !== '') {
 182:     echo 'error > The crop left specification is incorrect.';
 183:     exit(1);
 184: }
 185: // 上端から切り取る長さ
 186: $cropTop = getValidNumber('cropTop', $errmsg, DEF_CROP_TOP, TRUE, MIN_SIZE, MAX_SIZE);
 187: if ($errmsg !== '') {
 188:     echo 'error > The crop top specification is incorrect.';
 189:     exit(1);
 190: }
 191: // 切り取る幅
 192: $cropWidth = getValidNumber('cropWidth', $errmsg, DEF_CROP_WIDTH, TRUE, MIN_SIZE, MAX_SIZE);
 193: if ($errmsg !== '') {
 194:     echo 'error > The crop width specification is incorrect.';
 195:     exit(1);
 196: }
 197: // 切り取る高さ
 198: $cropHeight = getValidNumber('cropHeight', $errmsg, DEF_CROP_HEIGHT, TRUE, MIN_SIZE, MAX_SIZE);
 199: if ($errmsg !== '') {
 200:     echo 'error > The crop height specification is incorrect.';
 201:     exit(1);
 202: }
 203: 
 204: // Api FlashのリクエストURLを取得する.
 205: $requestURL = getApiFlashURL($url, $imageFormat, $imageQuality, $pageWidth, $pageHeight, $cropLeft, $cropTop, $cropWidth, $cropHeight);
 206: 
 207: // 画像データを取得する.
 208: $image = file_get_contents($requestURL);
 209: 
 210: // エラー発生
 211: if ($image === FALSE) {
 212:     echo 'error > cannot get image !';
 213: 
 214: // 画面に表示する
 215: else if ($filename === '') {
 216:     $basename = pathinfo($filename, PATHINFO_FILENAME);
 217:     header('Content-Type: image/' . IMAGE_FORMAT);
 218:     header('Content-Disposition: inline; filename="' . $basename . '.' . $imageFormat . '"');
 219:     echo $image;
 220: 
 221: // サーバに保存する
 222: else {
 223:     $res = file_put_contents($filename, $image);
 224:     if ($res === FALSE) {
 225:         echo $filename . ' -- save failure!';
 226:     } else {
 227:         echo $filename . ' -- save successed';
 228:     }
 229: }
 230: 
 231: /*

メイン・プログラムは、まず、コマンドラインから各種パラメータを取得する。
次に、getApiFlashURL 関数を使ってリクエストURLを取得し、 file_get_contents 関数を使って画像を取得する。
コマンドラインに出力ファイル名が指定されていないときは、画面に表示する。
そうでないときは、サーバに保存する。

参考サイト

(この項おわり)
header