註:本文所述方法基於舊版 Facebook REST API(FQL),已於 2016 年停止支援。現代應用請使用 Graph API 搭配 Access Token 獲取粉絲數。本文保留原代碼供參考,並提供現代化實作方案。
<?php
$page_id = "YOUR_PAGE_ID";
$xml = @simplexml_load_file(
"https://api.facebook.com/restserver.php?method=facebook.fql.query" .
"&query=Select%20fan_count%20FROM%20page%20Where%20page_id=" . $page_id
) or die("API 請求失敗");
$fans = $xml->page->fan_count;
echo $fans;
?>
pages_read_engagement 權限)<?php
/**
* 獲取 Facebook 粉絲專頁粉絲數
*
* @param string $pageId 專頁 ID 或用戶名
* @param string $accessToken Page Access Token
* @return int|false 粉絲數或失敗回傳 false
*/
function getFacebookFanCount($pageId, $accessToken) {
$url = "https://graph.facebook.com/v18.0/{$pageId}";
$params = [
'fields' => 'fan_count',
'access_token' => $accessToken,
];
$ch = curl_init($url . '?' . http_build_query($params));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_USERAGENT => 'PHP-Facebook-FanCount/1.0',
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
error_log("Facebook API 錯誤: HTTP {$httpCode}, Response: {$response}");
return false;
}
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("JSON 解析失敗: " . json_last_error_msg());
return false;
}
if (isset($data['error'])) {
error_log("Facebook API 回傳錯誤: " . $data['error']['message']);
return false;
}
return $data['fan_count'] ?? false;
}
// 使用範例
$pageId = 'YOUR_PAGE_ID'; // 或專頁用戶名
$accessToken = 'YOUR_PAGE_ACCESS_TOKEN'; // 長期 Token
$fanCount = getFacebookFanCount($pageId, $accessToken);
if ($fanCount !== false) {
echo "粉絲數: " . number_format($fanCount);
} else {
echo "無法獲取粉絲數,請檢查日誌";
}
Facebook API 有呼叫頻率限制,建議快取結果:
function getCachedFanCount($pageId, $accessToken, $ttl = 3600) {
$cacheKey = "fb_fans_{$pageId}";
$cacheFile = sys_get_temp_dir() . "/{$cacheKey}.cache";
// 檢查快取
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $ttl)) {
return (int)file_get_contents($cacheFile);
}
$count = getFacebookFanCount($pageId, $accessToken);
if ($count !== false) {
file_put_contents($cacheFile, $count, LOCK_EX);
}
return $count ?? 0;
}
<!-- HTML -->
<div id="fb-fan-count">載入中...</div>
<script>
fetch('/api/get-fan-count.php?page_id=YOUR_PAGE_ID')
.then(res => res.json())
.then(data => {
if (data.success) {
document.getElementById('fb-fan-count').textContent =
data.count.toLocaleString() + ' 位粉絲';
}
});
</script>
| 錯誤 | 原因 | 解決 |
|---|---|---|
| Invalid OAuth access token | Token 過期或無效 | 重新生成長期 Token,建立自動刷新機制 |
| Permission error | 缺少 pages_read_engagement 權限 | 在 App 審核中申請權限,或使用 Graph API Explorer 手動授權 |
| Page not found | Page ID 錯誤或專頁已刪除 | 確認 Page ID(可用 /me/accounts 列出管理的專頁) |
| Rate limited | 呼叫頻率過高 | 實作快取、指數退避重試 |
Facebook API 版本迭代快速,開發者應持續關注 官方更新日誌。建立健全的錯誤處理、快取與監控機制,才能確保粉絲數顯示功能長期穩定運作。