Codebeispiel für reaktionsfähige Anzeigen

In diesem Beispiel wird veranschaulicht, wie Responsive Ads für das Microsoft Audience Network mithilfe des Kampagnenverwaltungsdiensts eingerichtet werden.

Tipp

Verwenden Sie die Sprachauswahl im Dokumentationsheader, um C#, Java, Php oder Python auszuwählen.

Informationen zum Abrufen von Zugriffs- und Aktualisierungstoken für Ihren Microsoft Advertising-Benutzer und Zum ersten Dienstaufruf mithilfe der Bing Ads-API finden Sie im Schnellstarthandbuch . Sie sollten den Leitfaden für die ersten Schritte und exemplarische Vorgehensweisen für Ihre bevorzugte Sprache lesen, z. B. C#, Java, Php und Python.

Unterstützende Dateien für C#-, Java-, Php- und Python-Beispiele sind auf GitHub verfügbar. Sie können jedes Repository klonen oder Codeausschnitte nach Bedarf erneut verwenden.

using System;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Threading.Tasks;
using Microsoft.BingAds.V13.CampaignManagement;
using Microsoft.BingAds;
using System.Drawing;

namespace BingAdsExamplesLibrary.V13
{
    /// <summary>
    /// How to create Responsive Ads with the Campaign Management service.
    /// </summary>
    public class ResponsiveAds : ExampleBase
    {
        // To run this example you'll need to provide your own image.  
        // For required aspect ratios and recommended dimensions please see 
        // Image remarks at https://go.microsoft.com/fwlink/?linkid=872754.

        private const string MediaFilePath = "c:\\dev\\media\\";
        private const string ResponsiveAdMediaFileName = "imageresponsivead1200x628.png";

        public override string Description
        {
            get { return "Responsive Ads | Campaign Management V13"; }
        }

