Drupal Google Analytics API

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

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

На ум пришла самая простая идея, хочу поделиться.
Работает только на 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"); // Это вроде не нужно, но не уверен, потом выясню Smile

$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 разделённую табами и делаем с ней что хотим Smile

Комментарии

Аватар пользователя 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 функций для других модулей, то все равно нужно привести к нормальному виду .. страницу настроек, нормальный вывод ошибок, как то по-человечески переменные обозвать, код оптимизировать, отрефакторить и т.д.
Если кто-то возьмётся причесать мою идею, буду только за!