Example #1
0
        /// <summary>
        /// Deletes the active GMB customer feeds.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void DeleteEnabledGmbCustomerFeeds(AdWordsUser user)
        {
            CustomerFeedService customerFeedService = (CustomerFeedService)user.GetService(
                AdWordsService.v201705.CustomerFeedService);

            string query = "Select FeedId, PlaceholderTypes where PlaceholderTypes CONTAINS_ANY["
                           + PLACEHOLDER_LOCATION + "] AND Status = ENABLED";

            List <CustomerFeedOperation> operations = new List <CustomerFeedOperation>();

            CustomerFeedPage page = customerFeedService.query(query);

            if (page != null && page.entries != null)
            {
                for (int i = 0; i < page.entries.Length; i++)
                {
                    CustomerFeed          customerFeed = page.entries[i];
                    CustomerFeedOperation operation    = new CustomerFeedOperation()
                    {
                        @operator = Operator.REMOVE,
                        operand   = customerFeed
                    };
                    operations.Add(operation);
                }
                customerFeedService.mutate(operations.ToArray());
            }
        }
        /// <summary>
        /// Creates a CustomerFeed that will associate the data holder's Feed with
        /// the ad customizer placeholder type.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="dataHolder">The data holder that contains metadata about
        /// the customizer Feed.</param>
        private static void CreateCustomerFeed(AdWordsUser user, CustomizersDataHolder dataHolder)
        {
            // Get the CustomerFeedService.
            CustomerFeedService customerFeedService = (CustomerFeedService)user.GetService(
                AdWordsService.v201406.CustomerFeedService);

            CustomerFeed customerFeed = new CustomerFeed();

            customerFeed.feedId           = dataHolder.FeedId;
            customerFeed.placeholderTypes = new int[] { PLACEHOLDER_AD_CUSTOMIZER };

            // Create a matching function that will always evaluate to true.
            Function        customerMatchingFunction = new Function();
            ConstantOperand constOperand             = new ConstantOperand();

            constOperand.type                   = ConstantOperandConstantType.BOOLEAN;
            constOperand.booleanValue           = true;
            customerMatchingFunction.lhsOperand = new FunctionArgumentOperand[] { constOperand };
            customerMatchingFunction.@operator  = FunctionOperator.IDENTITY;
            customerFeed.matchingFunction       = customerMatchingFunction;

            // Create an operation to add the customer feed.
            CustomerFeedOperation customerFeedOperation = new CustomerFeedOperation();

            customerFeedOperation.operand   = customerFeed;
            customerFeedOperation.@operator = Operator.ADD;

            CustomerFeed addedCustomerFeed = customerFeedService.mutate(
                new CustomerFeedOperation[] { customerFeedOperation }).value[0];

            Console.WriteLine("Customer feed for feed ID {0} was added.", addedCustomerFeed.feedId);
        }
        /// <summary>
        /// Add a CustomerFeed that associates the feed with this customer for
        /// the LOCATION placeholder type.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="feed">The GMB feed.</param>
        void AddCustomerFeed(AdWordsUser user, Feed feed)
        {
            using (CustomerFeedService customerFeedService = (CustomerFeedService)user.GetService(
                       AdWordsService.v201710.CustomerFeedService)) {
                // Add a CustomerFeed that associates the feed with this customer for
                // the LOCATION placeholder type.
                CustomerFeed customerFeed = new CustomerFeed();
                customerFeed.feedId           = feed.id;
                customerFeed.placeholderTypes = new int[] { PLACEHOLDER_LOCATION };

                // Create a matching function that will always evaluate to true.
                Function        customerMatchingFunction = new Function();
                ConstantOperand constOperand             = new ConstantOperand();
                constOperand.type                   = ConstantOperandConstantType.BOOLEAN;
                constOperand.booleanValue           = true;
                customerMatchingFunction.lhsOperand = new FunctionArgumentOperand[] { constOperand };
                customerMatchingFunction.@operator  = FunctionOperator.IDENTITY;
                customerFeed.matchingFunction       = customerMatchingFunction;

                // Create an operation to add the customer feed.
                CustomerFeedOperation customerFeedOperation = new CustomerFeedOperation();
                customerFeedOperation.operand   = customerFeed;
                customerFeedOperation.@operator = Operator.ADD;

                // After the completion of the Feed ADD operation above the added feed
                // will not be available for usage in a CustomerFeed until the sync
                // between the AdWords and GMB accounts completes.  The loop below
                // will retry adding the CustomerFeed up to ten times with an
                // exponential back-off policy.
                CustomerFeed addedCustomerFeed = null;

                AdWordsAppConfig config = new AdWordsAppConfig();
                config.RetryCount = 10;

                ErrorHandler errorHandler = new ErrorHandler(config);
                try {
                    do
                    {
                        try {
                            CustomerFeedReturnValue customerFeedResult =
                                customerFeedService.mutate(
                                    new CustomerFeedOperation[] { customerFeedOperation });
                            addedCustomerFeed = customerFeedResult.value[0];

                            Console.WriteLine("Added CustomerFeed for feed ID {0} and placeholder type {1}",
                                              addedCustomerFeed.feedId, addedCustomerFeed.placeholderTypes[0]);
                            break;
                        } catch (AdWordsApiException e) {
                            ApiException apiException = (ApiException)e.ApiException;
                            foreach (ApiError error in apiException.errors)
                            {
                                if (error is CustomerFeedError)
                                {
                                    if ((error as CustomerFeedError).reason ==
                                        CustomerFeedErrorReason.MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE)
                                    {
                                        errorHandler.DoExponentialBackoff();
                                        errorHandler.IncrementRetriedAttempts();
                                    }
                                    else
                                    {
                                        throw;
                                    }
                                }
                            }
                        }
                    } while (errorHandler.HaveMoreRetryAttemptsLeft());
                    // OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at
                    // the Campaign level.  This will be similar to the CampaignFeed in the
                    // AddSiteLinks example, except you can also filter based on the
                    // business name and category of each FeedItem by using a
                    // FeedAttributeOperand in your matching function.

                    // OPTIONAL: Create an AdGroupFeed for even more fine grained control
                    // over which feed items are used at the AdGroup level.
                } catch (Exception e) {
                    throw new System.ApplicationException("Failed to create customer feed.", e);
                }
            }
        }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="gmbEmailAddress">The email address for Google My Business
        /// account.</param>
        /// <param name="gmbAccessToken">The OAuth2 access token for Google
        /// My Business account.</param>
        /// <param name="businessAccountIdentifier">The account identifier for
        /// Google My Business account.</param>
        public void Run(AdWordsUser user, string gmbEmailAddress, string gmbAccessToken,
                        string businessAccountIdentifier)
        {
            FeedService feedService = (FeedService)user.GetService(AdWordsService.v201502.FeedService);

            CustomerFeedService customerFeedService = (CustomerFeedService)user.GetService(
                AdWordsService.v201502.CustomerFeedService);

            // Create a feed that will sync to the Google My Business account
            // specified by gmbEmailAddress. Do not add FeedAttributes to this object,
            // as AdWords will add them automatically because this will be a
            // system generated feed.
            Feed gmbFeed = new Feed();

            gmbFeed.name = String.Format("Google My Business feed #{0}",
                                         ExampleUtilities.GetRandomString());

            PlacesLocationFeedData feedData = new PlacesLocationFeedData();

            feedData.emailAddress = gmbEmailAddress;
            feedData.businessAccountIdentifier = businessAccountIdentifier;

            OAuthInfo oAuthInfo = new OAuthInfo();

            oAuthInfo.httpMethod = "GET";

            // Permissions for the AdWords API scope will also cover GMB.
            oAuthInfo.httpRequestUrl          = user.Config.GetDefaultOAuth2Scope();
            oAuthInfo.httpAuthorizationHeader = string.Format("Bearer {0}", gmbAccessToken);
            feedData.oAuthInfo = oAuthInfo;

            gmbFeed.systemFeedGenerationData = feedData;

            // Since this feed's feed items will be managed by AdWords,
            // you must set its origin to ADWORDS.
            gmbFeed.origin = FeedOrigin.ADWORDS;

            // Create an operation to add the feed.
            FeedOperation feedOperation = new FeedOperation();

            feedOperation.operand   = gmbFeed;
            feedOperation.@operator = Operator.ADD;

            try {
                // Add the feed. Since it is a system generated feed, AdWords will
                // automatically:
                // 1. Set up the FeedAttributes on the feed.
                // 2. Set up a FeedMapping that associates the FeedAttributes of the
                //    feed with the placeholder fields of the LOCATION placeholder
                //    type.
                FeedReturnValue addFeedResult = feedService.mutate(new FeedOperation[] { feedOperation });
                Feed            addedFeed     = addFeedResult.value[0];
                Console.WriteLine("Added GMB feed with ID {0}", addedFeed.id);

                // Add a CustomerFeed that associates the feed with this customer for
                // the LOCATION placeholder type.
                CustomerFeed customerFeed = new CustomerFeed();
                customerFeed.feedId           = addedFeed.id;
                customerFeed.placeholderTypes = new int[] { PLACEHOLDER_LOCATION };

                // Create a matching function that will always evaluate to true.
                Function        customerMatchingFunction = new Function();
                ConstantOperand constOperand             = new ConstantOperand();
                constOperand.type                   = ConstantOperandConstantType.BOOLEAN;
                constOperand.booleanValue           = true;
                customerMatchingFunction.lhsOperand = new FunctionArgumentOperand[] { constOperand };
                customerMatchingFunction.@operator  = FunctionOperator.IDENTITY;
                customerFeed.matchingFunction       = customerMatchingFunction;

                // Create an operation to add the customer feed.
                CustomerFeedOperation customerFeedOperation = new CustomerFeedOperation();
                customerFeedOperation.operand   = customerFeed;
                customerFeedOperation.@operator = Operator.ADD;

                // After the completion of the Feed ADD operation above the added feed
                // will not be available for usage in a CustomerFeed until the sync
                // between the AdWords and GMB accounts completes.  The loop below
                // will retry adding the CustomerFeed up to ten times with an
                // exponential back-off policy.
                CustomerFeed addedCustomerFeed = null;

                AdWordsAppConfig config = new AdWordsAppConfig();
                config.RetryCount = 10;

                ErrorHandler errorHandler = new ErrorHandler(config);
                do
                {
                    try {
                        CustomerFeedReturnValue customerFeedResult =
                            customerFeedService.mutate(new CustomerFeedOperation[] { customerFeedOperation });
                        addedCustomerFeed = customerFeedResult.value[0];

                        Console.WriteLine("Added CustomerFeed for feed ID {0} and placeholder type {1}",
                                          addedCustomerFeed.feedId, addedCustomerFeed.placeholderTypes[0]);
                        break;
                    } catch (AdWordsApiException e) {
                        ApiException apiException = (ApiException)e.ApiException;
                        foreach (ApiError error in apiException.errors)
                        {
                            if (error is CustomerFeedError)
                            {
                                if ((error as CustomerFeedError).reason ==
                                    CustomerFeedErrorReason.MISSING_FEEDMAPPING_FOR_PLACEHOLDER_TYPE)
                                {
                                    errorHandler.DoExponentialBackoff();
                                    errorHandler.IncrementRetriedAttempts();
                                }
                                else
                                {
                                    throw;
                                }
                            }
                        }
                    }
                } while (errorHandler.HaveMoreRetryAttemptsLeft());

                // OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at
                // the Campaign level.  This will be similar to the CampaignFeed in the
                // AddSiteLinks example, except you can also filter based on the
                // business name and category of each FeedItem by using a
                // FeedAttributeOperand in your matching function.

                // OPTIONAL: Create an AdGroupFeed for even more fine grained control
                // over which feed items are used at the AdGroup level.
            } catch (Exception e) {
                throw new System.ApplicationException("Failed to create customer feed.", e);
            }
        }