Произошла необходимость создания небольшой отчётности на друпал, используя статистику Google Analytics. API для него нет, поэтому пришлось импровизировать
На ум пришла самая простая идея, хочу поделиться.
Работает только на PHP5 с подключённой библиотекой CURL.
Модуль тестировался на 6 версии (но вроде может работать и на 5) и пока имеет странное название GACore
Все три функции
- gacore_getdata - непосредственное получение данных;
- gacore_isauth - проверка на авторизированость;
- 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
?>
Рабочий пример:
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 разделённую табами и делаем с ней что хотим
Комментарии
Интересно, да. Гугл выдает несколько самопальных разработок такого API, может будет полезно. Есть там даже десктоп-версия.
vadbars@drupal.org, да, видел апи написанный на CakePHP, мне не понравилось, во-первых, платформа drupal, ставить дополнительно фреймвёрк не хочется, во-вторых, не понравился стиль написания.
AIR довольно оригинально, но это оффлайн программка и код закрыт.
Хорошо было бы, если бы данный модуль был на Drupal.org как полноценный проект и чтобы развивался дальше...
Автор - молодец!
а что друпал API позволяет сохранять переменные в cookie пользователя так variable_set('gav_cookiefile', 'cookie') variable_get('gav_cookiefile', 'cookie') ?
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.
Выложите модуль целиком что-бы там с .info и .module фалом, можно в архиве
О, заработало, можно тут посмотреть
http://shp.kz/node/21
спасибо, мне просто надо найти в API друпала функции которые позволят в куки пользователя записать и прочитать переменные.
а зачем это в функция Drupal искать? В php есть глобальный массив
<?php$_COOKIE?>
, записывайте в него нужные вам переменные и они автоматически запишутся в в куки пользователя.Separator@drupal.org, немного не хватает времени -((
То, что выложил тут, это скорее как можно зайти смотреть отчёты скриптом, а вот писать полноценный модуль, увы, совсем нету времени -(
Если даже сделать его как набор из 3 функций для других модулей, то все равно нужно привести к нормальному виду .. страницу настроек, нормальный вывод ошибок, как то по-человечески переменные обозвать, код оптимизировать, отрефакторить и т.д.
Если кто-то возьмётся причесать мою идею, буду только за!
Separator@drupal.org, Спасибо!
Спасибо!