BingAds / BingAds-Python-SDK

Other
116 stars 162 forks source link

how do you specify one or more keyword statuses in KeywordStatusReportFilter? #125

Closed puerile22 closed 5 years ago

puerile22 commented 5 years ago

Trying to get a Keyword Performance Report with only Deleted and Paused keywords but I can't get the status report filter to work, thanks!

eric-urban commented 5 years ago

@puerile22

CORRECTED per discussion below..

I used this snippet, modified from this example:

aggregation = 'Daily'
exclude_column_headers=False
exclude_report_footer=False
exclude_report_header=False
time=reporting_service.factory.create('ReportTime')
# You can either use a custom date range or predefined time.
time.PredefinedTime='Yesterday'
time.ReportTimeZone='PacificTimeUSCanadaTijuana'
return_only_complete_data=False

report_request=reporting_service.factory.create('KeywordPerformanceReportRequest')
report_request.Aggregation=aggregation
report_request.ExcludeColumnHeaders=exclude_column_headers
report_request.ExcludeReportFooter=exclude_report_footer
report_request.ExcludeReportHeader=exclude_report_header
report_request.Format=report_file_format
report_request.ReturnOnlyCompleteData=return_only_complete_data
report_request.Time=time    
report_request.ReportName="My Keyword Performance Report"
scope=reporting_service.factory.create('AccountThroughAdGroupReportScope')
scope.AccountIds={'long': [account_id] }
scope.Campaigns=None
scope.AdGroups=None
report_request.Scope=scope     
filter=reporting_service.factory.create('KeywordPerformanceReportFilter')
filter.KeywordStatus=['Paused Deleted']
report_request.Filter=filter   

report_columns=reporting_service.factory.create('ArrayOfKeywordPerformanceReportColumn')
report_columns.KeywordPerformanceReportColumn.append([
    'TimePeriod',
    'AccountId',
    'CampaignId',
    'Keyword',
    'KeywordId',
    'DeviceType',
    'Network',
    'Impressions',
    'Clicks',  
    'Spend',
    'BidMatchType',              
    'Ctr',
    'AverageCpc',        
    'QualityScore'
])
report_request.Columns=report_columns

Here is the resulting SOAP request:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:tns="https://bingads.microsoft.com/Reporting/v13" xmlns:ns0="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="https://bingads.microsoft.com/Reporting/v13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <tns:AuthenticationToken>***</tns:AuthenticationToken>
    <tns:CustomerAccountId>***</tns:CustomerAccountId>
    <tns:CustomerId>***</tns:CustomerId>
    <tns:DeveloperToken>***</tns:DeveloperToken>
  </SOAP-ENV:Header>
  <ns1:Body>
    <ns2:SubmitGenerateReportRequest>
      <ns2:ReportRequest xsi:type="ns2:KeywordPerformanceReportRequest">
        <ns2:ExcludeColumnHeaders>false</ns2:ExcludeColumnHeaders>
        <ns2:ExcludeReportFooter>false</ns2:ExcludeReportFooter>
        <ns2:ExcludeReportHeader>false</ns2:ExcludeReportHeader>
        <ns2:Format>Csv</ns2:Format>
        <ns2:ReportName>My Keyword Performance Report</ns2:ReportName>
        <ns2:ReturnOnlyCompleteData>false</ns2:ReturnOnlyCompleteData>
        <ns2:Aggregation>Daily</ns2:Aggregation>
        <ns2:Columns>
          <ns2:KeywordPerformanceReportColumn>TimePeriod</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>AccountId</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>CampaignId</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Keyword</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>KeywordId</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>DeviceType</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Network</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Impressions</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Clicks</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Spend</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>BidMatchType</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>Ctr</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>AverageCpc</ns2:KeywordPerformanceReportColumn>
          <ns2:KeywordPerformanceReportColumn>QualityScore</ns2:KeywordPerformanceReportColumn>
        </ns2:Columns>
        <ns2:Filter>
          <ns2:KeywordStatus>Paused Deleted</ns2:KeywordStatus>
        </ns2:Filter>
        <ns2:Scope>
          <ns2:AccountIds>
            <ns0:long>***</ns0:long>
          </ns2:AccountIds>
        </ns2:Scope>
        <ns2:Time>
          <ns2:PredefinedTime>Yesterday</ns2:PredefinedTime>
          <ns2:ReportTimeZone>PacificTimeUSCanadaTijuana</ns2:ReportTimeZone>
        </ns2:Time>
      </ns2:ReportRequest>
    </ns2:SubmitGenerateReportRequest>
  </ns1:Body>
</SOAP-ENV:Envelope>
puerile22 commented 5 years ago

I tried the same thing, but it only gives me Paused keywords. And if I set filter.KeywordStatus=['Deleted','Paused'], it only gives me Deleted keywords. Then I tried filter.KeywordStatus='Paused Deleted', and I got both Pause and Deleted keywords back, not sure if this is a bug.

eric-urban commented 5 years ago

@puerile22 ah, yes your way i.e., filter.KeywordStatus='Paused Deleted' is correct. Sorry for the confusion. The service defines a list type so the filter XML should be as follows:

<ns2:Filter>
   <ns2:KeywordStatus>Paused Deleted</ns2:KeywordStatus>
</ns2:Filter>