站內搜尋

Tuesday, June 11, 2019

[PHP] Cross Domain Ajax 跨網域抓取資料(file_get_contents) (手動加上Referer教學)

使用 JS 要跨網域抓資料,因為有同源政策的限制,所以必需使用 JSONP 或 CORS 兩種方式,可以參考下面的文章:

[JavaScript][好文] Cross Domain Ajax 跨網域抓取資料(JSONP) - Javascript篇

[jQuery][好文] Cross Domain Ajax 跨網域抓取資料(JSONP) - jQuery篇

[jQuery] Cross Domain Ajax 跨網域抓取資料(CORS)

但使用 PHP 就沒有這樣的限制了,直接用 file_get_contents 就可以抓到其它網站或API的資料,但如果 API 端有限制 Referer 來源 (例如: $_SERVER['HTTP_REFERER'] 必需是允許的網址),那就無法取得資料。

不過,我們可以透過 stream_context_create 手動幫 file_get_contents 的 header 加上 Referer 來突破這個限制 (不要拿來做壞事喔),作法很簡單...



$content = http_build_query(
    array(
        'id' => 'A001',
        'name' => 'Sean'
    ) 
);
$opts = array(
    'http' => array(
        'method' => 'POST',
        'header' => "Referer: http://aaa.bbb.ccc",
        'content' => $content
    ) 
);
$context = stream_context_create($opts);
echo $f = file_get_contents('http://aaa.bbb.ccc/api.php', false, $context);

說明:
假設 aaa.bbb.ccc/api.php 有限制 Referer 只能是來自 bbb.ccc 網域才能取資料,例如:
$referer = $_SERVER['HTTP_REFERER'];
$host = parse_url($referer, PHP_URL_HOST);
if (implode('.', array_slice(explode('.', $host), -2)) != 'bbb.ccc') {
    exit;
}
所以我們在 header 加上 Referer 就可以突破這個限制。


No comments:

Post a Comment