利用第三方快照服務 ppt.cc(已停止服務,僅作教學示範),POST 提交目標網址,取回圖片儲存路徑,再下載儲存本地。
/**
* 生成網頁快照
* @param string $site 目標網址
* @param string $savePath 本地儲存路徑,空則只回傳圖片 URL
* @param int $delay 延遲秒數等待頁面載入
* @return mixed 圖片 URL 或儲存位元組數
*/
function snapshot($site, $savePath = '', $delay = 0) {
$apiUrl = 'https://ppt.cc/yo2/catch.php';
$query = 'url=' . urlencode($site) . '&delay=' . $delay . '&rnd=' . mt_rand(1, 9);
$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $query,
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'] ?? 'PHP Bot',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$data = curl_exec($ch);
curl_close($ch);
if (strlen($data) !== 32) {
throw new Exception('無效回應: ' . $data);
}
// 回傳 32 字元 hash,構造圖片 URL
$path = $data[0] . '/' . $data[1] . '/' . $data[2] . '/';
$imageUrl = 'https://cache.ppt.cc/' . $path . 'src_' . $data . '.png';
if ($savePath !== '') {
$imgData = file_get_contents($imageUrl);
if ($imgData === false) throw new Exception('圖片下載失敗');
return file_put_contents($savePath, $imgData);
}
return $imageUrl;
}
// 只取得圖片 URL
echo snapshot('https://www.baidu.com');
// 下載儲存本地
$saved = snapshot('https://www.baidu.com', './baidu.png');
echo "已儲存 $saved 位元組";
| 方案 | 特點 | 適用場景 |
|---|---|---|
| Puppeteer / Playwright (Node.js) | 無頭瀏覽器,完整 JS 渲染、截圖、PDF | 需精確截圖、SPA、動態內容 |
| Chrome DevTools Protocol (PHP: chrome-php/chrome) | 直接控制 Chrome,無 Node 依賴 | PHP 專案不想引入 Node |
| wkhtmltoimage / wkhtmltopdf | Qt WebKit 渲染,命令列工具 | 靜態頁、報表、PDF 生成 |
| 雲端 API:Screenshotlayer, ApiFlash, Urlbox | 付費、高可用、CDN 分發 | 生產環境、大量需求 |
| GitHub Actions / CI 定時生成 | 自動化、版本控制 | 文檔、報表定期更新 |
robots.txt 與網站服務條款,避免濫用。