Add Ads in Ruby

The following example shows how to create ads within an ad group using the Campaign Management AddAds service operation.

This example has been developed and run within the environment described in Getting Started Using Ruby with Bing Ads Services.

System_CLiX_note Note

This example uses the UserName and Password elements for authentication. For Managing User Authentication with OAuth, replace the UserName and Password elements with the AuthenticationToken, which is your OAuth access token.

require 'soap/wsdlDriver'
require 'soap/header/simplehandler'

NS_SHARED = "https://adcenter.microsoft.com/v8"

# This is a helper class that is used
# to construct the request header.
class RequestHeader < SOAP::Header::SimpleHandler
    def initialize (element, value)
        super(XSD::QName.new(NS_SHARED, element))
        @element = element
        @value   = value
    end

    def on_simple_outbound
        @value
    end
end

def AddAdsLib(
    username,
    password,
    devToken,
    customerId,
    accountId,
    adgroupId)

    # Create the WSDL driver reference to access the Web service.
    wsdl = SOAP::WSDLDriverFactory.new("https://api.sandbox.bingads.microsoft.com/Api/Advertiser/v8/CampaignManagement/CampaignManagementService.svc?wsdl")
    
    service = wsdl.create_rpc_driver
    
    # For SOAP debugging information,
    # uncomment the following statement.
    # service.wiredump_dev = STDERR

    # Set the request header information.
    service.headerhandler << RequestHeader.new('CustomerAccountId',
        "#{accountId}")
    service.headerhandler << RequestHeader.new('CustomerId',
        "#{customerId}")
    service.headerhandler << RequestHeader.new('DeveloperToken',
        "#{devToken}")
    service.headerhandler << RequestHeader.new('UserName',
        "#{username}")
    service.headerhandler << RequestHeader.new('Password',
        "#{password}")

    # Create a string literal that contains the SOAP request body.
    addadsrequest = %{
        <AddAdsRequest xmlns="https://adcenter.microsoft.com/v8">
            <AdGroupId>#{adgroupId}</AdGroupId>
                <Ads xmlns:i = "http://www.w3.org/2001/XMLSchema-instance">
                    <Ad i:type = "TextAd">
                        <EditorialStatus i:nil = "true"/>
                        <Id i:nil = "true"/>
                        <Status i:nil = "true"/>
                        <Type i:nil = "true"/>
                        <DestinationUrl>http://www.alpineskihouse.com/bingads</DestinationUrl>
                        <DisplayUrl>alpineskihouse.com</DisplayUrl>
                        <Text>Alpine Ski House has a great ski selection for you.</Text>
                        <Title>Alpine Ski House</Title>
                    </Ad>
                </Ads>
        </AddAdsRequest>
    }

    begin
        # Convert the string literal that contains
        # the SOAP request body to an XML document.
        request = REXML::Document.new(addadsrequest)

        # Perform the service operation.
        response = service.AddAds(request)

    # Exception handling.
    rescue SOAP::FaultError => fault
        detail = fault.detail

        # Capture any generic errors.
        if detail.respond_to?('adApiFaultDetail')

            # Get the AdApiFaultDetail object.
            adApiErrors = detail.adApiFaultDetail.errors.adApiError

            if !adApiErrors.respond_to?('each')
                adApiErrors = [adApiErrors]
            end

            adApiErrors.each do |error|
                print "Ad API error" \
                    " '#{error.message}' (#{error.code}) encountered.\n"
            end

        # Capture API exceptions.
        elsif detail.respond_to?('editorialApiFaultDetail')
            detail = detail.editorialApiFaultDetail

            # Display any editorial validation errors.
            if detail.editorialErrors.respond_to?('editorialError')
                editorialErrors = detail.editorialErrors.editorialError

                if !editorialErrors.respond_to?('each')
                    editorialErrors = [editorialErrors]
                end

                editorialErrors.each do |editError|
                    print "Editorial validation error." \
                        " Failed text: '#{editError.disapprovedText}'.\n"
                    print " Message: '#{editError.message}'.\n"
                    print " Code: '#{editError.code}'.\n"
                end
            end

            # Display any service operation errors.
            if detail.operationErrors.respond_to?('operationError')
                operationErrors = \
                    detail.operationErrors.operationError

                if !operationErrors.respond_to?('each')
                    operationErrors = [operationErrors]
                end
                  
                operationErrors.each do |opError|
                    print "Operation error" \
                        " '#{opError.message}' (#{opError.code}) encountered.\n"
                end
            end 

            # Display any batch error information.
            # The batchError.index property is the 
            # index to the ads array.
            if detail.batchErrors.respond_to?('batchError')
                batchErrors = detail.batchErrors.batchError

                if !batchErrors.respond_to?('each')
                    batchErrors = [batchErrors]
                end

                batchErrors.each do |batchError|
                    print "Batch error" \
                        " '#{batchError.message}' (#{batchError.code})" \
                        " encountered at array index = #{batchError.index}.\n"
                end
            end

        # Capture any generic SOAP exceptions.
        else
            print "Generic SOAP fault" \
                " '#{detail}' encountered. \n"
        end

    # Capture exceptions on the client that are unrelated to
    # the Bing Ads API. An example would be an 
    # out-of-memory condition on the client.
    rescue Exception => e
        puts "Error '#{e.exception.message}' encountered."
    end
end

begin
    AddAdsLib(
    "<usernamegoeshere>",
    "<passwordgoeshere>",
    "<devtokengoeshere>",
    <customeridgoeshere>,
    <accountidgoeshere>,
    <adgroupidgoeshere>)
end

Community Additions

Show: