परिचय
इस गाइड में, एपीआई की मदद से रिपोर्ट चलाने और डाउनलोड करने का तरीका बताया गया है. इसमें दोनों तरह की जानकारी शामिल है सेव की गई मौजूदा रिपोर्ट क्वेरी का इस्तेमाल करके और ऐड-हॉक रिपोर्ट क्वेरी का इस्तेमाल किया जा सकता है.
ज़रूरी शर्तें
- प्रोडक्शन Google Ad Manager नेटवर्क का ऐक्सेस
- Ad Manager क्लाइंट लाइब्रेरी
Primer
अगर आपको Ad Manager में रिपोर्टिंग की जानकारी नहीं है, तो नई रिपोर्ट बनाएं Ad Manager के यूज़र इंटरफ़ेस (यूआई) में रिपोर्ट चलाने के बारे में खास जानकारी. यूज़र इंटरफ़ेस (यूआई) में और टूलटिप, जो कॉलम और डाइमेंशन के कॉम्बिनेशन की जानकारी देते हैं. समर्थित हैं. जटिल रिपोर्ट क्वेरी बनाते समय, उसे बनाना ज़्यादा आसान हो सकता है उसे पहले यूज़र इंटरफ़ेस (यूआई) में डालें और फिर एपीआई की मदद से क्वेरी वापस पाएं.
सेव की गई ReportQuery को वापस पाना
ReportQuery
ऑब्जेक्ट में रिपोर्ट की सारी जानकारी मौजूद होती है. रिपोर्ट क्वेरी यहां बनाई जा सकती हैं
और उन्हें Ad Manager यूज़र इंटरफ़ेस (यूआई) की मदद से,
ReportService.getSavedQueriesByStatement
तरीका. इसमें कोई क्वेरी देखते समय, सेव की गई क्वेरी आईडी को यूआरएल में शामिल कर लिया जाता है
यूज़र इंटरफ़ेस (यूआई). उदाहरण के लिए,
https://www.google.com/admanager/1234#reports/report/detail/report_id=456789
क्वेरी आईडी 456789
है.
अगर कोई क्वेरी आपके एपीआई वर्शन के साथ काम नहीं करती है, तो
SavedQuery.reportQuery
होगा null
और
SavedQuery.isCompatibleWithApiVersion
होगा. false
.
साथ काम करने वाली सेव की गई क्वेरी को बदलाव के साथ या उसके बिना चलाया जा सकता है.
Java
StatementBuilder statementBuilder = new StatementBuilder() .where("id = :id") .orderBy("id ASC") .limit(1) .withBindVariableValue("id", savedQueryId); SavedQueryPage page = reportService.getSavedQueriesByStatement(statementBuilder.toStatement()); SavedQuery savedQuery = Iterables.getOnlyElement(Arrays.asList(page.getResults())); if (!savedQuery.getIsCompatibleWithApiVersion()) { throw new IllegalStateException("The saved query is not compatible with this API version."); } ReportQuery reportQuery = savedQuery.getReportQuery();
Python
statement = (ad_manager.StatementBuilder(version='v202408') .Where('id = :id') .WithBindVariable('id', int(saved_query_id)) .Limit(1)) response = report_service.getSavedQueriesByStatement( statement.ToStatement()) if 'results' in response and len(response['results']): saved_query = response['results'][0] if saved_query['isCompatibleWithApiVersion']: report_job = {} # Set report query and optionally modify it. report_job['reportQuery'] = saved_query['reportQuery']
PHP
$statementBuilder = (new StatementBuilder())->where('id = :id') ->orderBy('id ASC') ->limit(1) ->withBindVariableValue('id', $savedQueryId); $savedQueryPage = $reportService->getSavedQueriesByStatement( $statementBuilder->toStatement() ); $savedQuery = $savedQueryPage->getResults()[0]; if ($savedQuery->getIsCompatibleWithApiVersion() === false) { throw new UnexpectedValueException( 'The saved query is not compatible with this API version.' ); } $reportQuery = $savedQuery->getReportQuery();
C#
StatementBuilder statementBuilder = new StatementBuilder() .Where("id = :id") .OrderBy("id ASC") .Limit(1) .AddValue("id", savedQueryId); SavedQueryPage page = reportService.getSavedQueriesByStatement(statementBuilder.ToStatement()); SavedQuery savedQuery = page.results[0]; if (!savedQuery.isCompatibleWithApiVersion) { throw new InvalidOperationException("Saved query is not compatible with this " + "API version"); } // Optionally modify the query. ReportQuery reportQuery = savedQuery.reportQuery;
Ruby
statement = ad_manager.new_statement_builder do |sb| sb.where = 'id = :saved_query_id' sb.with_bind_variable('saved_query_id', saved_query_id) end saved_query_page = report_service.get_saved_queries_by_statement( statement.to_statement() ) unless saved_query_page[:results].nil? saved_query = saved_query_page[:results].first if saved_query[:is_compatible_with_api_version] # Create report job. report_job = {:report_query => saved_query[:report_query]} else raise StandardError, 'Report query is not compatible with the API' end
क्वेरी चलाने के लिए, reportJob बनाना देखें.
ReportQuery बनाना
सेव की गई क्वेरी का इस्तेमाल करने के साथ-साथ, ऐड-हॉक ReportQuery भी बनाया जा सकता है. ऐसा करने के लिए, आपको रिपोर्ट की डाइमेंशन, डाइमेंशन एट्रिब्यूट, कॉलम, फ़िल्टर, और तारीख की सीमा चुनें. यह एक ऑर्डर की बेसिक डिलीवरी रिपोर्ट का उदाहरण है.
Java
// Create report query. ReportQuery reportQuery = new ReportQuery(); reportQuery.setDimensions(new Dimension[] {Dimension.DATE, Dimension.ORDER_ID}); reportQuery.setColumns( new Column[] { Column.AD_SERVER_IMPRESSIONS, Column.AD_SERVER_CLICKS, Column.AD_SERVER_CTR, Column.AD_SERVER_CPM_AND_CPC_REVENUE }); reportQuery.setDimensionAttributes( new DimensionAttribute[] { DimensionAttribute.ORDER_TRAFFICKER, DimensionAttribute.ORDER_START_DATE_TIME, DimensionAttribute.ORDER_END_DATE_TIME }); // Create statement to filter for an order. StatementBuilder statementBuilder = new StatementBuilder() .where("ORDER_ID = :orderId") .withBindVariableValue("orderId", orderId); // Set the filter statement. reportQuery.setStatement(statementBuilder.toStatement()); // Set the start and end dates or choose a dynamic date range type. reportQuery.setDateRangeType(DateRangeType.CUSTOM_DATE); reportQuery.setStartDate( DateTimes.toDateTime("2013-05-01T00:00:00", "America/New_York").getDate()); reportQuery.setEndDate( DateTimes.toDateTime("2013-05-31T00:00:00", "America/New_York").getDate());
Python
# Create statement object to filter for an order. statement = (ad_manager.StatementBuilder(version='v202408') .Where('ORDER_ID = :id') .WithBindVariable('id', int(order_id)) .Limit(None) # No limit or offset for reports .Offset(None)) # Set the start and end dates of the report to run (past 8 days). end_date = datetime.now().date() start_date = end_date - timedelta(days=8) # Create report job. report_job = { 'reportQuery': { 'dimensions': ['ORDER_ID', 'ORDER_NAME'], 'dimensionAttributes': ['ORDER_TRAFFICKER', 'ORDER_START_DATE_TIME', 'ORDER_END_DATE_TIME'], 'statement': statement.ToStatement(), 'columns': ['AD_SERVER_IMPRESSIONS', 'AD_SERVER_CLICKS', 'AD_SERVER_CTR', 'AD_SERVER_CPM_AND_CPC_REVENUE', 'AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM'], 'dateRangeType': 'CUSTOM_DATE', 'startDate': start_date, 'endDate': end_date } }
PHP
// Create report query. $reportQuery = new ReportQuery(); $reportQuery->setDimensions( [ Dimension::ORDER_ID, Dimension::ORDER_NAME ] ); $reportQuery->setDimensionAttributes( [ DimensionAttribute::ORDER_TRAFFICKER, DimensionAttribute::ORDER_START_DATE_TIME, DimensionAttribute::ORDER_END_DATE_TIME ] ); $reportQuery->setColumns( [ Column::AD_SERVER_IMPRESSIONS, Column::AD_SERVER_CLICKS, Column::AD_SERVER_CTR, Column::AD_SERVER_CPM_AND_CPC_REVENUE, Column::AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM ] ); // Create statement to filter for an order. $statementBuilder = (new StatementBuilder()) ->where('ORDER_ID = :orderId') ->withBindVariableValue( 'orderId', $orderId ); // Set the filter statement. $reportQuery->setStatement($statementBuilder->toStatement()); // Set the start and end dates or choose a dynamic date range type. $reportQuery->setDateRangeType(DateRangeType::CUSTOM_DATE); $reportQuery->setStartDate( AdManagerDateTimes::fromDateTime( new DateTime( '-10 days', new DateTimeZone('America/New_York') ) ) ->getDate() ); $reportQuery->setEndDate( AdManagerDateTimes::fromDateTime( new DateTime( 'now', new DateTimeZone('America/New_York') ) ) ->getDate() );
C#
// Create report job. ReportJob reportJob = new ReportJob(); reportJob.reportQuery = new ReportQuery(); reportJob.reportQuery.dimensions = new Dimension[] { Dimension.ORDER_ID, Dimension.ORDER_NAME }; reportJob.reportQuery.dimensionAttributes = new DimensionAttribute[] { DimensionAttribute.ORDER_TRAFFICKER, DimensionAttribute.ORDER_START_DATE_TIME, DimensionAttribute.ORDER_END_DATE_TIME }; reportJob.reportQuery.columns = new Column[] { Column.AD_SERVER_IMPRESSIONS, Column.AD_SERVER_CLICKS, Column.AD_SERVER_CTR, Column.AD_SERVER_CPM_AND_CPC_REVENUE, Column.AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM }; // Set a custom date range for the last 8 days reportJob.reportQuery.dateRangeType = DateRangeType.CUSTOM_DATE; System.DateTime endDateTime = System.DateTime.Now; reportJob.reportQuery.startDate = DateTimeUtilities .FromDateTime(endDateTime.AddDays(-8), "America/New_York").date; reportJob.reportQuery.endDate = DateTimeUtilities .FromDateTime(endDateTime, "America/New_York").date; // Create statement object to filter for an order. StatementBuilder statementBuilder = new StatementBuilder().Where("ORDER_ID = :id") .AddValue("id", orderId); reportJob.reportQuery.statement = statementBuilder.ToStatement();
Ruby
# Specify a report to run for the last 7 days. report_end_date = ad_manager.today() report_start_date = report_end_date - 7 # Create statement object to filter for an order. statement = ad_manager.new_report_statement_builder do |sb| sb.where = 'ORDER_ID = :order_id' sb.with_bind_variable('order_id', order_id) end # Create report query. report_query = { :date_range_type => 'CUSTOM_DATE', :start_date => report_start_date.to_h, :end_date => report_end_date.to_h, :dimensions => ['ORDER_ID', 'ORDER_NAME'], :dimension_attributes => ['ORDER_TRAFFICKER', 'ORDER_START_DATE_TIME', 'ORDER_END_DATE_TIME'], :columns => ['AD_SERVER_IMPRESSIONS', 'AD_SERVER_CLICKS', 'AD_SERVER_CTR', 'AD_SERVER_CPM_AND_CPC_REVENUE', 'AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM'], :statement => statement.to_statement() }
रिपोर्ट जॉब बनाना
ReportQuery आ जाने के बाद, आप रिपोर्ट को चला सकते हैं. ReportJob ऑब्जेक्ट में, किसी रिपोर्ट की स्थिति से जुड़ी जानकारी होती है. साथ ही, यह आपको यह भी बताता है कि रिपोर्ट डाउनलोड के लिए कब तैयार होगी. यहां की यात्रा पर हूं अपनी रिपोर्ट चलाना शुरू करें, तो ReportService.runReportJob तरीका.
Java
// Create report job. ReportJob reportJob = new ReportJob(); reportJob.setReportQuery(reportQuery); // Run report job. reportJob = reportService.runReportJob(reportJob);
Python
# Initialize a DataDownloader. report_downloader = client.GetDataDownloader(version='v202408') try: # Run the report and wait for it to finish. report_job_id = report_downloader.WaitForReport(report_job) except errors.AdManagerReportError as e: print('Failed to generate report. Error was: %s' % e)
PHP
// Create report job and start it. $reportJob = new ReportJob(); $reportJob->setReportQuery($reportQuery); $reportJob = $reportService->runReportJob($reportJob);
C#
// Run report job. reportJob = reportService.runReportJob(reportJob);
Ruby
# Create report job. report_job = {:report_query => report_query} # Run report job. report_job = report_service.run_report_job(report_job);
रिपोर्ट डाउनलोड करना
रिपोर्ट का काम शुरू करने के बाद, इसमें सर्वर की ओर से सेट किया गया एक आईडी होगा. इसका इस्तेमाल करें आईडी ReportService.getReportJobStatus तरीके का इस्तेमाल करके, रिपोर्ट की स्थिति देखी जा सकती है. एक बार स्थिति यह हो जाने के बाद ReportJobStatus.COMPLETED रिपोर्ट डाउनलोड किए जाने के लिए तैयार है.
हमारी कुछ क्लाइंट लाइब्रेरी में हेल्पर सुविधाएं हैं, जो एपीआई और रिपोर्ट पूरी होने तक इंतज़ार करें. रिपोर्ट तैयार हो जाने के बाद, आपको इसकी मदद से यूआरएल डाउनलोड करें ReportService.getReportDownloadURL तरीका. किसी रिपोर्ट को अलग-अलग फ़ॉर्मैट में डाउनलोड किया जा सकता है. अगर आपको ऐसा करना है, प्रोसेस नहीं करनी है, तो आपको CSV_DUMP फ़ॉर्मैट.
Java
// Create report downloader. ReportDownloader reportDownloader = new ReportDownloader(reportService, reportJob.getId()); // Wait for the report to be ready. if (reportDownloader.waitForReportReady()) { // Change to your file location. File file = File.createTempFile("delivery-report-", ".csv.gz"); System.out.printf("Downloading report to %s ...", file.toString()); // Download the report. ReportDownloadOptions options = new ReportDownloadOptions(); options.setExportFormat(ExportFormat.CSV_DUMP); options.setUseGzipCompression(true); URL url = reportDownloader.getDownloadUrl(options); Resources.asByteSource(url).copyTo(Files.asByteSink(file)); System.out.println("done."); } else { System.out.printf("Report job %d failed.%n", reportJob.getId()); }
Python
# Change to your preferred export format. export_format = 'CSV_DUMP' report_file = tempfile.NamedTemporaryFile(suffix='.csv.gz', delete=False) # Download report data. report_downloader.DownloadReportToFile( report_job_id, export_format, report_file) report_file.close() # Display results. print('Report job with id "%s" downloaded to:\n%s' % ( report_job_id, report_file.name))
PHP
// Create report downloader to poll report's status and download when // ready. $reportDownloader = new ReportDownloader( $reportService, $reportJob->getId() ); if ($reportDownloader->waitForReportToFinish()) { // Write to system temp directory by default. $filePath = sprintf( '%s.csv.gz', tempnam(sys_get_temp_dir(), 'delivery-report-') ); printf("Downloading report to %s ...%s", $filePath, PHP_EOL); // Download the report. $reportDownloader->downloadReport( ExportFormat::CSV_DUMP, $filePath ); print "done.\n"; } else { print "Report failed.\n"; }
C#
ReportUtilities reportUtilities = new ReportUtilities(reportService, reportJob.id); // Set download options. ReportDownloadOptions options = new ReportDownloadOptions(); options.exportFormat = ExportFormat.CSV_DUMP; options.useGzipCompression = true; reportUtilities.reportDownloadOptions = options; // Download the report. using (ReportResponse reportResponse = reportUtilities.GetResponse()) { reportResponse.Save(filePath); } Console.WriteLine("Report saved to \"{0}\".", filePath);
Ruby
MAX_RETRIES.times do |retry_count| # Get the report job status. report_job_status = report_service.get_report_job_status(report_job[:id]) break unless report_job_status == 'IN_PROGRESS' puts 'Report with ID %d is still running.' % report_job[:id] sleep(RETRY_INTERVAL) end puts 'Report job with ID %d finished with status "%s".' % [report_job[:id], report_service.get_report_job_status(report_job[:id])] # Get the report URL. download_url = report_service.get_report_download_url( report_job_id, export_format ) puts 'Downloading "%s" to "%s"...' % [download_url, file_name] open(file_name, 'wb') do |local_file| local_file << open(download_url).read() end
रिपोर्ट का डेटा पढ़ना
हमारी कई क्लाइंट लाइब्रेरी में, रिपोर्ट का डेटा पढ़ने के लिए सुविधाएं शामिल हैं. यह है रिपोर्ट डेटा की अतिरिक्त प्रोसेसिंग या रिपोर्ट को एक साथ जोड़ने में मदद मिलती है डेटा पर क्लिक करें. ध्यान दें कि उदाहरण कोड यह मानता है कि फ़ाइल कंप्रेस किया हुआ है.
Java
List<String[]> rows = CsvFiles.getCsvDataArray(filePath, true); for (String[] row : rows) { // Additional row processing processReportRow(row); }
Python
with open(report_file.name, 'rb') as report: report_reader = csv.reader(report) for row in report_reader: # Additional row processing process_row(row)
PHP
$report = fopen($filePath, 'r'); while (!feof($report)) { // Additional row processing processRow(fgetcsv($report)); } fclose($report);
C#
CsvFile file = new CsvFile(); file.Read(fileName, true); for (String[] row : file.Records) { // Additional row processing ProcessReportRow(row); }
Ruby
CSV.foreach(file_name, converters: :numeric, headers: true) do |row| # Additional row processing process_row(row) end
रिपोर्टिंग के ज़्यादा उदाहरणों के लिए, GitHub पर हमारी क्लाइंट लाइब्रेरी देखें.
अक्सर पूछे जाने वाले सवाल
- मेरे टेस्ट नेटवर्क पर मौजूद सभी रिपोर्ट के नतीजे खाली क्यों हैं?
- टेस्ट नेटवर्क पर विज्ञापन नहीं दिखाए जाते. इसलिए, डिलीवरी रिपोर्ट में डेटा नहीं होगा.
- मेरे प्रोडक्शन नेटवर्क पर रिपोर्ट के सभी नतीजे क्यों खाली हैं?
- जिस उपयोगकर्ता के खाते की पुष्टि की जा रही है उसके पास, शायद उस डेटा का ऐक्सेस न हो जिसकी पुष्टि की जा रही है रिपोर्ट करने की कोशिश कर रहा है. पुष्टि करें कि उनके भूमिका से जुड़ी अनुमतियां और टीम सही तरीके से सेट की गई हैं.
- मुझे अपनी रिपोर्ट के लिए गड़बड़ी का कोड
ReportError.COLUMNS_NOT_SUPPORTED_FOR_REQUESTED_DIMENSIONS
क्यों दिख रहा है? - Ad Manager में, कॉलम और डाइमेंशन के सभी कॉम्बिनेशन काम नहीं करते. जटिल रिपोर्ट के लिए, यूज़र इंटरफ़ेस (यूआई) में मान्य रिपोर्ट बनाना आसान हो सकता है. इसके बाद, ReportService.getSavedQueriesByStatement तरीके का इस्तेमाल करके, उसे फिर से पाया जा सकता है.
- मेरी सेव की गई रिपोर्ट एपीआई में क्यों नहीं दिखती?
- पक्का करें कि रिपोर्ट के मालिक ने रिपोर्ट को उस उपयोगकर्ता के साथ शेयर किया हो जिसकी पुष्टि की जा रही है.
- मेरी सेव की गई रिपोर्ट, एपीआई के साथ काम क्यों नहीं करती?
- इस एपीआई में रिपोर्टिंग से जुड़ी कुछ सुविधाएं उपलब्ध नहीं हैं. इसमें ये शामिल हैं
कॉलम, डाइमेंशन एट्रिब्यूट, डाइमेंशन, और तारीख की सीमा के टाइप. इसके लिए
असंगत तारीख सीमा प्रकार, आप रिपोर्ट को एक समर्थित प्रकार के साथ
इसे फिर से हासिल करने लायक बनाएं. इसके बाद, अपनी पसंद की तय तारीख की सीमा के हिसाब से
ReportQuery
में बदलाव करें. - लाइफ़टाइम क्लिक/इंप्रेशन, यूज़र इंटरफ़ेस (यूआई) में मेरी रिपोर्ट से मेल क्यों नहीं खाते?
- लाइफ़टाइम इंप्रेशन लाइन आइटम की पूरी ज़िंदगी के लिए होते हैं, भले ही तारीख की सीमा तय करें. अगर कोई लाइन आइटम अब भी डिलीवर कर रहा है, तो मान दो रिपोर्ट चलाने के बीच फ़र्क़ हो सकता है.
- मेरी रिपोर्ट में बहुत ज़्यादा समय लग रहा है और कभी-कभी उनका समय खत्म हो रहा है. मैं क्या कर सकता हूं?
- तारीख की सीमा या डाइमेंशन की संख्या को कम करने से परफ़ॉर्मेंस. इसके बजाय छोटी तारीख सीमाओं के लिए कई रिपोर्ट चलाने की कोशिश करें. इसके बाद, अपनी पसंद की तारीख की सीमा के लिए, रिपोर्ट के डेटा को मर्ज किया जा सकता है.
INVENTORY_LEVEL
औरLINE_ITEM_LEVEL
कॉलम में क्या अंतर है? मुझे किसका इस्तेमाल करना चाहिए?LINE_ITEM_LEVEL
वाले कॉलम का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब आपके पास लाइन आइटम लेवल की सुविधा हो आपके नेटवर्क पर डाइनैमिक एलोकेशन चालू है. इन कॉलम में AdSense या Ad Exchange में लाइन आइटम लेवल का डाइनैमिक आवंटन. इसी तरह,INVENTORY_LEVEL
कॉलम में, इन्वेंट्री लेवल के डाइनैमिक एलोकेशन का डेटा शामिल होता है. डाइनैमिक एलोकेशन के बारे में ज़्यादा जानने के लिए, यहां जाएं Ad Exchange लाइन आइटम.अगर आपको अब भी यह नहीं पता है कि किस एपीआई कॉलम का इस्तेमाल करना है, तो Ad Manager यूज़र इंटरफ़ेस (यूआई) और उसे ReportService.getSavedQueriesByStatement तरीका.