Adwords API からAds APIへの移行

こんにちは。AG-Boost事業部開発部の後藤です。現在AG-Boostというサービスの開発を行っております。 少し前にキャンペーンの取得に関してAdwords APIからGoogle Ads APIへの移行を実施した為、今回はその事を書いていこうと思います。

Adwords API,Ads APIとは?

両者ともGoogle広告アカウントを操作、変更するためのAPIであり、 これらを用いることで ・アカウントやキャンペーンの管理 ・レポート取得の自動化 などといったことを実現できます。

元々はAdwords APIが存在していましたが、2018年に新たにGoogle Ads API がベータ版としてリリースされ、その後本提供が開始され、2021年10月時点では双方とも利用可能な状態となっております。 ただし、Adwords API自体は更新が停止しており、2022年の4月には使えなくなってしまう為(https://ads-developers.googleblog.com/2021/04/upgrade-to-google-ads-api-from-adwords.html)、Ads APIへの移行が必須となっております。

Adwords APIとAds APIの違い

Adwords APIとAds APIの間では、クエリ言語が異なっております。 Adwords APIではAdWords Query Language (AWQL)を、Ads APIではGoogle Ads Query Language(GAWL)を用いております。 どちらもクエリライクな言語ではありますが、フィールド名などの書き方が異なっております。 例として、Ad Groupのレポート取得の違いが下記リンクで示されております(https://developers.google.com/google-ads/api/docs/migration/reports)

AWQLの場合はCampaignId,やAdGroupIdといった個別のフィールド名が定義されております。 対してGAQLの場合にはフィールド名はネスト状になり、campaign.idなどといった記述となります。これにより、ad_group.campaign.idのように、さらにネスト状にすることもできるようになっております。

データの取得

実際にcampaignデータの取得を行ってみます。 該当プロジェクトでは、Adwords APIではnode-adwords(https://www.npmjs.com/package/node-adwords)を Ads APIではgoogle-ads-api(https://www.npmjs.com/package/google-ads-api)を用いております。

AdwordsAPIでの取得

※こちらはnode-adwordsのusageを引用しております。

const AdwordsUser = require('node-adwords').AdwordsUser;
const config = {
  developerToken: // デベロッパートークン
  userAgent: // 組織名
  clientCustomerId: // Adwords アカウントID
  client_id:  // クライアントID
  client_secret: // クライアントシークレット
  refresh_token: // リフレッシュトークン
};


const user = new AdwordsUser(config);
const campaignService = user.getService('CampaignService', 'v201809');


const selector = {
  fields: ['CampaignId', 'CampaignName', 'Amount'],
  ordering: [{field: 'CampaignName', sortOrder: 'ASCENDING'}],
}

campaignService.get({serviceSelector: selector}, (error, result) => {
  console.log(error, result);
});

実行結果が

{
  totalNumEntries: XXX,
  'Page.Type': 'CampaignPage',
  entries: [
    { id: 'xxxxxxxxxxx', name: 'hoge', budget: XXXXX },,
    ...
  ]
}

となります。

AdsAPIでの取得
const {GoogleAdsApi} = require('google-ads-api');

(async () => {
  try {
    const client = new GoogleAdsApi({
      client_id: // クライアントID,
      client_secret: // クライアントシークレット,
      developer_token: // デベロッパートークン,
    });



    const customer = client.Customer({
      customer_id: // クライアントID
      login_customer_id: //ログインカスタマーID,
      refresh_token: // リフレッシュトークン,
    });


    const query =
      `SELECT campaign.name,campaign.id
       FROM campaign
       WHERE campaign.status != "REMOVED"`;

    const campaign = await customer.query(query);

    console.log(campaign);

  } catch (e) {
    console.log(e.errors);

  }
})();

こちらでこのような結果を得られます。

[
  {
    campaign: {
      name: ‘hoge’,
      id: xxxxxxxxxxx,
      resource_name: 'customers/customerId/campaigns/yyyyyyyy’
    },
    campaign_budget: {
      amount_micros: 12345678,
      resource_name: 'customers/customerId/campaignBudgets/zzzzzzzz’
    }
  },
  ... 
]

上で書きましたが、AWQLとGAQLでfieldの指定が異なる部分に注意してください。 Adwords APIとAds APIでのfieldsの違いはこちらのリンクを参照するとわかりやすいと思います。 (https://developers.google.com/google-ads/api/docs/migration/mapping)

後は実際に手を動かしてみて取得してみれば掴めてくるものも多いと思います。 GAQLでどんなクエリ書けるの?と疑問に思った方は下記リンクで確認することができますので、こちらを参照してみるとより理解が進むかもしれません。 (https://developers.google.com/google-ads/api/fields/v8/query_validator)

他に詰まったことがある場合、基本的にAds APIのmigrationに書いてあることが多いのでそちらを見るとわかることも多いかと思います。 (https://developers.google.com/google-ads/api/docs/migration)

少しでも参考になれば幸いです。