/* Copyright (c) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package sample.analytics; import com.google.gdata.client.analytics.AnalyticsService; import com.google.gdata.client.analytics.DataQuery; import sample.util.SimpleCommandLineParser; import com.google.gdata.data.analytics.AccountEntry; import com.google.gdata.data.analytics.AccountFeed; import com.google.gdata.data.analytics.DataEntry; import com.google.gdata.data.analytics.DataFeed; import com.google.gdata.util.ServiceException; import java.io.IOException; import java.net.URL; import java.net.MalformedURLException; /** * Demonstrates how to use the Google Data API's Java client library to access * Google Analytics data. * * */ public class AnalyticsClient { private AnalyticsClient() {} public static final String ACCOUNTS_URL = "https://www.google.com/analytics/feeds/accounts/default"; public static final String DATA_URL = "https://www.google.com/analytics/feeds/data"; /** * Returns a data feed containing the accounts that the user logged in to the * given AnalyticsService has access to. * * @param myService The AnalyticsService to request accounts from * @return An AccountFeed containing an entry for each profile the logged-in * user has access to * @throws IOException If an error occurs while trying to communicate with * the Analytics server * @throws ServiceException If the API cannot fulfill the user request for * any reason */ public static AccountFeed getAvailableAccounts(AnalyticsService myService) throws IOException, ServiceException { URL feedUrl = new URL(ACCOUNTS_URL); return myService.getFeed(feedUrl, AccountFeed.class); } /** * Displays the accounts in the given account feed. */ public static void printAccounts(AccountFeed accountFeed) { System.out.println(accountFeed.getTitle().getPlainText()); for (AccountEntry entry : accountFeed.getEntries()) { System.out.println( "\t" + entry.getTitle().getPlainText() + ": " + entry.getTableId().getValue()); } System.out.println(); } /** * Gets a very basic data query request for the given table. * * @param tableId The ID of the table to request data from * @return A basic query for browser, visits, and bounce information from * the given table * @throws MalformedURLException If the URL used to request data is malformed */ public static DataQuery getBasicQuery(String tableId) throws MalformedURLException { // Set up the request (we could alternately construct a URL manually with all query parameters // set) DataQuery query = new DataQuery(new URL(DATA_URL)); query.setIds(tableId); query.setStartDate("2009-01-01"); query.setEndDate("2009-01-31"); query.setDimensions("ga:browser"); query.setMetrics("ga:visits,ga:bounces"); return query; } /** * Prints the contents of a data feed. * * @param title A header to print before the results * @param dataFeed The data feed containing data to print. Assumed to contain * ga:browser, ga:visits, and ga:bounces information. */ public static void printData(String title, DataFeed dataFeed) { System.out.println(title); for (DataEntry entry : dataFeed.getEntries()) { System.out.println("\tBrowser: " + entry.stringValueOf("ga:browser")); System.out.println("\t\tVisits: " + entry.stringValueOf("ga:visits")); System.out.println("\t\tBounces: " + entry.stringValueOf("ga:bounces")); System.out.println("\t\tBounce rate: " + entry.longValueOf("ga:bounces") / (double) entry.longValueOf("ga:visits")); } System.out.println(); } /** * Runs through all the examples using the given GoogleService instance. * * @param myService An unauthenticated AnalyticsService object * @throws ServiceException If the service is unable to handle the request * @throws IOException If there is an error communicating with the server */ public static void run(AnalyticsService myService, String username, String password) throws ServiceException, IOException { // Authenticate using ClientLogin myService.setUserCredentials(username, password); // Print a list of all accessible accounts AccountFeed accountFeed = getAvailableAccounts(myService); printAccounts(accountFeed); if (accountFeed.getEntries().isEmpty()) { return; } // Each entry in the account feed represents an individual profile AccountEntry profile = accountFeed.getEntries().get(0); String tableId = profile.getTableId().getValue(); // Print the results of a basic request DataQuery basicQuery = getBasicQuery(tableId); DataFeed basicData = myService.getFeed(basicQuery, DataFeed.class); printData("BASIC RESULTS", basicData); // Ask Analytics to return the data sorted in descending order of visits DataQuery sortedQuery = getBasicQuery(tableId); sortedQuery.setSort("-ga:visits"); DataFeed sortedData = myService.getFeed(sortedQuery, DataFeed.class); printData("SORTED RESULTS", sortedData); // Ask Analytics to filter out browsers that contain the word "Explorer" DataQuery filteredQuery = getBasicQuery(tableId); filteredQuery.setFilters("ga:browser!@Explorer"); DataFeed filteredData = myService.getFeed(filteredQuery, DataFeed.class); printData("FILTERED RESULTS", filteredData); } /** * Uses the command line arguments to authenticate the GoogleService and build * the basic feed URI, then invokes all the other methods to demonstrate how * to interface with the Analytics service. * * @param args See the usage method. */ public static void main(String[] args) { // Set username, password and feed URI from command-line arguments. SimpleCommandLineParser parser = new SimpleCommandLineParser(args); String userName = parser.getValue("username", "user", "u"); String userPassword = parser.getValue("password", "pwd", "p"); boolean help = parser.containsKey("help", "h"); if (help || (userName == null)) { usage(); System.exit(1); } AnalyticsService myService = new AnalyticsService("exampleCo-exampleApp-1"); try { run(myService, userName, userPassword); } catch (ServiceException se) { se.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * Prints the command line usage of this sample application. */ private static void usage() { System.err.println("Usage: AnalyticsClient --username <username> --password <password>"); System.err.println(); System.err.println("Fetches and displays various pieces of " + "information from the Google Analytics " + "Data Export API."); } }