[자바]Google Report API를 이용한 사이트 통계정보 가져오기, 성별, 페이지제목별, 연령구간대별,브라우저별,OS별,모바일디바이스 브랜드별로 페이지뷰, 접속사용자수, 접속세션수
1. 마리아DB 테이블
2. ga.properties
#VIEW ID, 구글 애놀리틱스 화면에서 좌상 단 "전체웹사이트 데이터" 선택 후 팝업화면에서 오른쪽 전체웹사이트 데이터아래 숫자 입니다.
#Key File Location, 파일명은 사용자 마다 다릅니다. 위 1에서 사용자 등록하고 키파일 만든 바로 그것 입니다.
3. mybatis-config.xml
5. 매퍼 인터페이스(GaStatsMapper.java)
6. DAO(GaStatsDAO.java)
7. resource 아래 mapper 아래 매퍼 XML(gastats.xml)
7. 구글 통계정보 읽기
package batch;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting;
import com.google.api.services.analyticsreporting.v4.AnalyticsReportingScopes;
import com.google.api.services.analyticsreporting.v4.model.ColumnHeader;
import com.google.api.services.analyticsreporting.v4.model.DateRange;
import com.google.api.services.analyticsreporting.v4.model.DateRangeValues;
import com.google.api.services.analyticsreporting.v4.model.Dimension;
import com.google.api.services.analyticsreporting.v4.model.GetReportsRequest;
import com.google.api.services.analyticsreporting.v4.model.GetReportsResponse;
import com.google.api.services.analyticsreporting.v4.model.Metric;
import com.google.api.services.analyticsreporting.v4.model.MetricHeaderEntry;
import com.google.api.services.analyticsreporting.v4.model.Report;
import com.google.api.services.analyticsreporting.v4.model.ReportRequest;
import com.google.api.services.analyticsreporting.v4.model.ReportRow;
import jmx.db.dao.GaStatsDAO;
import jmx.vo.GaStatsVO;
/* ----------------------------------------------------------------------------
* File Name : GAStatistics.java
* Desc : 구글 통계정보 가지고 와서 DB 저장
* ----------------------------------------------------------------------------
*/
public class GaStatistics {
// 화면 ID(22931XXXX로 고정)
private String viewId = null;
// 키파일 위치
private String keyFileLocation = null;
//----------------------------------- Metric(측정항목) Start
//측정항목1
private String metric1Expression = null;
private String metric1Alias = null;
//측정항목2
private String metric2Expression = null;
private String metric2Alias = null;
//측정항목3
private String metric3Expression = null;
private String metric3Alias = null;
//----------------------------------- Dimension Start
private String dim1 = null;
private String dim2 = null;
private String dim3 = null;
private String dim4 = null;
private String dim5 = null;
private String dim6 = null;
private String dim7 = null;
// GAStatistics 클래스가 new 될때 호출되는 초기화 블럭
{
// 구글 통뎨정보 가지고 오기 위한 설정 파일
loadProperties();
}
private String APPLICATION_NAME = "서구 Analytics Reporting";
private JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
final static Logger logger = LogManager.getLogger(GaStatistics.class);
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("기간(일별)을 입력하세요. java batch.GaStatistics 2014-01-01 2020-12-31");
System.exit(1);
}
GaStatistics ga = new GaStatistics();
//기간을 확인
logger.info("::::: " + args[0] + " 부터 " + args[1] + " 까지 구글 통계정보를 가지고 옵니다");
try {
ga.getData(args[0], args[1]);
logger.info("::::: " + args[0] + " 부터 " + args[1] + " 까지 구글 통계정보를 가지고 옵니다");
}
catch(Exception e) {
e.printStackTrace();
}
}
/**
* Get Google Analytics Statistics Data
* @throws Exception
*/
public void getData(String startDate, String endDate) throws Exception {
try {
AnalyticsReporting service = initializeAnalyticsReporting();
// 입력 기간 데이터 삭제
delete(startDate, endDate);
GetReportsResponse response1 = getReport1(service, startDate, endDate);
saveResponse(response1, startDate, endDate);
GetReportsResponse response2 = getReport2(service, startDate, endDate);
saveResponse(response2, startDate, endDate);
} catch (Exception e) {
logger.error(">>>>> 구글 애널리틱스 데이터 수신 오류! ::: " + e.getMessage());
throw new Exception(e);
}
}
/**
* Initializes an Analytics Reporting API V4 service object.
*
* @return An authorized Analytics Reporting API V4 service object.
* @throws IOException
* @throws GeneralSecurityException
*/
private AnalyticsReporting initializeAnalyticsReporting() throws GeneralSecurityException, IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(keyFileLocation))
.createScoped(AnalyticsReportingScopes.all());
// Construct the Analytics Reporting service object.
return new AnalyticsReporting.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME).build();
}
/**
* Queries the Analytics Reporting API V4.
*
* 주의 : Request의 MAX는 5개, 즉 통계정보를 받기 위한 요청은 최대5개
* 그래서 getReport1(5개), getReport2(2개) 만듦
*
* @param service An authorized Analytics Reporting API V4 service object.
* @return GetReportResponse The Analytics Reporting API V4 response.
* @throws IOException
*/
private GetReportsResponse getReport1(AnalyticsReporting service, String startDate, String endDate) throws IOException {
// Create the DateRange object.
DateRange dateRange = new DateRange();
dateRange.setStartDate(startDate);
dateRange.setEndDate(endDate);
// Create the Metrics object.
Metric metric1 = new Metric().setExpression(metric1Expression).setAlias(metric1Alias); // 페이지뷰
Metric metric2 = new Metric().setExpression(metric2Expression).setAlias(metric2Alias); // 사용자수
Metric metric3 = new Metric().setExpression(metric3Expression).setAlias(metric3Alias); // 세션수
Metric metrics[] = new Metric[3];
metrics[0] = metric1;
metrics[1] = metric2;
metrics[2] = metric3;
Dimension dimension1 = new Dimension().setName(dim1); // 성별
Dimension dimension2 = new Dimension().setName(dim2); // 페이지제목별
Dimension dimension3 = new Dimension().setName(dim3); // 연령 구간대별
Dimension dimension4 = new Dimension().setName(dim4); // 브라우저별
Dimension dimension5 = new Dimension().setName(dim5); // OS별
//Dimension dimension6 = new Dimension().setName(dim6); // 모바일디바이스 브랜드별
//Dimension dimension7 = new Dimension().setName(dim7); // 기기(Device)별
// Create the ReportRequest object.
ReportRequest request1 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension1));
ReportRequest request2 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension2));
ReportRequest request3 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension3));
ReportRequest request4 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension4));
ReportRequest request5 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension5));
//ReportRequest request6 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
// .setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension6));
//ReportRequest request7 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
// .setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension7));
ArrayList<ReportRequest> requests = new ArrayList<ReportRequest>();
requests.add(request1);
requests.add(request2);
requests.add(request3);
requests.add(request4);
requests.add(request5);
//requests.add(request6);
//requests.add(request7);
// Create the GetReportsRequest object.
GetReportsRequest getReport = new GetReportsRequest().setReportRequests(requests);
// Call the batchGet method.
GetReportsResponse response = service.reports().batchGet(getReport).execute();
// Return the response.
return response;
}
/**
* Queries the Analytics Reporting API V4.
*
* 주의 : Request의 MAX는 5개, 즉 통계정보를 받기 위한 요청은 최대5개
* 그래서 getReport1(5개), getReport2(2개) 만듦
*
* @param service An authorized Analytics Reporting API V4 service object.
* @return GetReportResponse The Analytics Reporting API V4 response.
* @throws IOException
*/
private GetReportsResponse getReport2(AnalyticsReporting service, String startDate, String endDate) throws IOException {
// Create the DateRange object.
DateRange dateRange = new DateRange();
dateRange.setStartDate(startDate);
dateRange.setEndDate(endDate);
// Create the Metrics object.
Metric metric1 = new Metric().setExpression(metric1Expression).setAlias(metric1Alias); // 페이지뷰
Metric metric2 = new Metric().setExpression(metric2Expression).setAlias(metric2Alias); // 사용자수
Metric metric3 = new Metric().setExpression(metric3Expression).setAlias(metric3Alias); // 세션수
Metric metrics[] = new Metric[3];
metrics[0] = metric1;
metrics[1] = metric2;
metrics[2] = metric3;
Dimension dimension6 = new Dimension().setName(dim6); // 모바일디바이스 브랜드별
Dimension dimension7 = new Dimension().setName(dim7); // 기기(Device)별
// Create the ReportRequest object.
ReportRequest request6 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension6));
ReportRequest request7 = new ReportRequest().setViewId(viewId).setDateRanges(Arrays.asList(dateRange))
.setMetrics(Arrays.asList(metrics)).setDimensions(Arrays.asList(dimension7));
ArrayList<ReportRequest> requests = new ArrayList<ReportRequest>();
requests.add(request6);
requests.add(request7);
// Create the GetReportsRequest object.
GetReportsRequest getReport = new GetReportsRequest().setReportRequests(requests);
// Call the batchGet method.
GetReportsResponse response = service.reports().batchGet(getReport).execute();
// Return the response.
return response;
}
// 기간별 삭제
private void delete(String startDate, String endDate) throws Exception {
GaStatsVO vo = new GaStatsVO();
vo.setStart_ymd(startDate.replace("-", ""));
vo.setEnd_ymd(endDate.replace("-", ""));
// DB에 Mybatis를 통해 값을 저장하기 위한 DAO
GaStatsDAO dao = new GaStatsDAO();
// 혹시 있담녀 그날분 삭제
dao.deleteGaStats(vo);
}
/**
* Parses and prints the Analytics Reporting API V4 response.
*
* @param response An Analytics Reporting API V4 response.
* @throws Exception
*/
private void saveResponse(GetReportsResponse response, String startDate, String endDate) throws Exception {
GaStatsVO vo = new GaStatsVO();
vo.setStart_ymd(startDate.replace("-", ""));
vo.setEnd_ymd(endDate.replace("-", ""));
// DB에 Mybatis를 통해 값을 저장하기 위한 DAO
GaStatsDAO dao = new GaStatsDAO();
for (Report report : response.getReports()) {
ColumnHeader header = report.getColumnHeader();
List<String> dimensionHeaders = header.getDimensions();
List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
List<ReportRow> rows = report.getData().getRows();
if (rows == null) {
logger.info("No data found for " + viewId);
return;
}
for (ReportRow row : rows) {
List<String> dimensions = row.getDimensions();
List<DateRangeValues> metrics = row.getMetrics();
for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
vo.setDimension(dimensionHeaders.get(i));
if (dimensions.get(i).contains("(상세보기)")) {
vo.setDim_val(dimensions.get(i).substring(0, dimensions.get(i).indexOf("(상세보기)")-1));
}
else {
vo.setDim_val(dimensions.get(i));
}
if(dimensions.get(i).length() > 900) {
vo.setDim_val(dimensions.get(i).substring(0, 900));
}
}
for (int j = 0; j < metrics.size(); j++) {
DateRangeValues values = metrics.get(j);
for (int k = 0; k < values.getValues().size() && k < metricHeaders.size(); k++) {
if ("pageviews".equals(metricHeaders.get(k).getName())) {
vo.setPage_views(values.getValues().get(k));
}
else if ("users".equals(metricHeaders.get(k).getName())) {
vo.setUsers(values.getValues().get(k));
}
else if ("sessions".equals(metricHeaders.get(k).getName())) {
vo.setSessions(values.getValues().get(k));
}
}
}
try {
//VO에 있는 값을 저장
dao.insertGaStats(vo);
}
catch(Exception e) {
logger.error(">>>>> T_GA_STATS 저장 오류 ::: " + e);
e.printStackTrace();
throw new Exception("T_GA_STATS 저장 오류 ::: " + e);
}
}
}
}
/**
* 구글 통계정보를 가지고 오기 위한 설정파일 로딩
*/
public void loadProperties() {
InputStream input = null;
try {
input = this.getClass().getClassLoader().getResourceAsStream("ga.properties");
Properties prop = new Properties();
// load a properties file
prop.load(input);
// get the property value
viewId = prop.getProperty("view.id");
keyFileLocation = prop.getProperty("key.file.location");
metric1Expression = prop.getProperty("metric1.expression");
metric1Alias = prop.getProperty("metric1.alias");
metric2Expression = prop.getProperty("metric2.expression");
metric2Alias = prop.getProperty("metric2.alias");
metric3Expression = prop.getProperty("metric3.expression");
metric3Alias = prop.getProperty("metric3.alias");
dim1 = prop.getProperty("dim1");
dim2 = prop.getProperty("dim2");
dim3 = prop.getProperty("dim3");
dim4 = prop.getProperty("dim4");
dim5 = prop.getProperty("dim5");
dim6 = prop.getProperty("dim6");
dim7 = prop.getProperty("dim7");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
input = null;
} catch (Exception e) {
}
}
}
}
}