ভূমিকা
এই নির্দেশিকা আপনাকে দেখাবে কিভাবে API এর সাথে একটি প্রতিবেদন চালাতে এবং ডাউনলোড করতে হয়। এটি একটি বিদ্যমান সংরক্ষিত রিপোর্ট ক্যোয়ারী ব্যবহার করে এবং একটি অ্যাডহক রিপোর্ট ক্যোয়ারী তৈরি উভয়ই কভার করে।
পূর্বশর্ত
- একটি প্রোডাকশন গুগল অ্যাড ম্যানেজার নেটওয়ার্কে অ্যাক্সেস
- একটি অ্যাড ম্যানেজার ক্লায়েন্ট লাইব্রেরি
প্রাইমার
আপনি যদি অ্যাড ম্যানেজারে রিপোর্টিং সম্পর্কে অপরিচিত হন, তাহলে অ্যাড ম্যানেজার UI-তে কীভাবে রিপোর্ট চালাতে হয় তার একটি ওভারভিউয়ের জন্য একটি নতুন রিপোর্ট তৈরি করুন দেখুন। UI এর আউটপুটের একটি পূর্বরূপ রয়েছে, সেইসাথে টুলটিপ যা ব্যাখ্যা করে যে কোন কলাম এবং মাত্রা সমন্বয় সমর্থিত। একটি জটিল প্রতিবেদন ক্যোয়ারী তৈরি করার সময়, প্রথমে UI-তে এটি তৈরি করা সহজ হতে পারে এবং তারপর API-এর সাহায্যে ক্যোয়ারী পুনরুদ্ধার করা যেতে পারে।
একটি সংরক্ষিত ReportQuery পুনরুদ্ধার করা হচ্ছে
ReportQuery অবজেক্টে রিপোর্টের সমস্ত বিবরণ রয়েছে। আপনি Ad Manager UI-তে রিপোর্ট কোয়েরি তৈরি করতে পারেন এবং ReportService.getSavedQueriesByStatement পদ্ধতির মাধ্যমে সেগুলি পুনরুদ্ধার করতে পারেন। UI-তে একটি ক্যোয়ারী দেখার সময় সংরক্ষিত ক্যোয়ারী আইডি URL-এ অন্তর্ভুক্ত করা হয়। উদাহরণস্বরূপ, URL-এ https://www.google.com/admanager/1234#reports/report/detail/report_id=456789
কোয়েরি আইডি হল 456789
।
যদি একটি প্রশ্ন আপনার API সংস্করণের সাথে সামঞ্জস্যপূর্ণ না হয়, তাহলে SavedQuery.reportQuery null
হবে এবং SavedQuery.isCompatibleWithApiVersion false
হবে।
সামঞ্জস্যপূর্ণ সংরক্ষিত প্রশ্নগুলি পরিবর্তনের সাথে বা ছাড়াই চালানো যেতে পারে।
জাভা
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();
পাইথন
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']
পিএইচপি
$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();
সি#
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;
রুবি
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ও তৈরি করতে পারেন৷ এটি করতে, আপনাকে অবশ্যই প্রতিবেদনের মাত্রা , মাত্রা বৈশিষ্ট্য , কলাম , ফিল্টার এবং তারিখ পরিসীমা সেট করতে হবে৷ এই উদাহরণটি একক অর্ডারে একটি মৌলিক ডেলিভারি রিপোর্টের জন্য।
জাভা
// 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());
পাইথন
# 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 } }
পিএইচপি
// 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() );
সি#
// 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();
রুবি
# 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() }
ReportJob তৈরি করা
একবার আপনার একটি ReportQuery হয়ে গেলে, রিপোর্টটি চালানোর সময়। ReportJob অবজেক্ট একটি রিপোর্টের স্থিতি ধারণ করে এবং এটি ডাউনলোড করার জন্য প্রস্তুত হলে আপনাকে জানাতে দেয়। আপনার রিপোর্ট চালানো শুরু করতে, ReportService.runReportJob পদ্ধতি ব্যবহার করুন।
জাভা
// Create report job. ReportJob reportJob = new ReportJob(); reportJob.setReportQuery(reportQuery); // Run report job. reportJob = reportService.runReportJob(reportJob);
পাইথন
# 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)
পিএইচপি
// Create report job and start it. $reportJob = new ReportJob(); $reportJob->setReportQuery($reportQuery); $reportJob = $reportService->runReportJob($reportJob);
সি#
// Run report job. reportJob = reportService.runReportJob(reportJob);
রুবি
# 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 পদ্ধতির মাধ্যমে ডাউনলোড URL পেতে পারেন। একটি প্রতিবেদন বিভিন্ন ফরম্যাটে ডাউনলোড করা যেতে পারে। আপনি যদি রিপোর্টের সাথে আরও মেশিন প্রক্রিয়াকরণ করতে চান, তাহলে আপনার CSV_DUMP ফর্ম্যাট ব্যবহার করা উচিত।
জাভা
// 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()); }
পাইথন
# 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))
পিএইচপি
// 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"; }
সি#
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);
রুবি
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
প্রতিবেদনের ডেটা পড়া
আমাদের অনেক ক্লায়েন্ট লাইব্রেরি রিপোর্ট ডেটা পড়ার জন্য ইউটিলিটিগুলি অন্তর্ভুক্ত করে। এটি রিপোর্ট ডেটার অতিরিক্ত প্রক্রিয়াকরণের জন্য বা বিভিন্ন তারিখের সীমার রিপোর্টগুলিকে একত্রিত করার জন্য দরকারী৷ উল্লেখ্য যে উদাহরণ কোডটি অনুমান করে যে ফাইলটি সংকুচিত হয়নি।
জাভা
List<String[]> rows = CsvFiles.getCsvDataArray(filePath, true); for (String[] row : rows) { // Additional row processing processReportRow(row); }
পাইথন
with open(report_file.name, 'rb') as report: report_reader = csv.reader(report) for row in report_reader: # Additional row processing process_row(row)
পিএইচপি
$report = fopen($filePath, 'r'); while (!feof($report)) { // Additional row processing processRow(fgetcsv($report)); } fclose($report);
সি#
CsvFile file = new CsvFile(); file.Read(fileName, true); for (String[] row : file.Records) { // Additional row processing ProcessReportRow(row); }
রুবি
CSV.foreach(file_name, converters: :numeric, headers: true) do |row| # Additional row processing process_row(row) end
আরও রিপোর্টিং উদাহরণের জন্য, GitHub-এ আমাদের ক্লায়েন্ট লাইব্রেরিগুলি দেখুন।
FAQ
- আমার পরীক্ষার নেটওয়ার্কের সমস্ত রিপোর্টের ফলাফল খালি কেন?
- টেস্ট নেটওয়ার্ক বিজ্ঞাপন পরিবেশন করে না, তাই ডেলিভারি রিপোর্টে ডেটা থাকবে না।
- আমার প্রোডাকশন নেটওয়ার্কের সমস্ত রিপোর্টের ফলাফল খালি কেন?
- আপনি যে ব্যবহারকারী হিসাবে প্রমাণীকরণ করছেন সেই ডেটাতে অ্যাক্সেস নাও থাকতে পারে যা আপনি রিপোর্ট করার চেষ্টা করছেন৷ যাচাই করুন যে তাদের ভূমিকা অনুমতি এবং দল সঠিকভাবে সেট করা আছে।
- কেন আমি আমার রিপোর্টের জন্য
ReportError.COLUMNS_NOT_SUPPORTED_FOR_REQUESTED_DIMENSIONS
ত্রুটিটি পাব? - কলাম এবং মাত্রার সমস্ত সমন্বয় Ad Manager-এ সমর্থিত নয়। জটিল প্রতিবেদনের জন্য, UI-তে একটি বৈধ প্রতিবেদন তৈরি করা এবং তারপর ReportService.getSavedQueriesByStatement পদ্ধতির মাধ্যমে এটি পুনরুদ্ধার করা সহজ হতে পারে।
- কেন আমার সংরক্ষিত রিপোর্ট API এ ফেরত দেওয়া হয় না?
- নিশ্চিত করুন যে প্রতিবেদনের মালিক আপনি যে ব্যবহারকারী হিসাবে প্রমাণীকরণ করছেন তার সাথে প্রতিবেদনটি শেয়ার করেছেন৷
- কেন আমার সংরক্ষিত প্রতিবেদন API এর সাথে সামঞ্জস্যপূর্ণ নয়?
- কিছু রিপোর্টিং বৈশিষ্ট্য API-এ উপলব্ধ নেই৷ এর মধ্যে রয়েছে কলাম, মাত্রা বৈশিষ্ট্য, মাত্রা এবং তারিখ পরিসরের ধরন। অসামঞ্জস্যপূর্ণ তারিখ পরিসরের প্রকারের জন্য, আপনি প্রতিবেদনটিকে পুনরুদ্ধারযোগ্য করতে একটি সমর্থিত প্রকারের সাথে সংরক্ষণ করতে পারেন, তারপর আপনার পছন্দসই নির্দিষ্ট তারিখের সীমা পূরণ করতে
ReportQuery
পরিবর্তন করুন৷ - কেন আজীবন ক্লিক/ইম্প্রেশন UI-তে আমার রিপোর্টের সাথে মেলে না?
- লাইফটাইম ইম্প্রেশনগুলি লাইন আইটেমের সমগ্র জীবনের জন্য, প্রতিবেদনের তারিখের পরিসর নির্বিশেষে। যদি একটি লাইন আইটেম এখনও বিতরণ করা হয়, মান সম্ভবত যে কোনো দুটি রিপোর্ট চালানোর মধ্যে পরিবর্তিত হবে.
- আমার রিপোর্টগুলি খুব বেশি সময় নিচ্ছে এবং মাঝে মাঝে সময় বের হচ্ছে। আমি কি করতে পারি?
- তারিখ ব্যাপ্তি বা মাত্রার সংখ্যা কমানো কর্মক্ষমতা উন্নত করতে সাহায্য করবে। পরিবর্তে ছোট তারিখ ব্যাপ্তির জন্য একাধিক প্রতিবেদন চালানোর চেষ্টা করুন। তারপর আপনি পছন্দসই তারিখ পরিসীমা কভার করতে রিপোর্ট ডেটা মার্জ করতে পারেন।
-
INVENTORY_LEVEL
এবংLINE_ITEM_LEVEL
কলামের মধ্যে পার্থক্য কী? আমি কোনটি ব্যবহার করা উচিত? আপনার নেটওয়ার্কে লাইন আইটেম স্তরের গতিশীল বরাদ্দ সক্ষম থাকলেই
LINE_ITEM_LEVEL
সহ কলামগুলি ব্যবহার করা যেতে পারে৷ এই কলামগুলিতে AdSense বা অ্যাড এক্সচেঞ্জে লাইন আইটেম স্তরের গতিশীল বরাদ্দ থেকে ডেটা অন্তর্ভুক্ত রয়েছে। একইভাবে,INVENTORY_LEVEL
কলামগুলি ইনভেন্টরি স্তরের গতিশীল বরাদ্দ থেকে ডেটা অন্তর্ভুক্ত করে। গতিশীল বরাদ্দ সম্পর্কে আরও তথ্যের জন্য, Ad Exchange লাইন আইটেম দেখুন।আপনি যদি এখনও নিশ্চিত না হন যে কোন API কলামগুলি ব্যবহার করবেন, তাহলে Ad Manager UI-তে একটি সংরক্ষিত ক্যোয়ারী তৈরি করুন এবং ReportService.getSavedQueriesByStatement পদ্ধতির মাধ্যমে এটি পুনরুদ্ধার করুন।