// Copyright 2016 Google Inc. All Rights Reserved.
//
// 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 adwords.axis.v201609.extensions;
import adwords.axis.v201609.basicoperations.AddCampaigns;
import com.google.api.ads.adwords.axis.factory.AdWordsServices;
import com.google.api.ads.adwords.axis.v201609.cm.AttributeFieldMapping;
import com.google.api.ads.adwords.axis.v201609.cm.CampaignFeed;
import com.google.api.ads.adwords.axis.v201609.cm.CampaignFeedOperation;
import com.google.api.ads.adwords.axis.v201609.cm.CampaignFeedReturnValue;
import com.google.api.ads.adwords.axis.v201609.cm.CampaignFeedServiceInterface;
import com.google.api.ads.adwords.axis.v201609.cm.Feed;
import com.google.api.ads.adwords.axis.v201609.cm.FeedAttribute;
import com.google.api.ads.adwords.axis.v201609.cm.FeedAttributeType;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItem;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItemAttributeValue;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItemGeoRestriction;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItemOperation;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItemReturnValue;
import com.google.api.ads.adwords.axis.v201609.cm.FeedItemServiceInterface;
import com.google.api.ads.adwords.axis.v201609.cm.FeedMapping;
import com.google.api.ads.adwords.axis.v201609.cm.FeedMappingOperation;
import com.google.api.ads.adwords.axis.v201609.cm.FeedMappingReturnValue;
import com.google.api.ads.adwords.axis.v201609.cm.FeedMappingServiceInterface;
import com.google.api.ads.adwords.axis.v201609.cm.FeedOperation;
import com.google.api.ads.adwords.axis.v201609.cm.FeedOrigin;
import com.google.api.ads.adwords.axis.v201609.cm.FeedReturnValue;
import com.google.api.ads.adwords.axis.v201609.cm.FeedServiceInterface;
import com.google.api.ads.adwords.axis.v201609.cm.Function;
import com.google.api.ads.adwords.axis.v201609.cm.GeoRestriction;
import com.google.api.ads.adwords.axis.v201609.cm.Location;
import com.google.api.ads.adwords.axis.v201609.cm.Operator;
import com.google.api.ads.adwords.lib.client.AdWordsSession;
import com.google.api.ads.common.lib.auth.OfflineCredentials;
import com.google.api.ads.common.lib.auth.OfflineCredentials.Api;
import com.google.api.client.auth.oauth2.Credential;
import com.google.common.base.Joiner;
import java.util.ArrayList;
import java.util.List;
/**
* This example adds a sitelinks feed and associates it with a campaign. To create a campaign,
* run {@link AddCampaigns}. To add sitelinks using the simpler ExtensionSetting services, see
* {@link AddSiteLinks}.
*
* <p>Credentials and properties in {@code fromFile()} are pulled from the
* "ads.properties" file. See README for more info.
*/
public class AddSiteLinksUsingFeeds {
public static void main(String[] args) throws Exception {
// Generate a refreshable OAuth2 credential.
Credential oAuth2Credential = new OfflineCredentials.Builder()
.forApi(Api.ADWORDS)
.fromFile()
.build()
.generateCredential();
// Construct an AdWordsSession.
AdWordsSession session = new AdWordsSession.Builder()
.fromFile()
.withOAuth2Credential(oAuth2Credential)
.build();
AdWordsServices adWordsServices = new AdWordsServices();
Long campaignId = Long.valueOf("INSERT_CAMPAIGN_ID_HERE");
String feedName = "INSERT_FEED_NAME_HERE";
runExample(adWordsServices, session, campaignId, feedName);
}
public static void runExample(AdWordsServices adWordsServices, AdWordsSession session,
Long campaignId, String feedName) throws Exception {
SiteLinksDataHolder siteLinksData = new SiteLinksDataHolder();
createSiteLinksFeed(adWordsServices, session, siteLinksData, feedName);
createSiteLinksFeedItems(adWordsServices, session, siteLinksData);
createSiteLinksFeedMapping(adWordsServices, session, siteLinksData);
createSiteLinksCampaignFeed(adWordsServices, session, siteLinksData, campaignId);
}
private static void createSiteLinksFeed(AdWordsServices adWordsServices, AdWordsSession session,
SiteLinksDataHolder siteLinksData, String feedName) throws Exception {
// Get the FeedService.
FeedServiceInterface feedService = adWordsServices.get(session, FeedServiceInterface.class);
// Create attributes.
FeedAttribute textAttribute = new FeedAttribute();
textAttribute.setType(FeedAttributeType.STRING);
textAttribute.setName("Link Text");
FeedAttribute finalUrlAttribute = new FeedAttribute();
finalUrlAttribute.setType(FeedAttributeType.URL_LIST);
finalUrlAttribute.setName("Link Final URLs");
FeedAttribute line2Attribute = new FeedAttribute();
line2Attribute.setType(FeedAttributeType.STRING);
line2Attribute.setName("Line 2");
FeedAttribute line3Attribute = new FeedAttribute();
line3Attribute.setType(FeedAttributeType.STRING);
line3Attribute.setName("Line 3");
// Create the feed.
Feed siteLinksFeed = new Feed();
siteLinksFeed.setName(feedName);
siteLinksFeed.setAttributes(
new FeedAttribute[] {textAttribute, finalUrlAttribute, line2Attribute, line3Attribute});
siteLinksFeed.setOrigin(FeedOrigin.USER);
// Create operation.
FeedOperation operation = new FeedOperation();
operation.setOperand(siteLinksFeed);
operation.setOperator(Operator.ADD);
// Add the feed.
FeedReturnValue result = feedService.mutate(new FeedOperation[] {operation});
Feed savedFeed = result.getValue()[0];
siteLinksData.siteLinksFeedId = savedFeed.getId();
FeedAttribute[] savedAttributes = savedFeed.getAttributes();
siteLinksData.linkTextFeedAttributeId = savedAttributes[0].getId();
siteLinksData.linkFinalUrlFeedAttributeId = savedAttributes[1].getId();
siteLinksData.line2FeedAttributeId = savedAttributes[2].getId();
siteLinksData.line3FeedAttributeId = savedAttributes[3].getId();
System.out.printf("Feed with name '%s' and ID %d with linkTextAttributeId %d"
+ " and linkFinalUrlAttributeId %d and line2AttributeId %d"
+ " and line3AttributeId %d was created.%n",
savedFeed.getName(),
savedFeed.getId(),
savedAttributes[0].getId(),
savedAttributes[1].getId(),
savedAttributes[2].getId(),
savedAttributes[3].getId());
}
private static void createSiteLinksFeedItems(AdWordsServices adWordsServices,
AdWordsSession session, SiteLinksDataHolder siteLinksData) throws Exception {
// Get the FeedItemService.
FeedItemServiceInterface feedItemService =
adWordsServices.get(session, FeedItemServiceInterface.class);
// Create operations to add FeedItems.
FeedItemOperation home = newSiteLinkFeedItemAddOperation(siteLinksData, "Home",
"http://www.example.com", "Home line 2", "Home line 3");
FeedItemOperation stores = newSiteLinkFeedItemAddOperation(siteLinksData, "Stores",
"http://www.example.com/stores", "Stores line 2", "Stores line 3");
FeedItemOperation onSale = newSiteLinkFeedItemAddOperation(siteLinksData, "On Sale",
"http://www.example.com/sale", "On Sale line 2", "On Sale line 3");
FeedItemOperation support = newSiteLinkFeedItemAddOperation(siteLinksData, "Support",
"http://www.example.com/support", "Support line 2", "Support line 3");
FeedItemOperation products = newSiteLinkFeedItemAddOperation(siteLinksData, "Products",
"http://www.example.com/prods", "Products line 2", "Products line 3");
// This site link is using geographical targeting by specifying the
// criterion ID for California.
FeedItemOperation aboutUs = newSiteLinkFeedItemAddOperation(siteLinksData, "About Us",
"http://www.example.com/about", "About Us line 2", "About Us line 3", 21137L);
FeedItemOperation[] operations =
new FeedItemOperation[] {home, stores, onSale, support, products, aboutUs};
FeedItemReturnValue result = feedItemService.mutate(operations);
for (FeedItem item : result.getValue()) {
System.out.printf("FeedItem with feedItemId %d was added.%n", item.getFeedItemId());
siteLinksData.siteLinkFeedItemIds.add(item.getFeedItemId());
}
}
// See the Placeholder reference page for a list of all the placeholder types and fields.
// https://developers.google.com/adwords/api/docs/appendix/placeholders
private static final int PLACEHOLDER_SITELINKS = 1;
// See the Placeholder reference page for a list of all the placeholder types and fields.
// https://developers.google.com/adwords/api/docs/appendix/placeholders
private static final int PLACEHOLDER_FIELD_SITELINK_LINK_TEXT = 1;
private static final int PLACEHOLDER_FIELD_SITELINK_FINAL_URL = 5;
private static final int PLACEHOLDER_FIELD_LINE_2_TEXT = 3;
private static final int PLACEHOLDER_FIELD_LINE_3_TEXT = 4;
private static void createSiteLinksFeedMapping(AdWordsServices adWordsServices,
AdWordsSession session, SiteLinksDataHolder siteLinksData) throws Exception {
// Get the FeedItemService.
FeedMappingServiceInterface feedMappingService =
adWordsServices.get(session, FeedMappingServiceInterface.class);
// Map the FeedAttributeIds to the fieldId constants.
AttributeFieldMapping linkTextFieldMapping = new AttributeFieldMapping();
linkTextFieldMapping.setFeedAttributeId(siteLinksData.linkTextFeedAttributeId);
linkTextFieldMapping.setFieldId(PLACEHOLDER_FIELD_SITELINK_LINK_TEXT);
AttributeFieldMapping linkFinalUrlFieldMapping = new AttributeFieldMapping();
linkFinalUrlFieldMapping.setFeedAttributeId(siteLinksData.linkFinalUrlFeedAttributeId);
linkFinalUrlFieldMapping.setFieldId(PLACEHOLDER_FIELD_SITELINK_FINAL_URL);
AttributeFieldMapping line2FieldMapping = new AttributeFieldMapping();
line2FieldMapping.setFeedAttributeId(siteLinksData.line2FeedAttributeId);
line2FieldMapping.setFieldId(PLACEHOLDER_FIELD_LINE_2_TEXT);
AttributeFieldMapping line3FieldMapping = new AttributeFieldMapping();
line3FieldMapping.setFeedAttributeId(siteLinksData.line3FeedAttributeId);
line3FieldMapping.setFieldId(PLACEHOLDER_FIELD_LINE_3_TEXT);
// Create the FeedMapping and operation.
FeedMapping feedMapping = new FeedMapping();
feedMapping.setPlaceholderType(PLACEHOLDER_SITELINKS);
feedMapping.setFeedId(siteLinksData.siteLinksFeedId);
feedMapping.setAttributeFieldMappings(new AttributeFieldMapping[] {linkTextFieldMapping,
linkFinalUrlFieldMapping, line2FieldMapping, line3FieldMapping});
FeedMappingOperation operation = new FeedMappingOperation();
operation.setOperand(feedMapping);
operation.setOperator(Operator.ADD);
// Save the field mapping.
FeedMappingReturnValue result =
feedMappingService.mutate(new FeedMappingOperation[] {operation});
for (FeedMapping savedFeedMapping : result.getValue()) {
System.out.printf(
"Feed mapping with ID %d and placeholderType %d was saved for feed with ID %d.%n",
savedFeedMapping.getFeedMappingId(), savedFeedMapping.getPlaceholderType(),
savedFeedMapping.getFeedId());
}
}
private static void createSiteLinksCampaignFeed(AdWordsServices adWordsServices,
AdWordsSession session, SiteLinksDataHolder siteLinksData, Long campaignId) throws Exception {
// Get the CampaignFeedService.
CampaignFeedServiceInterface campaignFeedService =
adWordsServices.get(session, CampaignFeedServiceInterface.class);
// Construct a matching function that associates the sitelink feed items to the campaign, and
// sets the device preference to mobile. See the matching function guide at
// https://developers.google.com/adwords/api/docs/guides/feed-matching-functions
// for more details.
String matchingFunctionString = String.format(
"AND( IN(FEED_ITEM_ID, {%s}), EQUALS(CONTEXT.DEVICE, 'Mobile') )",
Joiner.on(',').join(siteLinksData.siteLinkFeedItemIds));
CampaignFeed campaignFeed = new CampaignFeed();
campaignFeed.setFeedId(siteLinksData.siteLinksFeedId);
campaignFeed.setCampaignId(campaignId);
Function matchingFunction = new Function();
matchingFunction.setFunctionString(matchingFunctionString);
campaignFeed.setMatchingFunction(matchingFunction);
// Specifying placeholder types on the CampaignFeed allows the same feed
// to be used for different placeholders in different Campaigns.
campaignFeed.setPlaceholderTypes(new int[] {PLACEHOLDER_SITELINKS});
CampaignFeedOperation operation = new CampaignFeedOperation();
operation.setOperand(campaignFeed);
operation.setOperator(Operator.ADD);
CampaignFeedReturnValue result =
campaignFeedService.mutate(new CampaignFeedOperation[] {operation});
for (CampaignFeed savedCampaignFeed : result.getValue()) {
System.out.printf("Campaign with ID %d was associated with feed with ID %d.%n",
savedCampaignFeed.getCampaignId(), savedCampaignFeed.getFeedId());
}
}
private static FeedItemOperation newSiteLinkFeedItemAddOperation(
SiteLinksDataHolder siteLinksData, String text, String finalUrl, String line2, String line3) {
return newSiteLinkFeedItemAddOperation(siteLinksData, text, finalUrl, line2, line3, null);
}
private static FeedItemOperation newSiteLinkFeedItemAddOperation(
SiteLinksDataHolder siteLinksData, String text, String finalUrl, String line2, String line3,
Long locationId) {
// Create the FeedItemAttributeValues for our text values.
FeedItemAttributeValue linkTextAttributeValue = new FeedItemAttributeValue();
linkTextAttributeValue.setFeedAttributeId(siteLinksData.linkTextFeedAttributeId);
linkTextAttributeValue.setStringValue(text);
FeedItemAttributeValue linkFinalUrlAttributeValue = new FeedItemAttributeValue();
linkFinalUrlAttributeValue.setFeedAttributeId(siteLinksData.linkFinalUrlFeedAttributeId);
linkFinalUrlAttributeValue.setStringValues(new String[] {finalUrl});
FeedItemAttributeValue line2TextAttributeValue = new FeedItemAttributeValue();
line2TextAttributeValue.setFeedAttributeId(siteLinksData.line2FeedAttributeId);
line2TextAttributeValue.setStringValue(line2);
FeedItemAttributeValue line3TextAttributeValue = new FeedItemAttributeValue();
line3TextAttributeValue.setFeedAttributeId(siteLinksData.line3FeedAttributeId);
line3TextAttributeValue.setStringValue(line3);
// Create the feed item and operation.
FeedItem item = new FeedItem();
item.setFeedId(siteLinksData.siteLinksFeedId);
item.setAttributeValues(new FeedItemAttributeValue[] {linkTextAttributeValue,
linkFinalUrlAttributeValue, line2TextAttributeValue, line3TextAttributeValue});
// OPTIONAL: Use geographical targeting on a feed item.
// IDs can be found in the documentation or retrieved with the
// LocationCriterionService.
if (locationId != null) {
Location location = new Location();
location.setId(locationId);
item.setGeoTargeting(location);
// OPTIONAL: Restrict targeting only to people physically within the location.
FeedItemGeoRestriction geoTargetingRestriction = new FeedItemGeoRestriction();
geoTargetingRestriction.setGeoRestriction(GeoRestriction.LOCATION_OF_PRESENCE);
item.setGeoTargetingRestriction(geoTargetingRestriction);
}
// Optional: use item.setStartTime() and item.setEndTime() to specify the
// time period for the feed to deliver. The example below will make the feed
// start now and stop in one month.
// Make sure you specify the DateTime in the customer's time zone. You can
// retrieve this from customer.getDateTimeZone().
// item.setStartTime(new DateTime(customerTimeZone).toString("yyyyMMdd HHmmss"));
// item.setEndTime(new DateTime(customerTimeZone).plusMonths(1).toString("yyyyMMdd HHmmss"));
// Optional: use item.setScheduling() to specify time and days of the week for feed to deliver.
FeedItemOperation operation = new FeedItemOperation();
operation.setOperand(item);
operation.setOperator(Operator.ADD);
return operation;
}
private static class SiteLinksDataHolder {
private Long siteLinksFeedId;
private Long linkTextFeedAttributeId;
private Long linkFinalUrlFeedAttributeId;
private Long line2FeedAttributeId;
private Long line3FeedAttributeId;
private List<Long> siteLinkFeedItemIds = new ArrayList<Long>();
}
}