整合 QQ 登入或顯示 QQ 頭像時,需從騰訊伺服器獲取頭像。本文介紹兩種 PHP 實作方式並對比優缺點。
<?php $qq = '12345678'; echo '<img src="https://q1.qlogo.cn/g?b=qq&nk=' . $qq . '&s=100&t=' . time() . '">'; ?>
參數說明:b=qq 業務類型、nk QQ 號、s=100 尺寸(40/100/140/640)、t 時間戳防快取。
<?php
$qq = '12345678';
$src = 'https://q1.qlogo.cn/g?b=qq&nk=' . $qq . '&s=100&t=' . time();
header('Content-Type: image/png');
$img = imagecreatefromstring(file_get_contents($src));
imagepng($img);
imagedestroy($img);
?>
| 維度 | 方法一直連 | 方法二代理 |
|---|---|---|
| 動態圖支援 | ✅ 完整支援 GIF 動圖 | ❌ 僅輸出靜態幀(imagepng 限制) |
| 載入速度 | 較慢(瀏覽器直接連騰訊,受跨域/防盜鏈影響) | 較快(伺服器內網/CDN 回源,可本地快取) |
| 隱私保護 | 暴露 QQ 號於前端 HTML | 隱藏 QQ 號,前端只見代理路徑 |
| 伺服器負擔 | 無 | 佔用頻寬、CPU、記憶體 |
| 失效處理 | 瀏覽器顯示破圖 | 可預設預設頭像、錯誤重試 |
$cacheFile = "cache/avatar_{$qq}.png";
if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 86400) {
readfile($cacheFile);
exit;
}
// 遠端獲取並儲存
$img = imagecreatefromstring(file_get_contents($src));
imagepng($img, $cacheFile);
imagepng($img);
imagedestroy($img);