        public async override Task RunAsync(AuthorizationData authorizationData)
        {
            try
            {
                ApiEnvironment environment = ((OAuthDesktopMobileAuthCodeGrant)authorizationData.Authentication).Environment;

                CampaignManagementExampleHelper CampaignManagementExampleHelper = new CampaignManagementExampleHelper(
                    OutputStatusMessageDefault: this.OutputStatusMessage);
                CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient<ICampaignManagementService>(
                    authorizationData: authorizationData,
                    environment: environment);

                // Add an image to your media library. 
                // The image asset is needed later to create the responsive ad.

                var landscapeImageMedia = GetImageMedia(
                    "Image191x100",
                    MediaFilePath + ResponsiveAdMediaFileName,
                    System.Drawing.Imaging.ImageFormat.Png);

                var media = new Media[]
                {
                    landscapeImageMedia,
                };

                OutputStatusMessage("-----\nAddMedia:");
                AddMediaResponse addMediaResponse = await CampaignManagementExampleHelper.AddMediaAsync(
                    accountId: authorizationData.AccountId,
                    media: media);
                long[] mediaIds = addMediaResponse.MediaIds.ToArray();
                OutputStatusMessage("MediaIds:");
                CampaignManagementExampleHelper.OutputArrayOfLong(mediaIds);
                
                // Create an Audience campaign with one ad group and a responsive ad.

                var campaigns = new[]{
                    new Campaign
                    {
                        BudgetType = BudgetLimitType.DailyBudgetStandard,
                        // CampaignType must be set for Audience campaigns
                        CampaignType = CampaignType.Audience,
                        DailyBudget = 50,
                        // Languages must be set for Audience campaigns
                        Languages = new string[] { "All" },
                        Name = "Everyone's Shoes " + DateTime.UtcNow,
                        TimeZone = "PacificTimeUSCanadaTijuana",
                    },
                };

                OutputStatusMessage("-----\nAddCampaigns:");
                AddCampaignsResponse addCampaignsResponse = await CampaignManagementExampleHelper.AddCampaignsAsync(
                    accountId: authorizationData.AccountId,
                    campaigns: campaigns);
                long?[] campaignIds = addCampaignsResponse.CampaignIds.ToArray();
                BatchError[] campaignErrors = addCampaignsResponse.PartialErrors.ToArray();
                OutputStatusMessage("CampaignIds:");
                CampaignManagementExampleHelper.OutputArrayOfLong(campaignIds);
                OutputStatusMessage("PartialErrors:");
                CampaignManagementExampleHelper.OutputArrayOfBatchError(campaignErrors);

                // Add an ad group within the campaign.

                var adGroups = new[] {
                    new AdGroup
                    {
                        Name = "Everyone's Red Shoe Sale",
                        StartDate = null,
                        EndDate = new Date {
                            Month = 12,
                            Day = 31,
                            Year = DateTime.UtcNow.Year + 1
                        },
                        CpcBid = new Bid { Amount = 0.09 },
                        // Network cannot be set for ad groups in Audience campaigns
                        Network = null,
                    }
                };

                OutputStatusMessage("-----\nAddAdGroups:");
                AddAdGroupsResponse addAdGroupsResponse = await CampaignManagementExampleHelper.AddAdGroupsAsync(
                    campaignId: (long)campaignIds[0],
                    adGroups: adGroups,
                    returnInheritedBidStrategyTypes: false);
                long?[] adGroupIds = addAdGroupsResponse.AdGroupIds.ToArray();
                BatchError[] adGroupErrors = addAdGroupsResponse.PartialErrors.ToArray();
                OutputStatusMessage("AdGroupIds:");
                CampaignManagementExampleHelper.OutputArrayOfLong(adGroupIds);
                OutputStatusMessage("PartialErrors:");
                CampaignManagementExampleHelper.OutputArrayOfBatchError(adGroupErrors);

                // Add a responsive ad within the ad group.

                var ads = new Ad[] {
                    new ResponsiveAd
                    {
                        BusinessName = "Contoso",
                        CallToAction = CallToAction.AddToCart,
                        FinalUrls = new[] {
                            "https://www.contoso.com/womenshoesale"
                        },
                        Headline = "Fast & Easy Setup",
                        Images = new []
                        {
                            // You are only required to provide a landscape image asset. 
                            // Optionally you can include additional asset links, i.e., one image asset for each supported sub type. 
                            // For any image asset sub types that you do not explicitly set, 
                            // the service will automatically create image asset links by cropping the LandscapeImageMedia.
                            new AssetLink
                            {
                                Asset = new ImageAsset
                                {
                                    CropHeight = null,
                                    CropWidth = null,
                                    CropX = null,
                                    CropY = null,
                                    Id = mediaIds[0],
                                    Name = "My LandscapeImageMedia",
                                    SubType = "LandscapeImageMedia", 
                                },
                            },                           
                        },
                        LongHeadlineString = "Find New Customers & Increase Sales!",
                        Text = "Find New Customers & Increase Sales! Start Advertising on Contoso Today.",
                    },
                };

                OutputStatusMessage("-----\nAddAds:");
                AddAdsResponse addAdsResponse = await CampaignManagementExampleHelper.AddAdsAsync(
                    adGroupId: (long)adGroupIds[0],
                    ads: ads);
                long?[] adIds = addAdsResponse.AdIds.ToArray();
                BatchError[] adErrors = addAdsResponse.PartialErrors.ToArray();
                OutputStatusMessage("AdIds:");
                CampaignManagementExampleHelper.OutputArrayOfLong(adIds);
                OutputStatusMessage("PartialErrors:");
                CampaignManagementExampleHelper.OutputArrayOfBatchError(adErrors);

                // Delete the account's media.

                OutputStatusMessage("-----\nDeleteMedia:");
                await CampaignManagementExampleHelper.DeleteMediaAsync(
                    accountId: authorizationData.AccountId,
                    mediaIds: mediaIds);

                foreach (var id in mediaIds)
                {
                    OutputStatusMessage(string.Format("Deleted Media Id {0}", id));
                }

                // Delete the campaign and everything it contains e.g., ad groups and ads.

                OutputStatusMessage("-----\nDeleteCampaigns:");
                await CampaignManagementExampleHelper.DeleteCampaignsAsync(
                    accountId: authorizationData.AccountId,
                    campaignIds: new[] { (long)campaignIds[0] });
                OutputStatusMessage(string.Format("Deleted Campaign Id {0}", campaignIds[0]));
            }
            // Catch authentication exceptions
            catch (OAuthTokenRequestException ex)
            {
                OutputStatusMessage(string.Format("Couldn't get OAuth tokens. Error: {0}. Description: {1}", ex.Details.Error, ex.Details.Description));
            }
            // Catch Campaign Management service exceptions
            catch (FaultException<Microsoft.BingAds.V13.CampaignManagement.AdApiFaultDetail> ex)
            {
                OutputStatusMessage(string.Join("; ", ex.Detail.Errors.Select(error => string.Format("{0}: {1}", error.Code, error.Message))));
            }
            catch (FaultException<Microsoft.BingAds.V13.CampaignManagement.ApiFaultDetail> ex)
            {
                OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message))));
                OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message))));
            }
            catch (FaultException<Microsoft.BingAds.V13.CampaignManagement.EditorialApiFaultDetail> ex)
            {
                OutputStatusMessage(string.Join("; ", ex.Detail.OperationErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message))));
                OutputStatusMessage(string.Join("; ", ex.Detail.BatchErrors.Select(error => string.Format("{0}: {1}", error.Code, error.Message))));
            }
            catch (Exception ex)
            {
                OutputStatusMessage(ex.Message);
            }
        }

        /// <summary>
        /// Get image media that can be created via the 
        /// Campaign Management API.
        /// </summary>
        /// <param name="mediaType">The media type reflects the aspect ratio.</param>
        /// <param name="imageFileName">The file name and path.</param>
        /// <param name="imageFormat">For supported image formats see <see href="https://go.microsoft.com/fwlink/?linkid=872754">Image remarks</see>.</param>
        /// <returns>A Campaign Management Image object.</returns>
        private Microsoft.BingAds.V13.CampaignManagement.Image GetImageMedia(
            string mediaType,
            string imageFileName,
            System.Drawing.Imaging.ImageFormat imageFormat)
        {
            var image = new Microsoft.BingAds.V13.CampaignManagement.Image();
            image.Data = GetBmpBase64String(imageFileName, imageFormat);
            image.MediaType = mediaType;
            image.Type = "Image";

            return image;
        }

        /// <summary>
        /// Get the image media as base64 string.
        /// </summary>
        /// <param name="imageFileName">The file name and path.</param>
        /// <param name="imageFormat">For supported image formats see <see href="https://go.microsoft.com/fwlink/?linkid=872754">Image remarks</see>.</param>
        /// <returns></returns>
        private string GetBmpBase64String(
            string imageFileName,
            System.Drawing.Imaging.ImageFormat imageFormat)
        {
            var bmp = new Bitmap(imageFileName);
            using (MemoryStream ms = new MemoryStream())
            {
                bmp.Save(ms, imageFormat);
                byte[] imageBytes = ms.ToArray();
                string base64String = Convert.ToBase64String(imageBytes);
                return base64String;
            }
        }
    }
}
package com.microsoft.bingads.examples.v13;

