目次
サンプル・プログラムのダウンロード
| getWebPage.php | サンプル・プログラム |
| .pahooEnv | クラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。 使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.0.0 | 2025/09/27 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順
これで準備は完了だ。
準備:pahooInputData 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .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) ===============================================================
API FLASH を利用するにはアクセス・キーが必要である。取得方法は、「API FLASE - 各種クラウド連携サービス(WebAPI)の登録方法」を参照してほしい。取得したアクセス・キーは、.pahooEnvファイルに記入するか、本プログラムの定数に代入すること。
API FLASH
| 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つのピクセル値を指定する。 |
解説: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: }
解説:メイン・プログラム
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 関数を使って画像を取得する。
コマンドラインに出力ファイル名が指定されていないときは、画面に表示する。
そうでないときは、サーバに保存する。

これらはサーバの cronジョブで実現しているのだが、Webページに表示される最新の情報を画像データとして取得するのに、クラウドサービス「API FLASH」を利用している。そこで今回は、PHPで API FLASH を用いて、指定サイトのスナップショット画像を取得するプログラムを紹介する。
なお、今回紹介するプログラムは、上述のようにバッチ処理で動くことを前提としているので UIはない。すべてURLパラメータで指定し、結果は画面に表示するかサーバに保存するかのどちらかになる。