Skip to main content

Remotely Download Google AJAX Libraries Using PHP and curl.

<?php

// Modified a bit from: http://davidwalsh.name/download-google-ajax-libraries

error_reporting(E_ALL);

if (! function_exists('curl_init'))
    die('Curl extension is required.');

/**
 * Get the HTTP reponse code from the request.
 *
 * @param unknown $url
 * @return Ambigous <>
 */
function getHttpResponseCode ($url)
{
    $ch = @curl_init($url);

    @curl_setopt($ch, CURLOPT_HEADER, TRUE);
    @curl_setopt($ch, CURLOPT_NOBODY, TRUE);
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $status = array();
    $response = @curl_exec($ch);

    @curl_close($ch);
    preg_match('/HTTP\/.* ([0-9]+) .*/', $response, $status);

    return $status[1];
}

/**
 * Fetch the content of a remote resource.
 *
 * @param string $url
 * @return mixed NULL
 */
function fetchContent ($url)
{
    $responseCode = getHttpResponseCode($url);

    if (getHttpResponseCode($url) != 200) {
        return null;
    }

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // follow redirects?
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

    $response = curl_exec($ch);

    curl_close($ch);

    return $response;
}

/*
 * Usage
 */

// settings
$contentUrl = 'https://developers.google.com/speed/libraries/devguide';
$saveDir = 'js-libs/';

// fetch the web page
$content = fetchContent($contentUrl);

if (is_null($content))
    die("Failed to fetch: $contentUrl");

    // regex js cdn links
$regex = '/\/\/ajax.googleapis.com\/ajax\/libs\/.*.js/isU';

// match?
preg_match_all($regex, $content, $matches);

// make sure there are no repeated files
$js_files = array_unique($matches[0]);

// download every file and save locally
foreach ($js_files as $file) {

    $resourceUrl = 'http:' . $file;

    // download
    $content = fetchContent($resourceUrl);

    if (! is_null($content)) {
        $path = parse_url($resourceUrl, PHP_URL_PATH);
        $pathFragments = explode('/', $path);
        $filename = end($pathFragments);

        file_put_contents($saveDir . $filename, $content);
        echo "$filename saved." . "\n";
    }
}

?>