import com.microsoft.bingads.*;
import com.microsoft.bingads.v13.campaignmanagement.*;

import java.util.ArrayList;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.util.Base64;
import java.util.Calendar;

public class ResponsiveAds extends ExampleBase {

    public static void main(java.lang.String[] args) {
    
        // To run this example you'll need to provide your own image.  
        // For required aspect ratios and recommended dimensions please see 
        // Image remarks at https://go.microsoft.com/fwlink/?linkid=872754.
        
        java.lang.String MEDIA_FILE_PATH = "c:\\dev\\media\\";
        java.lang.String RESPONSIVE_AD_MEDIA_FILE_NAME = "imageresponsivead1200x628.png";
        
        try
        {
            authorizationData = getAuthorizationData();
             
            CampaignManagementExampleHelper.CampaignManagementService = new ServiceClient<ICampaignManagementService>(
                authorizationData, 
                API_ENVIRONMENT,
                ICampaignManagementService.class);

            // Add an image to your media library. 
            // The image asset is needed later to create the responsive ad.
            
            Image landscapeImageMedia = getImageMedia("Image191x100",
                MEDIA_FILE_PATH + RESPONSIVE_AD_MEDIA_FILE_NAME);

            ArrayOfMedia addMedia = new ArrayOfMedia();
            addMedia.getMedias().add(landscapeImageMedia);
            CampaignManagementExampleHelper.outputArrayOfMedia(addMedia);

            outputStatusMessage("-----\nAddMedia:");
            ArrayOflong mediaIds = CampaignManagementExampleHelper.addMedia(
                authorizationData.getAccountId(),
                addMedia).getMediaIds();
            outputStatusMessage("MediaIds:");
            CampaignManagementExampleHelper.outputArrayOflong(mediaIds);
            
            // Create an Audience campaign with one ad group and a responsive ad.
                        
            ArrayOfCampaign campaigns = new ArrayOfCampaign();
            Campaign campaign = new Campaign();
            campaign.setBudgetType(BudgetLimitType.DAILY_BUDGET_STANDARD);
            // CampaignType must be set for Audience campaigns
            ArrayList<CampaignType> campaignTypes = new ArrayList<CampaignType>();
            campaignTypes.add(CampaignType.AUDIENCE);
            campaign.setCampaignType(campaignTypes);
            campaign.setDailyBudget(50.00);
            ArrayOfstring languages = new ArrayOfstring();
            languages.getStrings().add("All");
            campaign.setLanguages(languages);
            campaign.setName("Everyone's Shoes " + System.currentTimeMillis());
            campaign.setTimeZone("PacificTimeUSCanadaTijuana");
            campaigns.getCampaigns().add(campaign);

            outputStatusMessage("-----\nAddCampaigns:");
            AddCampaignsResponse addCampaignsResponse = CampaignManagementExampleHelper.addCampaigns(
                    authorizationData.getAccountId(), 
                    campaigns);            
            ArrayOfNullableOflong campaignIds = addCampaignsResponse.getCampaignIds();
            ArrayOfBatchError campaignErrors = addCampaignsResponse.getPartialErrors();
            outputStatusMessage("CampaignIds:");
            CampaignManagementExampleHelper.outputArrayOfNullableOflong(campaignIds);
            outputStatusMessage("PartialErrors:");
            CampaignManagementExampleHelper.outputArrayOfBatchError(campaignErrors);

            // Add an ad group within the campaign.
            
            ArrayOfAdGroup adGroups = new ArrayOfAdGroup();
            AdGroup adGroup = new AdGroup();
            adGroup.setName("Everyone's Red Shoe Sale");
            adGroup.setStartDate(null);
            Calendar calendar = Calendar.getInstance();
            adGroup.setEndDate(new com.microsoft.bingads.v13.campaignmanagement.Date());
            adGroup.getEndDate().setDay(31);
            adGroup.getEndDate().setMonth(12);
            adGroup.getEndDate().setYear(calendar.get(Calendar.YEAR));
            Bid CpcBid = new Bid();
            CpcBid.setAmount(0.09);
            adGroup.setCpcBid(CpcBid);
            // Network cannot be set for ad groups in Audience campaigns
            adGroup.setNetwork(null);
            adGroups.getAdGroups().add(adGroup);
            
            outputStatusMessage("-----\nAddAdGroups:");
            AddAdGroupsResponse addAdGroupsResponse = CampaignManagementExampleHelper.addAdGroups(
                    campaignIds.getLongs().get(0), 
                    adGroups, 
                    false);
            ArrayOfNullableOflong adGroupIds = addAdGroupsResponse.getAdGroupIds();
            ArrayOfBatchError adGroupErrors = addAdGroupsResponse.getPartialErrors();
            outputStatusMessage("AdGroupIds:");
            CampaignManagementExampleHelper.outputArrayOfNullableOflong(adGroupIds);
            outputStatusMessage("PartialErrors:");
            CampaignManagementExampleHelper.outputArrayOfBatchError(adGroupErrors);

            // Add a responsive ad within the ad group.
            
            ArrayOfAd ads = new ArrayOfAd();
            ResponsiveAd responsiveAd = new ResponsiveAd();
            responsiveAd.setBusinessName("Contoso");
            responsiveAd.setCallToAction(CallToAction.ADD_TO_CART);  
            ArrayOfstring finalUrls = new ArrayOfstring();
            finalUrls.getStrings().add("https://www.contoso.com/womenshoesale");
            responsiveAd.setFinalUrls(finalUrls);
            responsiveAd.setHeadline("Fast & Easy Setup");
            // You are only required to provide a landscape image asset. 
            // Optionally you can include additional asset links, i.e., one image asset for each supported sub type. 
            // For any image asset sub types that you do not explicitly set, 
            // the service will automatically create image asset links by cropping the LandscapeImageMedia.
            ArrayOfAssetLink assetLinks = new ArrayOfAssetLink();
            AssetLink assetLink = new AssetLink();
            ImageAsset imageAsset = new ImageAsset();
            imageAsset.setCropHeight(null);
            imageAsset.setCropWidth(null);
            imageAsset.setCropX(null);
            imageAsset.setCropY(null);
            imageAsset.setId(mediaIds.getLongs().get(0));
            imageAsset.setName("My LandscapeImageMedia");
            imageAsset.setSubType("LandscapeImageMedia");            
            assetLink.setAsset(imageAsset);
            assetLinks.getAssetLinks().add(assetLink);
            responsiveAd.setImages(assetLinks);
            responsiveAd.setLongHeadlineString("Find New Customers & Increase Sales!");
            responsiveAd.setText("Find New Customers & Increase Sales! Start Advertising on Contoso Today.");
            ads.getAds().add(responsiveAd);
            
            outputStatusMessage("-----\nAddAds:");
            AddAdsResponse addAdsResponse = CampaignManagementExampleHelper.addAds(
                    adGroupIds.getLongs().get(0), 
                    ads);
            ArrayOfNullableOflong adIds = addAdsResponse.getAdIds();
            ArrayOfBatchError adErrors = addAdsResponse.getPartialErrors();
            outputStatusMessage("AdIds:");
            CampaignManagementExampleHelper.outputArrayOfNullableOflong(adIds);
            outputStatusMessage("PartialErrors:");
            CampaignManagementExampleHelper.outputArrayOfBatchError(adErrors);
            
            // Delete the account's media.

            outputStatusMessage("-----\nDeleteMedia:");
            CampaignManagementExampleHelper.deleteMedia(
                    authorizationData.getAccountId(), 
                    mediaIds);

            for (java.lang.Long id : mediaIds.getLongs())
            {
                outputStatusMessage(String.format("Deleted Media Id %s", id));
            }
            
            // Delete the campaign and everything it contains e.g., ad groups and ads.

            outputStatusMessage("-----\nDeleteCampaigns:");
            ArrayOflong deleteCampaignIds = new ArrayOflong();
            deleteCampaignIds.getLongs().add(campaignIds.getLongs().get(0));
            CampaignManagementExampleHelper.deleteCampaigns(
                    authorizationData.getAccountId(), 
                    deleteCampaignIds);
            outputStatusMessage(String.format("Deleted CampaignId %d", deleteCampaignIds.getLongs().get(0))); 
        } 
        catch (Exception ex) {
            String faultXml = ExampleExceptionHelper.getBingAdsExceptionFaultXml(ex, System.out);
            outputStatusMessage(faultXml);
            String message = ExampleExceptionHelper.handleBingAdsSDKException(ex, System.out);
            outputStatusMessage(message);
        }
    }
    
