為了解決部落格留言區「千人一面」的預設頭像問題,利用 QQ 號碼調用騰訊官方頭像 API 是成本最低、覆蓋率最高的方案(全民級應用)。本文詳細對比兩種主流實現方式,助你根據業務場景選擇最優策略。
騰訊提供的公開頭像介面:
https://q1.qlogo.cn/g?b=qq&nk={QQ號}&s={尺寸}&t={時間戳}
b=qq:業務類型固定為 qqnk:目標 QQ 號s:尺寸代碼(40/100/140/640 等,100 為常用中等頭像)t:時間戳防緩存,確保獲取最新頭像<img> 標籤直接引用)<?php
$qq = '123456789';
$size = 100;
echo '<img src="https://q1.qlogo.cn/g?b=qq&nk=' . $qq . '&s=' . $size . '&t=' . time() . '" alt="QQ頭像">';
?>
| 優點 | 缺點 |
|---|---|
|
|
適用場景:低併發、容忍延遲、需保留動圖的個人部落格/論壇。
<?php
$qq = '552452006';
$src = 'https://q1.qlogo.cn/g?b=qq&nk=' . $qq . '&s=100&t=' . time();
// 設置輸出頭
header('Content-Type: image/png'); // 統一輸出 PNG,簡化前端處理
// 獲取遠程圖片二進制內容
$imageData = file_get_contents($src);
if ($imageData === false) {
// 降級處理:輸出預設頭像或 404
exit;
}
// 可選:用 GD 處理(縮放、裁剪、加水印等)
$im = imagecreatefromstring($imageData);
if ($im !== false) {
imagepng($im);
imagedestroy($im);
} else {
// 非合法圖片數據,直接輸出原始內容
echo $imageData;
}
?>
| 優點 | 缺點 |
|---|---|
|
|
適用場景:高併發系統、需統一頭像風格、HTTPS 站點、願意換取可控性犧牲動圖。
<?php
function getQQAvatar($qq, $size = 100) {
$cacheDir = __DIR__ . '/cache/avatar/';
$cacheFile = $cacheDir . "qq_{$qq}_{$size}.png";
$cacheTime = 86400 * 7; // 7 天
// 1. 命中緩存直接返回
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
header('Content-Type: image/png');
readfile($cacheFile);
return;
}
// 2. 遠程獲取
$url = "https://q1.qlogo.cn/g?b=qq&nk={$qq}&s={$size}&t=" . time();
$data = @file_get_contents($url);
if ($data === false) {
// 3. 失敗降級:輸出預設頭像
readfile(__DIR__ . '/assets/default_avatar.png');
return;
}
// 4. 檢測是否為 GIF 動圖 (簡易判斷頭部)
$isGif = (substr($data, 0, 6) === 'GIF87a' || substr($data, 0, 6) === 'GIF89a');
// 5. 保存緩存 (動圖存原始數據,靜態圖可選 GD 處理後存)
if (!is_dir($cacheDir)) mkdir($cacheDir, 0755, true);
file_put_contents($cacheFile, $data);
// 6. 輸出
header('Content-Type: ' . ($isGif ? 'image/gif' : 'image/png'));
echo $data;
}
?>
此方案:首次請求代理獲取並緩存原始二進制(保留動圖),後續請求直接讀本地檔案極速返回,完美平衡效能、動圖支援與可控性。
根據專案實際情況靈活選擇,頭像服務雖小,體驗影響卻大。