PHP и curl с API для Google Analytics
апреля 24, 2009 в 15:11 | Компьютеры |Многие вебмастера уже давно используют на своих сайтах Google Analytics для сбора веб-статистики по своим сайтам. Этот инструмент имеет много возможностей по анализу полученных данных и представления в различных форматах, кроме того, он интегрирован со службами Adsnese и Adwords от того же Google. Многие уже по достоинству оценили широкие возможности и удобство этого “счетчика”.

Одним из его недостатков до недавнего времени было отстутствие программного интерфейса для доступа к данным. Например, отслеживать несколько десятков сайтов было не очень приятным занятием, тем более, что не очень хочется “палить” их родство гуглу. Сбор кейвордов тоже был не самой приятной операцией, даже с использованием возможностей экспорта в различных форматов. Поэтому приходилось изловчаться, писать мутные приложения, роботы-парсеры, настраивать регулярную пересылку экспортированных данных на е-мейл с последующим парсингом и проводить другие операции, которые могли бы выполняться самым простейшим API. Справедливости ради, стоит отметить, что похожие продукты, например, Statcounter тоже не имеют программного интерфейса.
Во вторник, 21 апреля, Гугл объявил об октрытии API для Google Analytics. Теперь все необходимые данные можно получать автоматически, в удобной для обработки форме и без лишних телодвижений. Естественно, что сразу появилось желание поближе “потрогать” это нововведение. Особенно на примере двух приведенных выше задач - сбор статистики визитов и сбор ключевых слов из Google Analytics.
В результате у меня получился простенький скрипт на php с использованием библиотеки curl. Код получился корявый, но для исследования вполне пригоден, тем более, что вполне справляется с возложенными заадачами уже сейчас. Итак, есть аккаунт Google Analytics, настроенные профили, доступ и прочее. Другими словами, если зайти в Google Analytics, то должно быть видно все то, что мы хотим получить через API. На компьютере также есть установленный php с включенным curl’ом. Запускаться скрипт будет в консоли и результаты выводить на экран.
// Google Analytics API test script.
// Visit http://ponomaryov.org.ua/
// Parsing functions.
function parse_array($string, $beg_tag, $close_tag)
{
preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);
return $matching_data[0];
}
function return_between($str, $beg, $close)
{
$start = strpos($str, $beg);
$len = strlen($beg);
$end = strpos($str, $close, $start);
return substr($str, $start + $len, $end - $start - $len);
}Syhi-подсветка кода
PHP code #1 - Пара полезных функций для парсинга, которые пригодятся нам позже.
$email = "vasiliy@gmail.com";
$pass = "jamegakrut";
$sitename = "moysait";Syhi-подсветка кода
PHP code #2 - Почтовый адрес и пароль для доступа к аккаунту. Имя сайта, для которого будет выведена статистика ключевых слов.
Здесь собраны настройки скрипта. Прежде всего это данные для авторизации пользователя в сервисах Google - то, что нужно вводить при входе в Google Analytics с помощью броузера. Поскольку наш скрипт будет работать на домашней машине, то такой подход нас вполне устраивает. Если же планируется создание веб-приложения, которое будет использовать данные GA, то, возможно, лучше будет воспользоваться другими способами авторизации, предлагаемые Google, которые лишены необходимости сохранять пароль и почтовый адрес. Подробнее можно ознакомиться в документации
Далее указано имя профиля сайта для которого нужно будет привести статистику по ключевым словам. Данный скрипт работает следующим образом - собирает данные по посетителям всех сайтов пользователя GA за последнюю неделю, а также все ключевые слова за последнюю неделю с количеством переходов для одного из сайтов, а именно того, который указан в переменной $sitename. Имя должно быть таким, как оно указано в GA.
$auth_page = "https://www.google.com/accounts/ClientLogin";
$data["accountType"] = "GOOGLE";
$data["Email"] = $email;
$data["Passwd"] = $pass;
$data["service"] = "analytics";
$data["source"] = "JustAlexTest";
foreach ($data as $key => $value)
{
if(strlen(trim($value))>0)
$temp_string[] = $key . "=" . urlencode($value);
else
$temp_string[] = $key;
}
$query_string = join(‘&’, $temp_string);
$s = curl_init();
curl_setopt($s, CURLOPT_URL, $auth_page);
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($s, CURLOPT_USERAGENT, "JustAlex");
curl_setopt($s, CURLOPT_POST, TRUE);
curl_setopt($s, CURLOPT_POSTFIELDS, $query_string);
$respond = curl_exec($s);
$info = curl_getinfo($s);
$return_code = $info["http_code"];
if($return_code != "200")
{
echo "Authentification failed! Server returns ";
echo $return_code." code\n";
exit;
}
$token = trim(return_between($respond, "Auth=", "\n"));Syhi-подсветка кода
PHP code #3 - Шаг 1. Аутентификация пользователя Google.
Формируем данные для POST-запроса по указанному авторами адресу. Устанавливаем простейший сеанс curl, который смог бы работать по https и отправляем данные. В случае успешного результата нам будем выслан ответ из которого мы сможем выделить токен, ключ с помощью которого будет получать доступ к дальнейшим данным. Если же введенный почтовый адрес и пароль были неверными, то сервер вернет код ошибки 200.
$account_url = "https://www.google.com/analytics/feeds/accounts/default";
curl_setopt($s, CURLOPT_URL, $account_url);
curl_setopt($s, CURLOPT_POST, FALSE);
$header[] = "Authorization: GoogleLogin auth=".$token;
curl_setopt($s, CURLOPT_HTTPHEADER, $header);
$respond = curl_exec($s);Syhi-подсветка кода
PHP code #4 - Шаг 2. Получение профилей всех сайтов пользователя.
Имея на руках полученный токен и указав его в заголовке запроса можно получить список всех сайтов пользователя. Ответ возращается в виде xml-документа. К сожалению, без дополнительных финтов ушами такой документ не удастся распарсить с помощью SimpleXML, поскольку в его состав входят элементы, имеющие в своем имени знак двоеточия. Поэтому ответ сервера будем парсить без специальных парсеров
Вот тут-то нам и пригодятся функции из начала скрипта.
$week_ago = $today - 7 * 24 * 3600;
$start_date = date(‘Y-m-d’, $week_ago);
$end_date = date(‘Y-m-d’, $today);Syhi-подсветка кода
PHP code #5 - Вспомогательные расчеты.
Рассчитываем сегодняшнюю дату и день неделю назад.
foreach($entries as $entry)
{
$name = return_between($entry, "<title type=’text’>", "</title>");
$id = return_between($entry, "<dxp:tableId>", "</dxp:tableId>");
if(strpos($name, $sitename) !== FALSE)
{
$keysite = array($name, $id);
}
// Get daily stats.
echo "Daily stats for ".$name."\n";
echo "=======================================\n";
$getvisitorsurl = "https://www.google.com/analytics/feeds/data?ids=";
$getvisitorsurl .= $id."&dimensions=ga:date&metrics=ga:visitors&";
$getvisitorsurl .= "sort=ga:date&start-date=".$start_date;
$getvisitorsurl .= "&end-date=".$end_date;
curl_setopt($s, CURLOPT_URL, $getvisitorsurl);
$respond = curl_exec($s);
$date_entries = parse_array($respond, "<entry>", "</entry>");
foreach($date_entries as $dentry)
{
$date = return_between($dentry, "name=’ga:date’ value=’", "’/>");
$visits = return_between($dentry,
"name=’ga:visitors’ type=’integer’ value=’", "’/>");
echo "Date ".$date." - visits ".$visits."\n";
}
echo "=======================================\n\n";
}Syhi-подсветка кода
PHP code #6. Шаг 3. - Получение аналитических данных по профилям сайтов.
Итак с помощью функций парсим в ответе сервера данные о профилях сайтов пользователя. Для каждого профиля находим имя и идентификатор. Если имя совпадает с именем сайта, для которого мы еще хотим собрать дополнительную статистику по ключевым словами, то запоминаем этот профиль для дальнейшего использования.
Имея токен авторизации, полученный раннее и идентификатор профиля можно легко запросить требуемую информацию по данному сайту. Для этого нужно лишь создать необходимый запрос и разобраться полученный xml-ответ. Если с разбором ответа сложностей возникнуть уже не должно, то с формированием запроса их можно ожидать. Для запроса к данным Google использует не совсем очевидную систему измерений и метрик. В данном случае dimensions=ga:date&metrics=ga:visitors&sort=ga:date означает вывод количества поситетелей разбитого и отсортированного по дням. Также нужно указать начальную и конечную дату.
Отправляем полученный запрос и знакомой методикой разбираем ответ сервера. Полученные результаты выводятся на экран.
if(isset($keysite))
{
echo "Get keywords for ".$keysite[0]."\n";
echo "=======================================\n\n";
$profileid = $keysite[1];
$getkeyurl = "https://www.google.com/analytics/feeds/data?ids=";
$getkeyurl .= $profileid."&dimensions=ga:keyword&metrics=ga:entrances";
$getkeyurl .= "&sort=ga:keyword&start-date=".$start_date;
$getkeyurl .= "&end-date=".$end_date;
curl_setopt($s, CURLOPT_URL, $getkeyurl);
$respond = curl_exec($s);
$keywords = parse_array($respond, "<entry>", "</entry>");
foreach($keywords as $keyword)
{
$key = return_between($keyword, "type=’text’>ga:keyword=", "</title>");
$entraces = return_between($keyword,
"name=’ga:entrances’ type=’integer’ value=’", "’/>");
echo "Keyword: ".$key." entraces: ".$entraces."\n";
}
}
else
{
echo "Given profile not found!\n";
}
?>Syhi-подсветка кода
PHP code #7. - Собираем статистику по ключевым словам.
Аналогично, формируем запрос к одному из сайтов для получения списка ключевых слов за последнюю неделю. В данном случае в запросе нужно указать следующие элементы dimensions=ga:keyword&metrics=ga:entrances&sort=ga:keyword, т.е. собираем данные о переходах по ключевым словам (собираются данные по переходам с поисковых систем и кампаниям Adwords), отсортированные по ключевому слову. Полученные результаты выводятся скриптом на экран.
Пару слов об ограничениях на использование GA API.
Our policies are subject to change, but currently the quota limit for a given web property is 10,000 requests per 24 hours, and 100 requests in any given 10-second period. In addition, a query is also limited to pagination limits of 1000 rows per query.
Не более 10 000 запросов в сутки и 100 запросов в 10 секунд. Максимальный размер запроса 1000 рядов.
Скрипт успешно работает, по крайне мере у меня на компьютере
Если вам стало интересно, как работает данный код, что-то не получилось или просто возник вопрос - пишите комментарии
Полный код скрипта можно скачать здесь.
Полезные ссылки:
Google Analytics Data API - Protocol
Dimensions & Metrics Reference
Еще записи по теме:
- API запросы Google Analytics Полезная тулза для составления API запросов к фиду Google A
- API к Bing.com - обвертка на php Вообщем кто пользует Boss от Yahoo и php есть подароч
- Статистика Adsense в Google Analytics С неделю назад интегрировал статистику Adsense в аккаунт G
- Intelligence в Google Analytics Прикольная функция появилась в GA. Теперь есть возможно
- Сервисы для джанги и руби Все знают, что развернуть веб приложение на питоне или



Прикольно! Все бы так писали
Комментарий от Борис Милюков — 18 августа, 2009 #