    // Get image media that can be managed with the Campaign Management API.

    static Image getImageMedia(
        java.lang.String mediaType, 
        java.lang.String imageFileName) throws UnsupportedEncodingException, IOException
    {
        Image image = new Image();
        image.setData(getBmpBase64String(imageFileName));
        image.setMediaType(mediaType);
        image.setType("Image");

        return image;
    }

    // Get the image media as base64 string.

    static java.lang.String getBmpBase64String(
        java.lang.String imageFileName) throws UnsupportedEncodingException, IOException
    {
        File fi = new File(imageFileName);
        byte[] imageBytes = Files.readAllBytes(fi.toPath());
        java.lang.String base64String = new java.lang.String(Base64.getEncoder().encode(imageBytes), "UTF-8");
        return base64String;
    }
 }
<?php

namespace Microsoft\MsAds\Rest\Test\Services;

use Exception;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\AddMediaRequest;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\AdGroup;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\Bid;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\BudgetLimitType;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\Campaign;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\CampaignType;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\Date;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\DeleteMediaRequest;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\LanguageName;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\ResponsiveAd;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\CallToAction;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\AssetLink;
use Microsoft\MsAds\Rest\Model\CampaignManagementService\ImageAsset;
use Microsoft\MsAds\Rest\Test\RestApiTestBase;

