/// <summary>
        /// Create a feed that will sync to the Google My Business account
        /// specified by gmbEmailAddress.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="gmbEmailAddress">The GMB email address.</param>
        /// <param name="gmbAccessToken">The GMB access token.</param>
        /// <param name="businessAccountIdentifier">The GMB account identifier.</param>
        /// <returns>The newly created GMB feed.</returns>
        private static Feed CreateGmbFeed(AdWordsUser user, string gmbEmailAddress,
                                          string gmbAccessToken, string businessAccountIdentifier)
        {
            using (FeedService feedService = (FeedService)user.GetService(
                       AdWordsService.v201710.FeedService)) {
                // 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;

                // Optional: specify labels to filter Google My Business listings. If
                // specified, only listings that have any of the labels set are
                // synchronized into FeedItems.
                feedData.labelFilters = new string[] { "Stores in New York City" };

                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);
                    return(addedFeed);
                } catch (Exception e) {
                    throw new System.ApplicationException("Failed to create GMB feed.", e);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Deletes the enabled GMB feeds.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void DeleteEnabledGmbFeeds(AdWordsUser user)
        {
            FeedService feedService =
                (FeedService)user.GetService(AdWordsService.v201806.FeedService);

            List <Feed> feedsToDelete = new List <Feed>();
            string      query         =
                "Select Id, SystemFeedGenerationData, FeedStatus where FeedStatus=ENABLED";

            FeedPage page = feedService.query(query);

            for (int i = 0; i < page.entries.Length; i++)
            {
                Feed f = page.entries[i];
                PlacesLocationFeedData systemData =
                    (f.systemFeedGenerationData as PlacesLocationFeedData);
                if (systemData != null)
                {
                    feedsToDelete.Add(f);
                }
            }

            if (feedsToDelete.Count > 0)
            {
                List <FeedOperation> operations = new List <FeedOperation>();

                for (int i = 0; i < feedsToDelete.Count; i++)
                {
                    FeedOperation operation = new FeedOperation()
                    {
                        @operator = Operator.REMOVE,
                        operand   = new Feed()
                        {
                            id = feedsToDelete[i].id
                        }
                    };
                    operations.Add(operation);
                }

                feedService.mutate(operations.ToArray());
            }

            return;
        }
        /// <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);
            }
        }
        /// <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.v201601.FeedService);

              CustomerFeedService customerFeedService = (CustomerFeedService) user.GetService(
              AdWordsService.v201601.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;

              // Optional: specify labels to filter Google My Business listings. If
              // specified, only listings that have any of the labels set are
              // synchronized into FeedItems.
              feedData.labelFilters = new string[] { "Stores in New York City" };

              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);
              }
        }