Drupal Google Analytics API

Аватар пользователя botan botan 19 октября 2007 в 12:54

Произошла необходимость создания небольшой отчётности на друпал, используя статистику Google Analytics. API для него нет, поэтому пришлось импровизировать =)

На ум пришла самая простая идея, хочу поделиться.
Работает только на PHP5 с подключённой библиотекой CURL.

Модуль тестировался на 6 версии (но вроде может работать и на 5) и пока имеет странное название GACore
Все три функции

  1. gacore_getdata - непосредственное получение данных;
  2. gacore_isauth - проверка на авторизированость;
  3. gacore_login - авторизация.

Ниже код с комментариями.

<?php
function gacore_getdata($id, $task, $pdr = "", $cdr= "", $fmt = 1){ // $id - Id проекта, $task - вид отчета, $pdr и $cdr - период от и до соответственноб $fmt - вид данных отчета
$ch = curl_init();
$url = "https://www.google.com/analytics/reporting/export?id={$id}&pdr={$pdr}&cdr={$cdr}&cmp=date_range&fmt={$fmt}&rpt={$task}"; // Сама строка запроса на отчет.

$options = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => FALSE,
CURLOPT_NOBODY => FALSE,
CURLOPT_POST => false,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_COOKIEFILE => drupal_get_path('module', 'gacore') . "/" . variable_get('gav_cookiefile', 'cookie'), // именно тут мы берем куки, которые были вырезаны нами в файлик
);
curl_setopt_array($ch, $options);
$r = curl_exec($ch);
$intReturnCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $r;
} // function gacore_getdata

function gacore_isauth(){ // Ничего сюда не передаём, просто проверяем авторизированны ли мы в системе Гугла
$ch = curl_init();
$options = array(
CURLOPT_URL => 'https://www.google.com/analytics/reporting',
CURLOPT_HEADER => FALSE,
CURLOPT_NOBODY => FALSE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_COOKIEFILE => drupal_get_path('module', 'gacore') . "/" . variable_get('gav_cookiefile', 'cookie'),
);

curl_setopt_array($ch, $options);
curl_exec($ch);
$intReturnCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($intReturnCode == 200) ? TRUE : FALSE; // Гугл в случае если мы автозирированны выдает страницу, если нет, то перемещает на страницу авторизации, при этом выдавая в заголовке не 200
} // function gacore_isauth

function gacore_login($user, $pass){ // передаем логин и пароль
$ch = curl_init();
$fname = variable_get('gav_cookiefile', 'cookie'); // Эту переменную нужно либо внести из другого модуля или жестко прописать какой файл использовать.
$file = fopen (drupal_get_path('module', 'gacore') . "/{$fname}", "w");
$file2 = fopen (drupal_get_path('module', 'gacore') . "/std", "w"); // Это вроде не нужно, но не уверен, потом выясню =)

$options = array(
CURLOPT_URL => 'https://www.google.com/accounts/ServiceLoginBoxAuth',
CURLOPT_HEADER => FALSE,
CURLOPT_NOBODY => FALSE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POST => true, // передаем постом
CURLOPT_POSTFIELDS => "Email={$user}&Passwd={$pass}", // передаваемые параметры
CURLOPT_WRITEHEADER => $file, // записываем заголовок переданый от сервера в файл
// CURLOPT_FILE => $file2,
);
curl_setopt_array($ch, $options);
curl_exec($ch);
fclose($file);
curl_close($ch);
// Теперь на нужно вытащить куки из заголовка
$f = file_get_contents(drupal_get_path('module', 'gacore') . "/{$fname}"); // Читаем
preg_match_all("#(Set\-Cookie\:(?:.*?))\n#", $f, $matches); // Вырезаем только значения кук
$st = implode("\n", $matches[1]); // Сливаем в одну строку
file_put_contents(drupal_get_path('module', 'gacore') . "/{$fname}", $st); // и снова записываем в файл

$csize = filesize(drupal_get_path('module', 'gacore') . "/" . variable_get('gav_cookiefile', 'cookie')); // Это что то типа проверки на удачность авторизации, если куки передались, значит все верно, в случае неудачи Гугл ничего не выдаёт.
return ($csize) ? TRUE : FALSE;
// file_put_contents('qw', $st);
} // function gacore_login
?>

Рабочий пример:

<?php
if(!gacore_isauth()) if(!gacore_login(variable_get('gav_username', ''), variable_get('gav_password', ''))) return "CHECK THE LOGIN/PASSWORD";

//формат отчета: 0 - pdf, 1 - xml, 2 - csv, 3 - tsv
$k = gacore_getdata($project->gaid, "VisitsReport", "20070918-20071018", "0070818-20070917", 3);
?>

В результате в $k имеем csv разделённую табами и делаем с ней что хотим =)

0 Thanks

Комментарии

Аватар пользователя botan botan 20 октября 2007 в 17:19

vadbars@drupal.org, да, видел апи написанный на CakePHP, мне не понравилось, во-первых, платформа drupal, ставить дополнительно фреймвёрк не хочется, во-вторых, не понравился стиль написания.
AIR довольно оригинально, но это оффлайн программка и код закрыт.

Аватар пользователя Razunter Razunter 21 октября 2007 в 22:17

Хорошо было бы, если бы данный модуль был на Drupal.org как полноценный проект и чтобы развивался дальше...

Аватар пользователя kiev1 kiev1 4 февраля 2008 в 2:26

а что друпал API позволяет сохранять переменные в cookie пользователя так variable_set('gav_cookiefile', 'cookie') variable_get('gav_cookiefile', 'cookie') ?

Аватар пользователя botan botan 4 февраля 2008 в 11:56

kiev1, Нет.
В переменную друпала 'gav_cookiefile' заносим и выбираем имя файла. В данном случае просто для хранения используем файл с именем cookie.
Нам нужно получить куки выданные Гуглом что бы потом при помощи их пройти авторизацию. Так вот полученные куки мы пишем в файл.

Если подробнее, то <?php
$fname = variable_get('gav_cookiefile', 'cookie'); // Эти действием в $fname мы заносим значение, которое хранится в таблице variables под меткой gav_cookiefile. Если его нету, то по-умолчанию делаем файлик с именем cookie.
$file = fopen (drupal_get_path('module', 'gacore') . "/{$fname}", "w"); // А этим мы открываем файлик /sites/all/modules/gacore/{имя файла где храним временные куки}
?>

Вы наверное не верно поняли что делают функции variable_get и variable_set в друпале, посмтрите API.

Аватар пользователя kiev1 kiev1 5 февраля 2008 в 4:41

спасибо, мне просто надо найти в API друпала функции которые позволят в куки пользователя записать и прочитать переменные.

Аватар пользователя Separator@drupal.org Separator@drupal.org 5 февраля 2008 в 6:12

а зачем это в функция Drupal искать? В php есть глобальный массив <?php$_COOKIE?>, записывайте в него нужные вам переменные и они автоматически запишутся в в куки пользователя.

Аватар пользователя botan botan 5 февраля 2008 в 15:15

Separator@drupal.org, немного не хватает времени -((
То, что выложил тут, это скорее как можно зайти смотреть отчёты скриптом, а вот писать полноценный модуль, увы, совсем нету времени -(
Если даже сделать его как набор из 3 функций для других модулей, то все равно нужно привести к нормальному виду .. страницу настроек, нормальный вывод ошибок, как то по-человечески переменные обозвать, код оптимизировать, отрефакторить и т.д.
Если кто-то возьмётся причесать мою идею, буду только за!