class ResponsiveAdsTest extends RestApiTestBase
{
    protected string $mediaFilePath = "c:\\dev\\media\\";
    protected string $responsiveAdMediaFileName = "imageresponsivead703x368.png";

    /**
     * Add an image to your media library.
     * The image asset is needed later to create the responsive ad.
     * @throws Exception
     */
    public function testAddMedia()
    {
        print("-----\r\nAdding Media:\r\n");

        $responsiveAdImageMedia = $this->getImageMedia(
            "Image191x100",
            $this->mediaFilePath.$this->responsiveAdMediaFileName
        );

        $request = new AddMediaRequest([
            'AccountId' => self::CUSTOMER_ACCOUNT_ID,
            'Media' => [$responsiveAdImageMedia],
        ]);

        $response = self::$campaignManagementServiceApi->addMedia($request);
        $mediaIds = $response->getMediaIds();
        print("MediaIds:\r\n");
        print_r($mediaIds);
        self::assertNotEmpty($mediaIds);

        return $mediaIds;
    }

    /**
     * @depends testAddMedia
     * @throws Exception
     */
    public function testAddCampaign()
    {
        $campaign = (new Campaign())
            ->setName("Women's Shoes ".self::generateRandomAlphaNumeric())
            ->setCampaignType(CampaignType::AUDIENCE)
            ->setBudgetType(BudgetLimitType::DAILY_BUDGET_STANDARD)
            ->setDailyBudget(50.00)
            ->setLanguages(["All"])
            ->setTimeZone("PacificTimeUSCanadaTijuana");
        return self::addCampaignsRequest([$campaign]);
    }

