As usual let's start with the Maven dependencies. But unfortunately Google do not provide jars that we need in any repository. Thus we need to download and install them to Maven by ourselves. Google for "gdata core jar" and "gdata analytics jar". When you will have those files execute in command line following code to install these jars:
mvn install:install-file -Dfile=gdata-core-1.0.jar -DgroupId=com.google.gdata -DartifactId=gdata-core -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -Dfile=gdata-analytics-2.1.jar -DgroupId=com.google.gdata -DartifactId=gdata-analytics -Dversion=2.1 -Dpackaging=jar -DgeneratePom=true
Add to pom.xml following Maven dependencies:
<dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-core</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-analytics</artifactId> <version>2.1</version> </dependency>
Also you may need Guava(which is Google's library with different basic and universal functions.
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>10.0.1</version> </dependency>
After maven fetches us our new dependencies we may continue and develop Java source code for Google Analytics API data fetching.
public static DataFeed getDataFeed(String dimensions, String metrics, String userName, String password, String tableId, String startDate, String endDate, int startIndex) throws IOException, ServiceException { System.out.println("Building data feed"); // Configure GA API. AnalyticsService as = new AnalyticsService("My application name"); // Client Login Authorization. as.setUserCredentials(userName, password); DataQuery query = new DataQuery(new URL("https://www.google.com/analytics/feeds/data")); query.setIds(tableId); query.setDimensions(dimensions); query.setMetrics(metrics); query.setSort("-" + metrics); query.setMaxResults(10000); query.setStartDate(startDate); query.setEndDate(endDate); query.setStartIndex(startIndex); URL url = query.getUrl(); System.out.println("URL: " + url.toString()); // Send our request to the Analytics API and wait for the results to // come back. DataFeed feed = as.getFeed(url, DataFeed.class); return feed; }
As a parameters you should provide
- dimensions and metrics (you can get both from Google Analytics API Reference)
- Google Analytics credentials (user name and password)
- Google Analytics Profile ID(also called table ID)
- date range for quering
- start index(We need to use start index because Google Analytics service won't return result set with more then 10000 records)
Let's save data that we got to CSV file using opencsv:
public static void saveAnalyticsFile(DataFeed feed, String fileName) { System.out.println("Saving to file"); try { CSVWriter writer = new CSVWriter(new FileWriter(fileName), ',' ,CSVWriter.DEFAULT_QUOTE_CHARACTER, '\\'); DataEntry singleEntry = feed.getEntries().get(0); List<String> feedDataNames = new ArrayList<String>(); List<String> dataRowValues = new ArrayList<String>(LoaderConstants.GA_FILE_HEADER.length); // Put all the dimension and metric names into an array. for (Dimension dimension : singleEntry.getDimensions()) { feedDataNames.add(dimension.getName()); } for (Metric metric : singleEntry.getMetrics()) { feedDataNames.add(metric.getName()); } //write header writer.writeNext(LoaderConstants.GA_FILE_HEADER); for (DataEntry entry : feed.getEntries()) { //assuming that the first entry is a keyword and others are numeric values if (!entry.stringValueOf(feedDataNames.get(0)).equals("(not provided)") && !entry.stringValueOf(feedDataNames.get(0)).equals("(not set)")) { dataRowValues.add(entry.stringValueOf(feedDataNames.get(0))); //keyword for (int i = 1; i < feedDataNames.size(); i++) { Double d = Double.parseDouble(entry.stringValueOf(feedDataNames.get(i))); String googleVal = new Long(d.longValue()).toString(); dataRowValues.add(googleVal); } writer.writeNext(dataRowValues.toArray(new String[0])); dataRowValues.clear(); } } writer.close(); System.out.println("Saving is done"); } catch (Exception e) { System.out.println("Cannot save file "); throw new RuntimeException(e); } }
And finally here is the main method:
public static void main(String[] args) { int startIndex = 1; boolean fetch = true; while (fetch) { DataFeed dataFeed = getDataFeed("ga:keyword", "ga:visits", "userName", "password", "profileId", "2012-08-13", "2012-08-19", startIndex); CsvWriteUtils.saveAnalyticsFile(dataFeed, "test"); startIndex += 10000; //Google Analytics Max result value //continue fetching until we receive all data if (startIndex > dataFeed.getTotalResults()) { fetch = false; } } }