At first you need to download gdata-webmastertools-2.0.jar and gdata-client-1.0.jar. You can take them from http://gdata-java-client.googlecode.com/files/gdata-src.java-1.47.1.zip (there in the lib folder you'll find the jars).
Then you'll need to place them into you PATH. I will use maven. At first I will install these jars:
mvn install:install-file -Dfile=gdata-webmastertools-2.0.jar -DgroupId=com.google.gdata -DartifactId=gdata-webmastertools -Dversion=2.0 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -Dfile=gdata-client-1.0.jar -DgroupId=com.google.gdata -DartifactId=gdata-client -Dversion=1.0 -Dpackaging=jar -DgeneratePom=trueAfter this I will add dependencies to my pom.xml:
<dependency>
<groupId>com.google.gdata</groupId>
<artifactId>gdata-client</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.google.gdata</groupId>
<artifactId>gdata-webmastertools</artifactId>
<version>2.0</version>
</dependency>
Also we'll need to parse JSON. I will use Jackson library:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.5</version>
</dependency>
And finally we are ready to get the report from Google WMT API. (In this example I also used Apache Commons and log4j but it's not necessary, so you can get rid off those dependencies)
package loader;
import com.google.gdata.client.Service.GDataRequest;
import com.google.gdata.client.Service.GDataRequest.RequestType;
import com.google.gdata.client.webmastertools.WebmasterToolsService;
import com.google.gdata.data.OutOfLineContent;
import com.google.gdata.data.webmastertools.SitesEntry;
import com.google.gdata.data.webmastertools.SitesFeed;
import com.google.gdata.util.*;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.apache.commons.lang.time.DateUtils;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
public class GoogleWMTClient {
private final static Logger LOGGER = Logger.getLogger(GoogleWMTClient.class);
private final static ArrayList<String> STATISTIC_TYPE = new ArrayList<String>();
static {
STATISTIC_TYPE.add("ALL");
// STATISTIC_TYPE.add("WEB");
// STATISTIC_TYPE.add("IMAGE");
// STATISTIC_TYPE.add("VIDEO");
// STATISTIC_TYPE.add("MOBILE_SMARTPHONE");
// STATISTIC_TYPE.add("MOBILE_RESTRICT");
}
private final static String GOOGLE_HOST = "www.google.com";
private final static String DOWNLOAD_LIST_URL_PART = "/webmasters/tools/downloads-list?hl=%s&siteUrl=%s";
private final static String SITES_FEED_URL_PART = "/webmasters/tools/feeds/sites/";
private final static String DATE_FORMAT = "yyyyMMdd";
private final static String APPLICATION_NAME = "JavaDevTips";
public static void main(String[] args) {
pullData(Constants.GWMT_URL, Constants.GWMT_LANGUAGE_CODE, new Date());
}
public static void pullData(String url, String languageCode, Date endDate) {
LOGGER.info("Download GWMT data for endDate: " + endDate + " and url: " + url);
try {
WebmasterToolsService service = initService(Constants.ADWORDS_USER, Constants.ADWORDS_PASSWORD);
// used for deletion of newly created SitesEntry
boolean newEntry = false;
SitesEntry entry = findSitesEntry(service, url);
if (entry == null) {
newEntry = true;
try {
entry = insertSiteEntry(service, url);
} catch (ServiceForbiddenException ex) {
LOGGER.error(ex, ex);
}
}
downloadReports(service, entry, endDate, languageCode);
if (newEntry) {
deleteSiteEntry(service, url);
}
} catch (ServiceException e) {
LOGGER.error(e, e);
} catch (IOException e) {
LOGGER.error(e, e);
}
}
public static WebmasterToolsService initService(String userName, String password) throws AuthenticationException {
WebmasterToolsService service = new WebmasterToolsService(APPLICATION_NAME);
service.setUserCredentials(userName, password);
return service;
}
private static SitesEntry findSitesEntry(WebmasterToolsService service, String siteUrl) throws IOException,
ServiceException {
siteUrl = correctSiteUrl(siteUrl);
LOGGER.info("Trying to find SitesEntry for " + siteUrl);
SitesFeed sitesResultFeed = service.getFeed(getGoogleUrl(SITES_FEED_URL_PART), SitesFeed.class);
for (SitesEntry entry : sitesResultFeed.getEntries()) {
if (entry.getTitle().getPlainText().equals(siteUrl)) {
LOGGER.info("SitesEntry is found");
return entry;
}
}
LOGGER.info("SitesEntry for " + siteUrl + " not found");
return null;
}
private static URL getGoogleUrl(String path) throws MalformedURLException {
return new URL("https://" + GOOGLE_HOST + path);
}
private static String correctSiteUrl(String siteUrl) {
siteUrl = siteUrl.trim();
if (!siteUrl.endsWith("/")) {
siteUrl += "/";
}
if (!siteUrl.startsWith("http")) {
siteUrl = "http://" + siteUrl;
}
return siteUrl;
}
private static void downloadReports(WebmasterToolsService service, SitesEntry entry, Date endDate,
String languageCode) throws IOException, ServiceException {
LOGGER.info("Downloading reports for " + entry.getTitle().getPlainText());
Date startDate = DateUtils.addDays(endDate, (-1) * Constants.DATA_PERIOD);
ObjectMapper mapper = new ObjectMapper();
InputStream inputStream = getQueryInputStream(service, entry, languageCode);
if (inputStream == null) {
LOGGER.error("Empty InputStream");
return;
}
Map<String, Object> map = mapper.readValue(inputStream, new TypeReference<Map<String, Object>>() {
});
if (map != null) {
String fileName = null;
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
for (String prop : STATISTIC_TYPE) {
StringBuilder sbPath = new StringBuilder((String) map.get("TOP_QUERIES")).append("&prop=" + prop)
.append("&db=" + sdf.format(startDate))
.append("&de=" + sdf.format(endDate));
fileName = "gwmt_" + sdf.format(endDate) + prop + ".csv" ;
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8");
boolean hasData = downloadData(service, sbPath.toString(), out);
if (!hasData) {
LOGGER.info("File contains no data. Deleting.");
new File(fileName).delete(); // if the file contain no data we delete it
}
out.close();
}
}
}
private static boolean downloadData(WebmasterToolsService service, String path, OutputStreamWriter out)
throws IOException, ServiceException {
LOGGER.info("Downloading data for " + path);
String data;
URL url = getGoogleUrl(path);
GDataRequest req = service.createRequest(RequestType.QUERY, url, ContentType.TEXT_PLAIN);
req.execute();
BufferedReader in = new BufferedReader(new InputStreamReader(req.getResponseStream()));
if (in.readLine() != null) {
while ((data = in.readLine()) != null) {
out.write(data + "\n");
}
return true;
} else {
return false;
}
}
private static InputStream getQueryInputStream(WebmasterToolsService service, SitesEntry entry, String lang)
throws IOException, ServiceException {
URL url = getGoogleUrl(String.format(DOWNLOAD_LIST_URL_PART, lang, entry.getTitle().getPlainText()));
GDataRequest req = service.createRequest(RequestType.QUERY, url, ContentType.JSON);
try {
req.execute();
return req.getResponseStream();
} catch (RedirectRequiredException e) {
LOGGER.error(e, e);
}
return null;
}
private static SitesEntry insertSiteEntry(WebmasterToolsService myService, String siteUrl) throws IOException,
ServiceException {
siteUrl = correctSiteUrl(siteUrl);
SitesEntry entry = new SitesEntry();
OutOfLineContent content = new OutOfLineContent();
content.setUri(siteUrl);
entry.setContent(content);
LOGGER.info("Adding SitesEntry for " + siteUrl);
return myService.insert(getGoogleUrl(SITES_FEED_URL_PART), entry);
}
private static void deleteSiteEntry(WebmasterToolsService myService, String siteUrl) throws IOException,
ServiceException {
siteUrl = correctSiteUrl(siteUrl);
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
URL feedUrl = new URL(getGoogleUrl(SITES_FEED_URL_PART) + siteId);
SitesEntry entry = myService.getEntry(feedUrl, SitesEntry.class);
LOGGER.info("Deleting SitesEntry for " + siteUrl);
entry.delete();
}
}