    /**
     * @depends testAddCampaign
     * @throws Exception
     */
    public function testAddAdGroup(array $campaignIds)
    {
        $adGroup = (new AdGroup())
            ->setName("Women's Red Shoe Sale".self::generateRandomAlphaNumeric())
            ->setCpcBid((new Bid())->setAmount(0.09))
            ->setStartDate(null)
            ->setEndDate((new Date())->setDay(31)->setMonth(12)->setYear(date("Y")));
        return self::addAdGroupsRequest($campaignIds[0], [$adGroup]);
    }

    /**
     * @depends testAddAdGroup
     * @depends testAddMedia
     * @throws Exception
     */
    public function testAddResponsiveAd(array $adGroupIds, array $mediaIds)
    {
        print("-----\r\nAdding Responsive Ad:\r\n");

        $responsiveAd = (new ResponsiveAd())
            ->setBusinessName("Contoso")
            ->setCallToAction(CallToAction::ACT_NOW)
            ->setCallToActionLanguage(LanguageName::ENGLISH)
            ->setFinalUrls(["http://www.contoso.com/womenshoesale"])
            ->setHeadline("Fast & Easy Setup")
            ->setLongHeadlineString("Find New Customers & Increase Sales!")
            ->setText("Find New Customers & Increase Sales! Start Advertising on Contoso Today.")
            ->setImages([
                (new AssetLink())->setAsset(
                    (new ImageAsset())
                        ->setId($mediaIds[0]) // Replace with actual media ID
                        ->setName("My LandscapeImageMedia".self::generateRandomAlphaNumeric())
                        ->setSubType("LandscapeImageMedia")
                )
            ]);
        self::addAdsRequest($adGroupIds[0], [$responsiveAd]);
    }

    /**
     * @depends testAddCampaign
     * @throws Exception
     */
    public function testDeleteCampaign(array $campaignIds)
    {
        self::deleteCampaignsRequest($campaignIds);
    }

    /**
     * @depends testAddMedia
     * @throws Exception
     */
    public function testDeleteMedia(array $mediaIds)
    {
        // Can only delete media that is not in use.
        print("-----\r\nDeleteMedia:\r\n");
        $request = new DeleteMediaRequest([
            'AccountId' => self::CUSTOMER_ACCOUNT_ID,
            'MediaIds' => $mediaIds
        ]);
        $response = self::$campaignManagementServiceApi->deleteMedia($request);
        print("PartialErrors:\r\n");
        print_r($response->getPartialErrors());
        self::assertEmpty($response->getPartialErrors());
        print("Deleted Media ids: ".implode(", ", $mediaIds)."\r\n");
    }
}
import base64
import uuid

from auth_helper import *
from openapi_client.models.campaign import *


