BingAds / BingAds-Python-SDK

Other
116 stars 162 forks source link

Download report issue with example code #90

Closed dilshadx closed 6 years ago

dilshadx commented 6 years ago

Hi Below is my code for download campaign report.

download.py

from authenticator import *
from bingads.v12.reporting import *
FILE_DIRECTORY='/home/mohammaddilshad/feed_dowloader/bing/feeds'
DOWNLOAD_FILE_NAME='download.csv'
REPORT_FILE_FORMAT='csv'

# The maximum amount of time (in milliseconds) that you want to wait for the report download.
TIMEOUT_IN_MILLISECONDS=3600000
ENVIRONMENT='production'

def main(authorization_data):

    try:
        report_request = get_campaign_performance_report_request(None)

        reporting_download_parameters = ReportingDownloadParameters(
            report_request=report_request,
            result_file_directory=FILE_DIRECTORY,
            result_file_name=DOWNLOAD_FILE_NAME,
            overwrite_result_file=True,  # Set this value true if you want to overwrite the same file.
            timeout_in_milliseconds=TIMEOUT_IN_MILLISECONDS

        )

        print("Awaiting Background Completion . . .")
        background_completion(reporting_download_parameters)

    except Exception as ex:
        print ex

def get_campaign_performance_report_request(campaign_ids):
    '''
    Build a campaign performance report request, including Format, ReportName,
    Time, and Columns.
    '''
    report_request=reporting_service.factory.create('CampaignPerformanceReportRequest')
    report_request.Format=REPORT_FILE_FORMAT
    report_request.ReportName='My Campaign Performance Report'
    report_request.ReturnOnlyCompleteData=False
    report_request.Aggregation='Daily'
    report_request.Language='English'

    scope=reporting_service.factory.create('AccountThroughCampaignReportScope')
    if campaign_ids is None:
        scope.AccountIds={'long': [authorization_data.account_id] }
        scope.Campaigns=None
    else:
        scope.AccountIds=None
        campaigns=reporting_service.factory.create('ArrayOfCampaignReportScope')
        for campaign_id in campaign_ids['long']:
            campaign_report_scope=reporting_service.factory.create('CampaignReportScope')
            campaign_report_scope.AccountId=authorization_data.account_id
            campaign_report_scope.CampaignId=campaign_id
            campaigns.CampaignReportScope.append(campaign_report_scope)
        scope.Campaigns=campaigns
    report_request.Scope=scope

    # You may either use a custom date range or predefined time.
    report_time=reporting_service.factory.create('ReportTime')
    report_time.PredefinedTime='2018-06-01'
    report_time.ReportTimeZone='PacificTimeUSCanadaTijuana'
    report_request.Time=report_time

    # Specify the attribute and data report columns.

    report_columns=reporting_service.factory.create('ArrayOfCampaignPerformanceReportColumn')
    report_columns.CampaignPerformanceReportColumn.append([
        'TimePeriod',
        'AccountId',
        'CampaignId',
        'CampaignName',
        'Conversions',
        'DeviceType',
        'BidMatchType',
        'Clicks',
        'Impressions',
        'Ctr',
        'AverageCpc',
        'Spend',
        'AverageCpm',
        'AverageDurationPerVisit',
        'AveragePagesPerVisit',
        'AveragePosition',
        'ConversionRate',
        'ImpressionSharePercent',
        'Ptr',
        'QualityScore',
        'Revenue',
        'TotalVisits',
    ])
    report_request.Columns=report_columns
    print "report request", report_request
    return report_request
def background_completion(reporting_download_parameters):

    global reporting_service_manager
    result_file_path = reporting_service_manager.download_file(reporting_download_parameters)
    print("Download result file: {0}\n".format(result_file_path))

def submit_and_download(report_request):

    global reporting_service_manager
    reporting_download_operation = reporting_service_manager.submit_download(report_request)

    reporting_operation_status = reporting_download_operation.track(timeout_in_milliseconds=TIMEOUT_IN_MILLISECONDS)
    result_file_path = reporting_download_operation.download_result_file(
        result_file_directory = FILE_DIRECTORY,
        result_file_name = DOWNLOAD_FILE_NAME,
        decompress = True,
        overwrite = True,  # Set this value true if you want to overwrite the same file.
        timeout_in_milliseconds=TIMEOUT_IN_MILLISECONDS # You may optionally cancel the download after a specified time interval.
    )

# Main execution
if __name__ == '__main__':

    print("Python loads the web service proxies at runtime, so you will observe " \
          "a performance delay between program launch and main execution...\n")

    authorization_data = AuthorizationData(
        account_id="XXXXXX",
        customer_id="XXXXXXXX",
        developer_token="XXXXXXXX",
        authentication=None, )

    print "authorize_Data", AuthorizationData

    reporting_service = ServiceClient(
        'ReportingService',
        version=12,
        authorization_data=authorization_data,
        environment=ENVIRONMENT,
    )

    reporting_service_manager = ReportingServiceManager(
        authorization_data=authorization_data,
        poll_interval_in_milliseconds=5000,
        environment=ENVIRONMENT,
    )

    authenticate(authorization_data)

    main(authorization_data)

