GA.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. <?php
  2. namespace app\lib;
  3. class GA{
  4. const SUPERNOVA_KEY_PATH= BASE_DIR . 'config/supernova.json';
  5. const ALIPEARL_KEY_PATH= BASE_DIR . 'config/alipearl.json';
  6. private static $insances=[];
  7. private static function initializeAnalytics($dp){
  8. $KEY_FILE_LOCATION = self::getPath($dp);
  9. if(!$KEY_FILE_LOCATION){
  10. throw new Exception("store 配置不存在");
  11. }
  12. $client = new \Google_Client();
  13. $client->setApplicationName("Hello Analytics Reporting");
  14. $client->setAuthConfig($KEY_FILE_LOCATION);
  15. $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']);
  16. $analytics = new \Google_Service_AnalyticsReporting($client);
  17. return $analytics;
  18. }
  19. public static function getInstance($dp){
  20. if(isset(self::$insances[$dp])){
  21. return self::$insances[$dp];
  22. }else{
  23. self::$insances[$dp]=self::initializeAnalytics($dp);
  24. return self::$insances[$dp];
  25. }
  26. }
  27. private function getViewId($dp){
  28. $VIEW_ID="";
  29. switch($dp){
  30. case "1"://supernovahair
  31. $VIEW_ID="155703065";
  32. break;
  33. case "3"://alipearlhair
  34. $VIEW_ID="148377136";
  35. break;
  36. }
  37. return $VIEW_ID;
  38. }
  39. public static function getPath($dp){
  40. $path="";
  41. switch($dp){
  42. case "1"://supernovahair
  43. $path=self::SUPERNOVA_KEY_PATH;
  44. break;
  45. case "3"://alipearlhair
  46. $path=self::ALIPEARL_KEY_PATH;
  47. break;
  48. }
  49. return $path;
  50. }
  51. public function contentpages($dp,$start_at,$end_at){
  52. $analytics=self::getInstance($dp);
  53. $metricArr=[
  54. 'pageviews'=>"ga:pageviews",
  55. 'uniquePageviews'=>"ga:uniquePageviews",
  56. 'avgTimeOnPage'=>"ga:avgTimeOnPage",
  57. 'entrances'=>"ga:entrances",
  58. 'bounceRate'=>"ga:bounceRate",
  59. 'exitRate'=>"ga:exitRate",
  60. 'pageValue'=>"ga:pageValue",
  61. ];
  62. $dimensionArr=[
  63. 'pagePath'=>'ga:pagePath',
  64. 'date'=>"ga:date",
  65. ];
  66. $VIEW_ID = $this->getViewId($dp);//
  67. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  68. $dateRange->setStartDate($start_at);
  69. $dateRange->setEndDate($end_at);
  70. $metrics=[];
  71. $dimensions=[];
  72. foreach($metricArr as $k=>$v){
  73. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  74. $Metric->setExpression($v);
  75. $Metric->setAlias($k);
  76. array_push($metrics,$Metric);
  77. }
  78. foreach($dimensionArr as $k=>$v){
  79. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  80. $Dimension->setName($v);
  81. array_push($dimensions,$Dimension);
  82. }
  83. $pageviewsFilter = new \Google_Service_AnalyticsReporting_MetricFilter();
  84. $pageviewsFilter->setMetricName("ga:pageviews");
  85. $pageviewsFilter->setOperator("GREATER_THAN");
  86. $pageviewsFilter->setComparisonValue("1");
  87. $MetricFilterClause=new \Google_Service_AnalyticsReporting_MetricFilterClause();
  88. $MetricFilterClause->setFilters(array($pageviewsFilter));
  89. $segmentDimensions = new \Google_Service_AnalyticsReporting_Dimension();
  90. $segmentDimensions->setName("ga:segment");
  91. array_push($dimensions,$segmentDimensions);
  92. // Create Dimension Filter.
  93. $dimensionFilter = new \Google_Service_AnalyticsReporting_SegmentDimensionFilter();
  94. $dimensionFilter->setDimensionName("ga:pagePath");
  95. $dimensionFilter->setOperator("REGEXP");
  96. $dimensionFilter->setExpressions(array("(fbclid|catalogsearch)"));
  97. // Create Segment Filter Clause.
  98. $segmentFilterClause = new \Google_Service_AnalyticsReporting_SegmentFilterClause();
  99. $segmentFilterClause->setDimensionFilter($dimensionFilter);
  100. // Create the Or Filters for Segment.
  101. $orFiltersForSegment = new \Google_Service_AnalyticsReporting_OrFiltersForSegment();
  102. $orFiltersForSegment->setSegmentFilterClauses(array($segmentFilterClause));
  103. // Create the Simple Segment.
  104. $simpleSegment = new \Google_Service_AnalyticsReporting_SimpleSegment();
  105. $simpleSegment->setOrFiltersForSegment(array($orFiltersForSegment));
  106. // Create the Segment Filters.
  107. $segmentFilter = new \Google_Service_AnalyticsReporting_SegmentFilter();
  108. $segmentFilter->setSimpleSegment($simpleSegment);
  109. $segmentFilter->setNot(True);
  110. // Create the Segment Definition.
  111. $segmentDefinition = new \Google_Service_AnalyticsReporting_SegmentDefinition();
  112. $segmentDefinition->setSegmentFilters(array($segmentFilter));
  113. $dynamicSegment = new \Google_Service_AnalyticsReporting_DynamicSegment();
  114. $dynamicSegment->setSessionSegment($segmentDefinition);
  115. $dynamicSegment->setName('pagePath');
  116. $segment = new \Google_Service_AnalyticsReporting_Segment();
  117. $segment->setDynamicSegment($dynamicSegment);
  118. $orderBy=new \Google_Service_AnalyticsReporting_OrderBy();
  119. $orderBy->setFieldName('ga:pageviews');
  120. $orderBy->setSortOrder("DESCENDING");
  121. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  122. $request->setViewId($VIEW_ID);
  123. $request->setDateRanges($dateRange);
  124. $request->setMetrics($metrics);
  125. $request->setDimensions($dimensions);
  126. $request->setSegments(array($segment));
  127. $request->setOrderBys($orderBy);
  128. $request->setPageSize(5000);
  129. $request->setMetricFilterClauses($MetricFilterClause);
  130. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  131. $body->setReportRequests( array( $request) );
  132. $reports= $analytics->reports->batchGet( $body );
  133. $result=$this->getResults($reports);
  134. return $result;
  135. }
  136. public function trafficsource($dp,$start_at,$end_at){
  137. $analytics=self::getInstance($dp);
  138. $metricArr=[
  139. 'users'=>"ga:users",
  140. 'newUsers'=>"ga:newUsers",
  141. 'sessions'=>"ga:sessions",
  142. 'bounceRate'=>"ga:bounceRate",
  143. 'pageviewsPerSession'=>"ga:pageviewsPerSession",
  144. 'avgSessionDuration'=>"ga:avgSessionDuration",
  145. 'transactionsPerVisit'=>"ga:transactionsPerVisit",
  146. 'transactions'=>"ga:transactions",
  147. 'transactionRevenue'=>"ga:transactionRevenue",
  148. ];
  149. $dimensionArr=[
  150. 'pagePath'=>'ga:source',
  151. 'date'=>"ga:date",
  152. 'channelGrouping'=>"ga:channelGrouping",
  153. 'landingPagePath'=>"ga:landingPagePath",
  154. 'keyword'=>"ga:keyword",
  155. 'socialNetwork'=>"ga:socialNetwork",
  156. ];
  157. $VIEW_ID = $this->getViewId($dp);//
  158. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  159. $dateRange->setStartDate($start_at);
  160. $dateRange->setEndDate($end_at);
  161. $metrics=[];
  162. $dimensions=[];
  163. foreach($metricArr as $k=>$v){
  164. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  165. $Metric->setExpression($v);
  166. $Metric->setAlias($k);
  167. array_push($metrics,$Metric);
  168. }
  169. foreach($dimensionArr as $k=>$v){
  170. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  171. $Dimension->setName($v);
  172. array_push($dimensions,$Dimension);
  173. }
  174. $segmentDimensions = new \Google_Service_AnalyticsReporting_Dimension();
  175. $segmentDimensions->setName("ga:segment");
  176. array_push($dimensions,$segmentDimensions);
  177. // Create Dimension Filter.
  178. $dimensionFilter = new \Google_Service_AnalyticsReporting_SegmentDimensionFilter();
  179. $dimensionFilter->setDimensionName("ga:source");
  180. $dimensionFilter->setOperator("REGEXP");
  181. $dimensionFilter->setExpressions(array("(fbclid|catalogsearch)"));
  182. // Create Segment Filter Clause.
  183. $segmentFilterClause = new \Google_Service_AnalyticsReporting_SegmentFilterClause();
  184. $segmentFilterClause->setDimensionFilter($dimensionFilter);
  185. // Create the Or Filters for Segment.
  186. $orFiltersForSegment = new \Google_Service_AnalyticsReporting_OrFiltersForSegment();
  187. $orFiltersForSegment->setSegmentFilterClauses(array($segmentFilterClause));
  188. // Create the Simple Segment.
  189. $simpleSegment = new \Google_Service_AnalyticsReporting_SimpleSegment();
  190. $simpleSegment->setOrFiltersForSegment(array($orFiltersForSegment));
  191. // Create the Segment Filters.
  192. $segmentFilter = new \Google_Service_AnalyticsReporting_SegmentFilter();
  193. $segmentFilter->setSimpleSegment($simpleSegment);
  194. $segmentFilter->setNot(True);
  195. // Create the Segment Definition.
  196. $segmentDefinition = new \Google_Service_AnalyticsReporting_SegmentDefinition();
  197. $segmentDefinition->setSegmentFilters(array($segmentFilter));
  198. $dynamicSegment = new \Google_Service_AnalyticsReporting_DynamicSegment();
  199. $dynamicSegment->setSessionSegment($segmentDefinition);
  200. $dynamicSegment->setName('trafficsources filter');
  201. $segment = new \Google_Service_AnalyticsReporting_Segment();
  202. $segment->setDynamicSegment($dynamicSegment);
  203. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  204. $request->setViewId($VIEW_ID);
  205. $request->setDateRanges($dateRange);
  206. $request->setMetrics($metrics);
  207. $request->setDimensions($dimensions);
  208. $request->setSegments(array($segment));
  209. $request->setPageSize(5000);
  210. // $request->setOrderBys($orderBy);
  211. // $request->setMetricFilterClauses($MetricFilterClause);
  212. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  213. $body->setReportRequests( array( $request) );
  214. $reports= $analytics->reports->batchGet( $body );
  215. $result=$this->getResults($reports);
  216. return $result;
  217. }
  218. public function visitors_geo($dp,$start_at,$end_at){
  219. $analytics=self::getInstance($dp);
  220. $dimensionArr=[
  221. 'country'=>'ga:country',
  222. 'region'=>"ga:region",
  223. ];
  224. $metricArr=[
  225. 'transactions'=>"ga:transactions",
  226. 'transactionRevenue'=>"ga:transactionRevenue",
  227. ];
  228. $VIEW_ID = $this->getViewId($dp);//
  229. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  230. $dateRange->setStartDate($start_at);
  231. $dateRange->setEndDate($end_at);
  232. $metrics=[];
  233. $dimensions=[];
  234. foreach($metricArr as $k=>$v){
  235. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  236. $Metric->setExpression($v);
  237. $Metric->setAlias($k);
  238. array_push($metrics,$Metric);
  239. }
  240. foreach($dimensionArr as $k=>$v){
  241. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  242. $Dimension->setName($v);
  243. array_push($dimensions,$Dimension);
  244. }
  245. $orderBy=new \Google_Service_AnalyticsReporting_OrderBy();
  246. $orderBy->setFieldName('ga:transactions');
  247. $orderBy->setSortOrder("DESCENDING");
  248. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  249. $request->setViewId($VIEW_ID);
  250. $request->setDateRanges($dateRange);
  251. $request->setMetrics($metrics);
  252. $request->setDimensions($dimensions);
  253. $request->setOrderBys($orderBy);
  254. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  255. $body->setReportRequests( array( $request) );
  256. $reports= $analytics->reports->batchGet( $body );
  257. $result=$this->getResults($reports);
  258. return $result;
  259. }
  260. public function product($dp,$start_at,$end_at){
  261. $analytics=self::getInstance($dp);
  262. $dimensionArr=[
  263. 'productName'=>'ga:productName',
  264. ];
  265. $metricArr=[
  266. 'itemRevenue'=>"ga:itemRevenue",
  267. 'uniquePurchases'=>"ga:uniquePurchases",
  268. 'itemQuantity'=>"ga:itemQuantity",
  269. ];
  270. $VIEW_ID = $this->getViewId($dp);//
  271. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  272. $dateRange->setStartDate($start_at);
  273. $dateRange->setEndDate($end_at);
  274. $metrics=[];
  275. $dimensions=[];
  276. foreach($metricArr as $k=>$v){
  277. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  278. $Metric->setExpression($v);
  279. $Metric->setAlias($k);
  280. array_push($metrics,$Metric);
  281. }
  282. foreach($dimensionArr as $k=>$v){
  283. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  284. $Dimension->setName($v);
  285. array_push($dimensions,$Dimension);
  286. }
  287. $orderBy=new \Google_Service_AnalyticsReporting_OrderBy();
  288. $orderBy->setFieldName('ga:itemQuantity');
  289. $orderBy->setSortOrder("DESCENDING");
  290. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  291. $request->setViewId($VIEW_ID);
  292. $request->setDateRanges($dateRange);
  293. $request->setMetrics($metrics);
  294. $request->setDimensions($dimensions);
  295. $request->setOrderBys($orderBy);
  296. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  297. $body->setReportRequests( array( $request) );
  298. $reports= $analytics->reports->batchGet( $body );
  299. $result=$this->getResults($reports);
  300. return $result;
  301. }
  302. public function visitors_type($dp,$start_at,$end_at){
  303. $analytics=self::getInstance($dp);
  304. $dimensionArr=[
  305. 'userType'=>'ga:userType',
  306. 'date'=>'ga:date',
  307. ];
  308. $metricArr=[
  309. 'users'=>"ga:users",
  310. 'newUsers'=>"ga:newUsers",
  311. ];
  312. $VIEW_ID = $this->getViewId($dp);//
  313. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  314. $dateRange->setStartDate($start_at);
  315. $dateRange->setEndDate($end_at);
  316. $metrics=[];
  317. $dimensions=[];
  318. foreach($metricArr as $k=>$v){
  319. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  320. $Metric->setExpression($v);
  321. $Metric->setAlias($k);
  322. array_push($metrics,$Metric);
  323. }
  324. foreach($dimensionArr as $k=>$v){
  325. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  326. $Dimension->setName($v);
  327. array_push($dimensions,$Dimension);
  328. }
  329. // $orderBy=new \Google_Service_AnalyticsReporting_OrderBy();
  330. // $orderBy->setFieldName('ga:itemQuantity');
  331. // $orderBy->setSortOrder("DESCENDING");
  332. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  333. $request->setViewId($VIEW_ID);
  334. $request->setDateRanges($dateRange);
  335. $request->setMetrics($metrics);
  336. $request->setDimensions($dimensions);
  337. // $request->setOrderBys($orderBy);
  338. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  339. $body->setReportRequests( array( $request) );
  340. $reports= $analytics->reports->batchGet( $body );
  341. $result=$this->getResults($reports);
  342. return $result;
  343. }
  344. public function productInfo($productName,$store,$start_at,$end_at){
  345. $analytics=self::getInstance($dp);
  346. $dimensionArr=[
  347. 'productName'=>'ga:productName',
  348. ];
  349. $metricArr=[
  350. 'itemRevenue'=>"ga:itemRevenue",
  351. 'revenuePerItem'=>"ga:revenuePerItem",
  352. 'productRefundAmount'=>"ga:productRefundAmount",
  353. 'quantityAddedToCart'=>"ga:quantityAddedToCart",
  354. // 'quantityRemovedFromCart'=>"ga:quantityRemovedFromCart",
  355. 'itemQuantity'=>"ga:itemQuantity",
  356. 'productListViews'=>"ga:productListViews",
  357. 'productDetailViews'=>"ga:productDetailViews",
  358. 'productAddsToCart'=>"ga:productAddsToCart",
  359. // 'productRemovesFromCart'=>"ga:productRemovesFromCart",
  360. 'productCheckouts'=>"ga:productCheckouts",
  361. 'uniquePurchases'=>"ga:uniquePurchases",
  362. ];
  363. $VIEW_ID = $this->getViewId($dp);//
  364. $dateRange = new \Google_Service_AnalyticsReporting_DateRange();
  365. $dateRange->setStartDate($start_at);
  366. $dateRange->setEndDate($end_at);
  367. $metrics=[];
  368. $dimensions=[];
  369. foreach($metricArr as $k=>$v){
  370. $Metric = new \Google_Service_AnalyticsReporting_Metric();
  371. $Metric->setExpression($v);
  372. $Metric->setAlias($k);
  373. array_push($metrics,$Metric);
  374. }
  375. foreach($dimensionArr as $k=>$v){
  376. $Dimension = new \Google_Service_AnalyticsReporting_Dimension();
  377. $Dimension->setName($v);
  378. array_push($dimensions,$Dimension);
  379. }
  380. $skuFilter = new \Google_Service_AnalyticsReporting_DimensionFilter();
  381. $skuFilter->setDimensionName("ga:productName");
  382. $skuFilter->setOperator("EXACT");
  383. $skuFilter->setExpressions([$productName]);
  384. $MetricFilterClause=new \Google_Service_AnalyticsReporting_MetricFilterClause();
  385. $MetricFilterClause->setFilters(array($skuFilter));
  386. $request = new \Google_Service_AnalyticsReporting_ReportRequest();
  387. $request->setViewId($VIEW_ID);
  388. $request->setDateRanges($dateRange);
  389. $request->setMetrics($metrics);
  390. $request->setDimensions($dimensions);
  391. $request->setDimensionFilterClauses($MetricFilterClause);
  392. // $request->setOrderBys($orderBy);
  393. $body = new \Google_Service_AnalyticsReporting_GetReportsRequest();
  394. $body->setReportRequests( array( $request) );
  395. $reports= $analytics->reports->batchGet( $body );
  396. $result=$this->getResults($reports);
  397. return $result;
  398. }
  399. /**
  400. * Queries the Analytics Reporting API V4.
  401. *
  402. * @param service An authorized Analytics Reporting API V4 service object.
  403. * @return The Analytics Reporting API V4 response.
  404. */
  405. function getContentReport($VIEW_ID,$analytics,$metricArr,$dimensionArr) {
  406. }
  407. function getResults($reports) {
  408. $data=[];
  409. for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) {
  410. $item=[];
  411. $report = $reports[ $reportIndex ];
  412. $header = $report->getColumnHeader();
  413. $dimensionHeaders = $header->getDimensions();
  414. $metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries();
  415. $rows = $report->getData()->getRows();
  416. for ( $rowIndex = 0; $rowIndex < count($rows); $rowIndex++) {
  417. $row = $rows[ $rowIndex ];
  418. $dimensions = $row->getDimensions();
  419. $metrics = $row->getMetrics();
  420. if($dimensionHeaders&&$dimensions){
  421. for ($i = 0; $i < count($dimensionHeaders) && $i < count($dimensions); $i++) {
  422. $header = $dimensionHeaders[$i];
  423. $header=str_replace('ga:','',$header);
  424. $item[$header]=$dimensions[$i];
  425. // print($dimensionHeaders[$i] . ": " . $dimensions[$i] . "\n\r");
  426. // echo"<br/>";
  427. }
  428. // $date=$dimensions[0];
  429. // $date=date('Y-m-d',strtotime($date));
  430. }else{
  431. continue;
  432. }
  433. if($metricHeaders&&$metrics){
  434. for ($j = 0; $j < count($metrics); $j++) {
  435. $values = $metrics[$j]->getValues();
  436. for ($k = 0; $k < count($values); $k++) {
  437. $entry = $metricHeaders[$k];
  438. $item[$entry->getName()]=$values[$k];
  439. // print($entry->getName() . ": " . $values[$k] . "\n\r");
  440. // echo"<br/>";
  441. }
  442. }
  443. }
  444. $data[]=$item;
  445. }
  446. }
  447. return $data;
  448. }
  449. }