def main(authorization_data):
    try:
        ad_final_url = "https://contoso.com"
        final_urls = [ad_final_url]
        create_responsive_ad_recommendation_request = CreateResponsiveAdRecommendationRequest(
            final_urls=final_urls
        )

        responsive_ad_recommendation_response = campaign_service.create_responsive_ad_recommendation(
            create_responsive_ad_recommendation_request=create_responsive_ad_recommendation_request
        )

        responsive_ad = responsive_ad_recommendation_response.ResponsiveAd
        image_suggestions = responsive_ad_recommendation_response.ImageSuggestions

        # Select a few images from the suggested list. This example picks first 5 images
        selected_images = image_suggestions[:5]

        # Add selected images to your media library
        save_images(selected_images)

        images = [obj.AssetLink for obj in selected_images]
        responsive_ad.Images = images
        responsive_ad.BusinessName = "Contoso"
        responsive_ad.CallToActionLanguage = LanguageName.ENGLISH

        # Create an Audience campaign with one ad group and a responsive ad
        campaign = Campaign()
        campaign.BudgetType = BudgetLimitType.DAILYBUDGETACCELERATED
        # CampaignType must be set for Audience campaigns
        campaign.CampaignType = CampaignType.AUDIENCE
        campaign.DailyBudget = 50.00
        campaign.Languages = ['All']
        campaign.Name = "Ad recommendation test " + str(uuid.uuid4())
        campaign.TimeZone = 'PacificTimeUSCanadaTijuana'
        campaigns = [campaign]

        add_campaigns_request = AddCampaignsRequest(
            account_id=authorization_data.account_id,
            campaigns=campaigns,
        )

        add_campaigns_response = campaign_service.add_campaigns(
            add_campaigns_request=add_campaigns_request
        )
        campaign_ids = add_campaigns_response.CampaignIds

        # Add an ad group within the campaign.
        ad_group = AdGroup()
        ad_group.Name = "Holiday Sale"
        ad_group.StartDate = None
        end_date = Date()
        end_date.Day = 31
        end_date.Month = 12
        current_time = gmtime()
        end_date.Year = current_time.tm_year
        ad_group.EndDate = end_date
        cpc_bid = Bid()
        cpc_bid.Amount = 0.09
        ad_group.CpcBid = cpc_bid
        # Network cannot be set for ad groups in Audience campaigns
        ad_group.Network = None
        ad_groups = [ad_group]

        add_ad_groups_request = AddAdGroupsRequest(
            campaign_id=campaign_ids[0],
            ad_groups=ad_groups
        )

        add_ad_groups_response = campaign_service.add_ad_groups(
            add_ad_groups_request=add_ad_groups_request
        )
        ad_group_ids = add_ad_groups_response.AdGroupIds

        # Add a responsive ad within the ad group
        ads = [responsive_ad]
        add_ads_request = AddAdsRequest(
            ad_group_id=ad_group_ids[0],
            ads=ads
        )

        add_ads_response = campaign_service.add_ads(
            add_ads_request=add_ads_request
        )
        ad_ids = add_ads_response.AdIds

        # Clean up
        media_ids = [obj.Asset.Id for obj in responsive_ad.Images]
        delete_media_request = DeleteMediaRequest(
            account_id=authorization_data.account_id,
            media_ids=media_ids
        )

        campaign_service.delete_media(
            delete_media_request=delete_media_request
        )

        delete_campaigns_request = DeleteCampaignsRequest(
            account_id=authorization_data.account_id,
            campaign_ids=campaign_ids
        )

        campaign_service.delete_campaigns(
            delete_campaigns_request=delete_campaigns_request
        )

    except Exception as ex:
        print(f"Error occurred: {str(ex)}")


def download_bytes(url):
    """Download bytes from a URL using streaming."""
    response = requests.get(url, stream=True)
    response.raise_for_status()

    output_stream = bytearray()
    for chunk in response.iter_content(chunk_size=4096):
        if chunk:
            output_stream.extend(chunk)
    return bytes(output_stream)


def save_images(image_suggestions):
    """Save image suggestions to the media library."""
    medias_to_add = []
    for item in image_suggestions:
        image = item.Image
        image_bytes = download_bytes(item.ImageUrl)
        image_base64 = base64.b64encode(image_bytes).decode('utf-8')
        image.Data = image_base64
        media = image
        medias_to_add.append(media)

    add_media_request = AddMediaRequest(
        account_id=authorization_data.account_id,
        media=medias_to_add
    )

    add_media_response = campaign_service.add_media(
        add_media_request=add_media_request
    )
    media_ids = add_media_response.media_ids

    for i in range(len(media_ids)):
        image_suggestions[i].AssetLink.Asset.id = str(media_ids[i])

    return image_suggestions


if __name__ == '__main__':
    print("Loading the web service client...")

    authorization_data = AuthorizationData(
        account_id=None,
        customer_id=None,
        developer_token=DEVELOPER_TOKEN,
        authentication=None,
    )

    authenticate(authorization_data)

    campaign_service = ServiceClient(
        service='CampaignManagementService',
        version=13,
        authorization_data=authorization_data,
        environment=ENVIRONMENT,
    )

    main(authorization_data)

Siehe auch

Erste Schritte mit der Bing Ads-API