/* 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.webmastertools;
import com.google.gdata.client.webmastertools.WebmasterToolsService;
import com.google.gdata.data.OutOfLineContent;
import com.google.gdata.data.webmastertools.CrawlRate;
import com.google.gdata.data.webmastertools.DomainPreference;
import com.google.gdata.data.webmastertools.SitemapsEntry;
import com.google.gdata.data.webmastertools.SitemapsFeed;
import com.google.gdata.data.webmastertools.SitemapsRegularEntry;
import com.google.gdata.data.webmastertools.SitesEntry;
import com.google.gdata.data.webmastertools.SitesFeed;
import com.google.gdata.data.webmastertools.VerificationMethod;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import sample.util.SimpleCommandLineParser;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
/**
* Demonstrates how to use the Google Data API's Java client library to
* interface with the Webmaster Tools service.
*
* Google Data API: http://code.google.com/apis/gdata/
* Webmaster Tools Data API: http://code.google.com/apis/webmastertools/
*
* There are methods for the following operations:
* <ol>
* <li>List user's sites</li>
* <li>Add site</li>
* <li>List verification options</li>
* <li>Verify site</li>
* <li>List site settings</li>
* <li>Update site settings</li>
* <li>Delete site</li>
* <li>List user's Sitemaps</li>
* <li>Add Sitemap</li>
* <li>Delete Sitemap</li>
* </ol>
*
* This sample program will only perform:
* <ol>
* <li>List user's sites</li>
* <li>Add site: SAMPLE_SITE</li>
* <li>List verification values for SAMPLE_SITE</li>
* <li>List site settings (will not appear for unverified sites)</li>
* <li>List user's Sitemaps</li>
* <li>Add SAMPLE_SITEMAP</li>
* <li>Delete SAMPLE_SITEMAP</li>
* <li>Delete SAMPLE_SITE</li>
* </ol>
*/
public class WebmasterToolsClient {
// URL of the base feed
private static final String FEED_URI_BASE
= "https://www.google.com/webmasters/tools/feeds/";
// Directory of the sites feed
private static final String SITES_FEED_DIRECTORY = "sites/";
// Directory of the sitemaps feed for a particular site
private static final String SITEMAPS_FEED_DIRECTORY = "/sitemaps/";
// Sample site URL. No verification required to add or remove sites
// Please keep the trailing slash, it is required to access the site
private static final String SAMPLE_SITE = "http://www.example.com/";
// Sample sitemaps URL. No verification required to add or remove sitemaps
private static final String SAMPLE_SITEMAP
= "http://www.example.com/sitemap.xml";
// Geographic location, two letter region code
private static final String SAMPLE_LOCATION = "CA";
// Desired crawl rate, SLOWER, NORMAL, FASTER. See CrawlRate
private static final CrawlRate SAMPLE_RATE = CrawlRate.SLOWER;
// Preferred domain. NONE, PREFER_WWW, PREFER_NO_WWW. See Domain Preference
private static final DomainPreference SAMPLE_PREFERRED_DOMAIN
= DomainPreference.PREFER_WWW;
// Enable enhanced image search for the site
private static final boolean SAMPLE_ENHANCED_IMAGE_SEARCH = true;
// Sitemap type. Supported types include WEB, MOBILE, CODE, VIDEO, and NEWS.
// See http://code.google.com/apis/webmastertools/docs/developers_guide.html#Sitemaps
private static final String GENERAL_WEB_SITEMAP = "WEB";
/**
* Public empty constructor
*/
public WebmasterToolsClient() {
}
/**
* Creates the URL for the sites feed.
*
* @return URL of Webmaster Tools Sites feed.
* @throws IOException if the URL is malformed.
*/
private static URL getSitesFeedUrl() throws IOException {
try {
return new URL(FEED_URI_BASE + SITES_FEED_DIRECTORY);
} catch (MalformedURLException e) {
throw new IOException("URL for sites feed is malformed.");
}
}
/**
* Lists all sites in a user's Webmaster Tools account.
* Sites may be sorted randomly. Do not rely on the ordering of the sites.
*
* @param myService Authenticated WebmasterTools Service object
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if the URL is malformed.
*/
public static void printUserSites(WebmasterToolsService myService)
throws ServiceException, IOException {
try {
System.out.println("Printing user's sites:");
// Request the feed
URL feedUrl = getSitesFeedUrl();
SitesFeed sitesResultFeed = myService.getFeed(feedUrl, SitesFeed.class);
// Print the results
for (SitesEntry entry : sitesResultFeed.getEntries()) {
System.out.println("\t" + entry.getTitle().getPlainText());
}
} catch (MalformedURLException e) {
throw new IOException("URL for sites feed is malformed.");
}
}
/**
* Adds a new site for the given user.
*
* @param myService authenticated WebmasterTools Service object
* @param siteUrl URL of site to add to account
* @return a SitesEntry with the newly-created site
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if there was an error communicating with the server.
*/
public static SitesEntry insertSite(WebmasterToolsService myService,
String siteUrl) throws IOException, ServiceException {
SitesEntry entry = new SitesEntry();
OutOfLineContent content = new OutOfLineContent();
content.setUri(siteUrl);
entry.setContent(content);
System.out.println("Site: " + siteUrl + " now being added.");
return myService.insert(getSitesFeedUrl(), entry);
}
/**
* List verification options, currently filename and metatag values.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl URL of site to be verified.
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if there was an error communicating with the server.
*/
public static void listVerificationValues(WebmasterToolsService myService,
String siteUrl) throws IOException, ServiceException {
// Request the entry
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
URL feedUrl = new URL(getSitesFeedUrl() + siteId);
SitesEntry entry = myService.getEntry(feedUrl, SitesEntry.class);
// Print verification options
for (VerificationMethod method : entry.getVerificationMethods()) {
System.out.println("Verification method: " + method.getMethodType());
if (method.getMethodType() == VerificationMethod.MethodType.METATAG) {
System.out.println("Meta verification tag value: " + method.getValue());
} else if (
method.getMethodType() == VerificationMethod.MethodType.HTMLPAGE) {
System.out.println("HTML verification page is: " + method.getValue());
}
}
}
/**
* Submit site for verification. This example verifies through an
* HTML page. A webmaster may also verify through
* VerificationMethod.MethodType.METATAG.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl URL of site to be verified.
* @return a SitesEntry for the verified site.
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if there was an error communicating with the server.
*/
public static SitesEntry verifySite(WebmasterToolsService myService,
String siteUrl) throws IOException, ServiceException {
VerificationMethod method = new VerificationMethod();
method.setMethodType(VerificationMethod.MethodType.HTMLPAGE);
// Or method.setMethodType(VerificationMethod.MethodType.METATAG);
method.setInUse(true);
// Create the new SitesEntry to be verified
SitesEntry entry = new SitesEntry();
entry.addVerificationMethod(method);
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
System.out.println("Now verifying site: " + siteUrl);
URL updateUrl = new URL(getSitesFeedUrl() + siteId);
return myService.update(updateUrl, entry);
}
/**
* Print the settings for all sites in the feed. The sites have to be
* verified in order to be able to access settings information.
*
* @param myService authenticated WebmasterTools Service object.
* @throws IOException if the URL is malformed.
* @throws ServiceException if the service is unable to handle the request.
*/
public static void printSiteSettings(WebmasterToolsService myService)
throws IOException, ServiceException {
try {
System.out.println("Printing site settings:");
// Get the sites feed
URL feedUrl = getSitesFeedUrl();
SitesFeed sitesResultFeed = myService.getFeed(feedUrl, SitesFeed.class);
for (SitesEntry entry : sitesResultFeed.getEntries()) {
// Print site name and settings
System.out.println("\t" + entry.getTitle().getPlainText());
System.out.println("\t\tGeographic location:"
+ entry.getGeolocation());
System.out.println("\t\tDesired Crawl Rate:"
+ entry.getCrawlRate());
System.out.println("\t\tPreferred Domain Association:"
+ entry.getPreferredDomain());
System.out.println("\t\tEnhanced Image Search:"
+ entry.getEnhancedImageSearch());
}
} catch (MalformedURLException e) {
throw new IOException("URL for site URL is malformed.");
}
}
/**
* Update the settings for a site. The settings supported are
* geographic location, desired crawl rate, preferred domain and
* enhanced image search. Please update one setting at a time.
* Updating multiple settings at a time is not supported.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl is the URL of the site to update.
* @return a SitesEntry with the last updated site.
* @throws IOException if there was an error communicating with the server.
* @throws ServiceException if the service is unable to handle the request.
*/
public static SitesEntry updateSiteSettings(WebmasterToolsService myService,
String siteUrl) throws IOException, ServiceException {
System.out.println("Site: " + siteUrl);
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
URL updateUrl = new URL(getSitesFeedUrl() + siteId);
try {
// Update geographic location
System.out.println("Updating geographic location...");
SitesEntry entryUpdate = new SitesEntry();
entryUpdate.setGeolocation(SAMPLE_LOCATION);
myService.update(updateUrl, entryUpdate);
// Update desired crawl rate
System.out.println("Updating desired crawl rate...");
entryUpdate = new SitesEntry();
entryUpdate.setCrawlRate(SAMPLE_RATE);
myService.update(updateUrl, entryUpdate);
// Update preferred domain
System.out.println("Updating preferred domain...");
entryUpdate = new SitesEntry();
entryUpdate.setPreferredDomain(SAMPLE_PREFERRED_DOMAIN);
myService.update(updateUrl, entryUpdate);
// Update enhanced image search and return the last updated entry
System.out.println("Updating enhanced image search...");
entryUpdate = new SitesEntry();
entryUpdate.setEnhancedImageSearch(SAMPLE_ENHANCED_IMAGE_SEARCH);
return myService.update(updateUrl, entryUpdate);
} catch (ServiceException e) {
System.out.println("Please make sure that the site to update "
+ "contains a trailing forward slash");
throw(e);
}
}
/**
* Delete the site from the user's Webmaster Tools account.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl URL of site to delete from account.
* @throws IOException if there was an error communicating with the server.
* @throws ServiceException if the service is unable to handle the request.
*/
public static void deleteSite(WebmasterToolsService myService, String siteUrl)
throws IOException, ServiceException {
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
URL feedUrl = new URL(getSitesFeedUrl() + siteId);
SitesEntry entry = myService.getEntry(feedUrl, SitesEntry.class);
System.out.println("Now deleting site: " + siteUrl);
entry.delete();
}
/**
* Creates the URL for the sitemaps feed.
*
* @return URL of Webmaster Tools Sitemaps feed.
* @throws IOException if the URL is malformed.
*/
private static URL getSitemapsFeedUrl(String siteUrl) throws IOException {
try {
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
return new URL(FEED_URI_BASE + siteId + SITEMAPS_FEED_DIRECTORY);
} catch (MalformedURLException e) {
throw new IOException("URL for site URL is malformed.");
}
}
/**
* Prints all Sitemap URLs for a given site.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl URL of site to view existing Sitemaps.
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if the URL is malformed.
*/
public static void printUserSitemaps(WebmasterToolsService myService,
String siteUrl) throws ServiceException, IOException {
System.out.println("Printing user's Sitemaps:");
try {
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
// Request the feed
URL feedUrl = getSitemapsFeedUrl(siteUrl);
SitemapsFeed resultFeed = myService.getFeed(feedUrl, SitemapsFeed.class);
// Print the results
for(SitemapsEntry entry : resultFeed.getEntries()) {
System.out.println("\t" + entry.getTitle().getPlainText());
}
} catch (MalformedURLException e) {
throw new IOException("URL for site URL is malformed.");
}
}
/**
* Submit a Sitemap for the user's Webmaster Tools account.
*
* @param myService authenticated WebmasterTools Service object
* @param siteUrl URL of site hosting the Sitemap
* @param sitemapUrl is a Sitemap URL to submit. If the Sitemap has been
* added already, then this method results in resubmitting the Sitemap.
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if there was an error communicating with the server.
*/
public static SitemapsEntry insertSitemap(WebmasterToolsService myService,
String siteUrl, String sitemapUrl) throws IOException, ServiceException {
SitemapsRegularEntry entry = new SitemapsRegularEntry();
entry.setId(sitemapUrl);
entry.setSitemapType(GENERAL_WEB_SITEMAP);
System.out.println("Sitemap: " + sitemapUrl + " now being added.");
return myService.insert(getSitemapsFeedUrl(siteUrl), entry);
}
/**
* Delete the Sitemap from the user's Webmaster Tools account.
*
* @param myService authenticated WebmasterTools Service object.
* @param siteUrl site where the Sitemap is located
* (e.g. "http:/www.example.com/").
* @param sitemapUrl full path to Sitemap file.
* @throws ServiceException if the service is unable to handle the request.
* @throws IOException if there was an error communicating with the server.
*/
public static void deleteSitemap(WebmasterToolsService myService,
String siteUrl, String sitemapUrl) throws IOException, ServiceException {
String siteId = URLEncoder.encode(siteUrl, "UTF-8");
String sitemapId = URLEncoder.encode(sitemapUrl, "UTF-8");
URL feedUrl = new URL(getSitemapsFeedUrl(siteId) + sitemapId);
SitemapsRegularEntry entry
= myService.getEntry(feedUrl, SitemapsRegularEntry.class);
System.out.println("Now deleting Sitemap: " + sitemapUrl);
entry.delete();
}
/**
* Uses the command line arguments to authenticate with the WebmasterTools
* service, then invokes all the other methods to demonstrate how to use it.
*
* @param args See the usage method.
*/
public static void main(String[] args) {
// Get username and password from command-line arguments.
SimpleCommandLineParser parser = new SimpleCommandLineParser(args);
String userName = parser.getValue("username", "user", "u");
String userPassword = parser.getValue("password", "pass", "p");
boolean help = parser.containsKey("help", "h");
if (help || (userName == null) || (userPassword == null)) {
usage();
System.exit(1);
}
// Connect with the service and authenticate
WebmasterToolsService myService =
new WebmasterToolsService("exampleCo-exampleApp-1");
try {
myService.setUserCredentials(userName, userPassword);
} catch (AuthenticationException e) {
System.out.println("The username or password entered are not valid");
System.exit(1);
}
System.out.println("Running with user: " + userName);
// Run the example methods, list sites, insert, update, etc.
try {
runExamples(myService);
} catch (ServiceException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Sample run completed.");
}
/**
* Prints the command line usage of this sample application.
*/
private static void usage() {
System.out.println("Usage: WebmasterToolsClient --username <username>"
+ " --password <password>");
System.out.println("\nA simple application that lists sites, "
+ "and Sitemaps using the provided username and "
+ "password for authentication.");
}
/**
* Runs through many of the methods using the Webmaster Service instance.
* Users may comment or uncomment methods that they would like to run.
*
* @param myService an authenticated GoogleService 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 runExamples(WebmasterToolsService myService)
throws ServiceException, IOException {
printUserSites(myService);
insertSite(myService, SAMPLE_SITE);
printSiteSettings(myService);
listVerificationValues(myService, SAMPLE_SITE);
// After the verification process is done, for example by uploading
// the verification file to your server run this verification method
// verifySite(myService, SAMPLE_SITE);
// Uncomment to update the settings for the site once it is verified
// updateSiteSettings(myService, SAMPLE_SITE);
printUserSitemaps(myService, SAMPLE_SITE);
insertSitemap(myService, SAMPLE_SITE, SAMPLE_SITEMAP);
deleteSitemap(myService, SAMPLE_SITE, SAMPLE_SITEMAP);
deleteSite(myService, SAMPLE_SITE);
}
}