Si vous demandez des rapports d'annonceurs ou de comptes associés à un moteur de petite ou moyenne taille, vous pouvez n'envoyer qu'une seule demande de rapport synchrone. En réponse à la demande, l'API Search Ads 360 renvoie l'intégralité du rapport dans un objet JSON. Requêtes synchrones:
- Ne peut renvoyer que advertiser et les rapports sur les comptes de moteur
- Bloquez votre client jusqu'à ce que Search Ads 360 génère le rapport
Si vous demandez des rapports volumineux sur les annonceurs ou les comptes de moteur, nous vous recommandons d'utiliser la méthode asynchrone approche.
Pour envoyer une requête synchrone
Appeler le Reports.generate()
pour spécifier le type de données que vous souhaitez inclure dans votre rapport annonceur ou compte associé à un moteur.
Search Ads 360 valide la demande, génère le rapport, puis l'affiche en tant que ressource "Reports" dans la section corps de la réponse.
Exemple de requête synchrone
Voici un exemple de Reports.generate()
requête.
JSON
POST https://www.googleapis.com/doubleclicksearch/v2/reports/generate Authorization: Bearer your OAuth 2.0 access token Content-type: application/json { "reportScope": { "agencyId": "12300000000000456", // Replace with your ID "advertiserId": "21700000000011523", // Replace with your ID "engineAccountId": "700000000073991" // Replace with your ID }, "reportType": "account", // This report covers all revenue and visits in the // engine account specified in reportScope. "columns": [ { "columnName": "date" }, // The date column segments the report by individual days. { "columnName": "dfaRevenue" }, // Here are some metric columns available for keyword { // reports. "columnName": "visits", "startDate": "2013-01-01", // Each metric column can optionally specify its own start "endDate": "2013-01-31", // and end date; by default the report timeRange is used. "headerText": "January visits" // Every column can optionally specify a headerText, which // changes the name of the column in the report. } ], "timeRange" : { "startDate" : "2012-05-01", // Dates are inclusive and specified in YYYY-MM-DD format. "endDate" : "2013-05-01" // Alternatively, try the "changedMetricsSinceTimestamp" or "changedAttributesSinceTimestamp" // options. See Incremental reports. }, "statisticsCurrency": "agency", // Required. See Currency for statistics. "verifySingleTimeZone": false, // Optional. Defaults to false. See Time zone. "includeRemovedEntities": false // Optional. Defaults to false. }
Utilisez le script de l'utilitaire Search Ads 360 pour envoyer cette demande.
Pour envoyer une requête POST JSON brute, vous pouvez utiliser la classe sa360Api.py script comme suit:
- Copiez l'exemple d'objet JSON (tout ce qui se trouve entre les deux
accolades) dans un nouveau fichier texte nommé
request.txt
. - Remplacez l'ID d'agence indiqué dans le code JSON par votre propre ID d'agence.
- Supprimez tous les commentaires, tels que
// The date column segments the report by individual days.
- Assemblez vos identifiants OAuth 2.0 en une seule chaîne, délimitée par des virgules,
suivant:
client-ID,client-secret,refresh-token
(Il s'agit de la même chaîne que génèresa360Api.py
lorsque vous exécutezsa360Api.py --login
, comme décrit dans la section Configurer l'autorisation.) - Appelez
sa360Api.py
comme suit:
sa360Api.py --cred CREDENTIALS --server API-method --post < request.txt
Dans la commande ci-dessus, remplacez la chaîne assemblée à l'étape précédente parCREDENTIALS
.
RemplacezAPI-method
par le nom de la méthode POST indiqué dans la zone ci-dessous.Par exemple:
sa360Api.py --cred 123456789123.apps.googleusercontent.com,ABCDEFGHIJKLMNOPQR_abcdef,1/HIJklM01OPQR23NOP456rst890uvw --server https://www.googleapis.com/doubleclicksearch/v2/reports/generate --post < request.txt
Java
public static void main(String[] args) throws Exception { Doubleclicksearch service = getService(); // See Set Up Your Application. Report report = generateAccountReport(service); outputReport(report, "./"); } /** * Creates an account report using the synchronous Report.generate method. * * @throws IOException */ private static Report generateAccountReport(Doubleclicksearch service) throws IOException { try { return service.reports().generate(generateAccountRequest()).execute(); } catch (GoogleJsonResponseException e) { System.err.println("Report request was rejected."); for (ErrorInfo error : e.getDetails().getErrors()) { System.err.println(error.getMessage()); } System.exit(e.getStatusCode()); return null; // Unreachable code. } } /** * Creates a simple static request that lists the clicks and visits for an engine account. Use * your own agency ID, advertiser ID, and engine account ID. */ private static ReportRequest generateAccountRequest() { return new ReportRequest().setReportScope( new ReportScope() .setAgencyId(20700000000000451L) // Replace with your ID .setAdvertiserId(21700000000010391L) // Replace with your ID .setEngineAccountId(700000000042201L)) // Replace with your ID .setReportType("account") .setColumns(Arrays.asList(new ReportApiColumnSpec[] { new ReportApiColumnSpec().setColumnName("date"), new ReportApiColumnSpec().setColumnName("dfaRevenue"), new ReportApiColumnSpec() .setColumnName("visits") .setHeaderText("January visits") .setStartDate("2013-01-01") .setEndDate("2013-01-31"),})) .setTimeRange(new TimeRange() .setStartDate("2012-05-01") .setEndDate("2013-05-01")) .setStatisticsCurrency("agency"); } /** * Outputs a synchronous report to a file. */ private static void outputReport(Report report, String localPath) throws IOException { FileOutputStream outputStream = new FileOutputStream(new File(localPath, "Report")); final PrintStream printStream = new PrintStream(outputStream); printStream.print(report); printStream.close(); }
Python
def generate_report(service): """Generate and print sample report. Args: service: An authorized Doubleclicksearch service. See Set Up Your Application. """ request = service.reports().generate( body= { "reportScope "agencyId": "12300000000000456", // Replace with your ID "advertiserId": "21700000000011523", // Replace with your ID "engineAccountId": "700000000073991" // Replace with your ID }, "reportType": "account", "columns": [ { "columnName": "date" }, { "columnName": "dfaRevenue" }, { "columnName": "visits", "startDate": "2013-01-01", "endDate": "2013-01-31", "headerText": "January visits" } ], "timeRange" : { "startDate" : "2012-05-01", "endDate" : "2013-05-01" }, "statisticsCurrency": "agency", "verifySingleTimeZone": "false", "includeRemovedEntities": "false" } ) pprint.pprint(request.execute())
Exemple de rapport
La réponse à une requête synchrone est un objet report.
Si la demande a été validée, les premières propriétés de l'objet contiennent des métadonnées qui
décrit la demande que vous avez envoyée. Le rapport lui-même se trouve dans la rows
de l'objet
.
{ "kind":"doubleclicksearch#report", "request":{ "columns":[ {"columnName":"date"}, {"columnName":"dfaRevenue"}, {"columnName":"visits","endDate":"2013-01-31","headerText":"visits last month","startDate":"2013-01-01"} ], "includeDeletedEntities":false, "reportScope":{ "agencyId":"12300000000000456", "advertiserId":"21700000000011523", "engineAccountId":"700000000073991" }, "reportType":"account", "rowCount":10000, "startRow":0, "statisticsCurrency":"agency", "timeRange":{ "endDate":"2013-05-01", "startDate":"2012-05-01" } }, "rowCount":366, "rows":[ { "date":"2012-05-01", "dfaRevenue":0.0, "visits last month":0.0 }, { "date":"2012-05-02", "dfaRevenue":0.0, "visits last month":0.0 }, { "date":"2012-05-03", "dfaRevenue":0.0, "visits last month":0.0 }, { "date":"2012-05-04", "dfaRevenue":0.0, "visits last month":0.0 }, ... ] }
En cas d'échec de la validation
Si le rapport échoue, Search Ads 360 renvoie une réponse HTTP 400
.
avec un objet "error". Par exemple, l'exemple de requête ci-dessus ne spécifie pas de valeur réelle
agence:
{ "error": { "code": 400, "message": "statisticsCurrency: the agency in scope does not have a valid currency. Please make sure the agency is properly initialized in Search Ads 360." } }
Division des rapports synchrones en plusieurs réponses
Par défaut, une requête synchrone renvoie les 10 000 premières lignes. Pour modifier ce comportement,
utiliser l'Reports.request.startRow
et Reports.request.rowCount
pour récupérer des parties spécifiques du rapport avec chaque demande.
Exemple de division d'un rapport synchrone
Par exemple, cette demande renvoie les cent premières lignes (0 à 99) d'un rapport sur une agence. segmentée par jour:
{ "reportScope": { "agencyId": "12300000000000456", // Replace with your ID "advertiserId": "21700000000011523", // Replace with your ID "engineAccountId": "700000000073991" // Replace with your ID }, "reportType": "account", "columns": [ { "columnName": "date" }, { "columnName": "dfaRevenue" } ], "timeRange" : { "startDate" : "2012-05-01", "endDate" : "2013-05-01" }, "startRow":"0", "rowCount":"100", "statisticsCurrency": "agency", "verifySingleTimeZone": false, "includeRemovedEntities": false }
Vous pouvez faire suivre cette requête d'une autre requête pour les lignes 100 à 199:
{ "reportScope": { "agencyId": "12300000000000456", // Replace with your ID "advertiserId": "21700000000011523", // Replace with your ID "engineAccountId": "700000000073991" // Replace with your ID }, "reportType": "account", "columns": [ { "columnName": "date" }, { "columnName": "dfaRevenue" } ], "timeRange" : { "startDate" : "2012-05-01", "endDate" : "2013-05-01" }, "startRow":"100", "rowCount":"100", "statisticsCurrency": "agency", "verifySingleTimeZone": false, "includeRemovedEntities": false }