authenticator.py
`from bingads.authorization import *

AccessToken="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

def authenticate(authorization_data):
    import logging
    logging.basicConfig(level=logging.INFO)
    logging.getLogger('suds.client').setLevel(logging.DEBUG)
    logging.getLogger('suds.transport.http').setLevel(logging.DEBUG)
    authentication = OAuthWebAuthCodeGrant(client_id="XXXXXXXXXXXXXX",
                                           client_secret="rnxnRSXBOC206@obhC51_;_",
                                           redirection_uri="https://www.tv.com",
                                           oauth_tokens=OAuthTokens(access_token=AccessToken))

    authorization_data.authentication = authentication

    print "authorization_data", authorization_data

    def oauth_tokens(self):
        return self._oauth_tokens

if __name__ == "__main__":
    authorization_data = AuthorizationData(
        account_id="XXXXXXXXXXXXX",
        customer_id="XXXXXXXXXXXXXXXXXXX",
        developer_token="XXXXXXXXXXXXXXXXX",
        authentication=None, )

SOP Error.

authorize_Data bingads.authorization.AuthorizationData authorization_data <bingads.authorization.AuthorizationData instance at 0x7f2cc12aae60> report request (CampaignPerformanceReportRequest){ ExcludeColumnHeaders = None ExcludeReportFooter = None ExcludeReportHeader = None Format = "csv" Language = "English" ReportName = "My Campaign Performance Report" ReturnOnlyCompleteData = False Aggregation = "Daily" Columns = (ArrayOfCampaignPerformanceReportColumn){ CampaignPerformanceReportColumn[] =

        "TimePeriod",
        "AccountId",
        "CampaignId",
        "CampaignName",
        "Conversions",
        "DeviceType",
        "BidMatchType",
        "Clicks",
        "Impressions",
        "Ctr",
        "AverageCpc",
        "Spend",
        "AverageCpm",
        "AverageDurationPerVisit",
        "AveragePagesPerVisit",
        "AveragePosition",
        "ConversionRate",
        "ImpressionSharePercent",
        "Ptr",
        "QualityScore",
        "Revenue",
        "TotalVisits",,
  }

Filter = (CampaignPerformanceReportFilter){ AccountStatus = None AdDistribution = None DeviceOS = None DeviceType = None Status = None } Scope = (AccountThroughCampaignReportScope){ AccountIds = { long[] = "136004299", } Campaigns = None } Time = (ReportTime){ CustomDateRangeEnd = (Date){ Day = None Month = None Year = None } CustomDateRangeStart = (Date){ Day = None Month = None Year = None } PredefinedTime = "2018-06-01" ReportTimeZone = "PacificTimeUSCanadaTijuana" } } Awaiting Background Completion . . . DEBUG:suds.client:sending to (https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V12/ReportingService.svc) message: <?xml version="1.0" encoding="UTF-8"?>

XXXXXXXXXXXXXXXXXXXXXXXXXXXXX xxxx xxx xxxxxxxx csv English My Campaign Performance Report false Daily TimePeriod AccountId CampaignId CampaignName Conversions DeviceType BidMatchType Clicks Impressions Ctr AverageCpc Spend AverageCpm AverageDurationPerVisit AveragePagesPerVisit AveragePosition ConversionRate ImpressionSharePercent Ptr QualityScore Revenue TotalVisits XXXXXXXXXXXXXXX 2018-06-01 PacificTimeUSCanadaTijuana DEBUG:suds.client:headers = {'SOAPAction': '"SubmitGenerateReport"', 'Content-Type': 'text/xml; charset=utf-8', 'User-Agent': 'BingAdsSDKPython 11.12.4 (2, 7, 15)'} DEBUG:suds.transport.http:sending: URL: https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V12/ReportingService.svc HEADERS: {'Soapaction': '"SubmitGenerateReport"', 'SOAPAction': '"SubmitGenerateReport"', 'User-agent': 'BingAdsSDKPython 11.12.4 (2, 7, 15)', 'Content-Type': 'text/xml; charset=utf-8', 'Content-type': 'text/xml; charset=utf-8', 'User-Agent': 'BingAdsSDKPython 11.12.4 (2, 7, 15)'} MESSAGE: *****************XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX105S5D231O576863csvEnglishMy Campaign Performance ReportfalseDailyTimePeriodAccountIdCampaignIdCampaignNameConversionsDeviceTypeBidMatchTypeClicksImpressionsCtrAverageCpcSpendAverageCpmAverageDurationPerVisitAveragePagesPerVisitAveragePositionConversionRateImpressionSharePercentPtrQualityScoreRevenueTotalVisits1360042992018-06-01PacificTimeUSCanadaTijuana DEBUG:suds.client:HTTP failed - 500 - Internal Server Error: s:ServerInvalid client data. Check the SOAP fault details for more information868d5d6a-3470-4d9e-8021-34c740527b9b105InvalidCredentialsAuthentication failed. Either supplied credentials are invalid or the account is inactive ERROR:suds.client: Server raised fault: 'Invalid client data. Check the SOAP fault details for more information'
eric-urban commented 6 years ago

@dilshadx the 105 error is typically a mismatch between environment + authentication token + developer token. I suggest that you contact support to confirm your account permissions.

I hope this helps!