TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

GoogleAdwordsAPIで指定したキーワードの月間平均検索ボリュームと競合性を取得する。


Google Adwords APIでキーワードの検索ボリュームを取得する話。
前提として、MCCアカウントの取得やOAuthまわりの設定などを済ませておくこと。

キーワード候補を取得するRequestType::IDEASのサンプルはよく見かけるけど、任意のキーワードのボリュームだけ取得したいという場合に使うRequestType::STATSのサンプルはほぼ見つかりませんでした。
なので、今回はキーワード候補取得の公式サンプルをベースに、キーワードのボリュームと競合性を取得するサンプルをPHP書いてみました。

なお、キーワードを配列で複数指定することもできるんですが、返される順番がバラバラだったり、キーワードの大文字小文字などが加工される場合があったりと、
いろいろ面倒なので今回はシングルワードでやってみました。

RateExceededErrorが返された場合、その中にスリープのイターバルが指定されるので、getRetryAfterSeconds()で取得してその秒数分スリープします。
APIの利用数制限が設定されているので、超過しないようにリクエストの間隔を調整する必要があります。
apiに迷惑をかけないよう、ループで処理する際にはあらかじめスリープをかけておくべきでしょう。


  • クライアントライブラリ

https://developers.google.com/adwords/api/docs/clientlibraries?hl=ja
今回はPHPで試してみました。

<?php

require __DIR__ . '/./googleads-php-lib/vendor/autoload.php';
use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\AdWordsSession;
use Google\AdsApi\AdWords\AdWordsSessionBuilder;
use Google\AdsApi\AdWords\v201708\cm\Keyword;
use Google\AdsApi\AdWords\v201708\cm\Language;
use Google\AdsApi\AdWords\v201708\cm\NetworkSetting;
use Google\AdsApi\AdWords\v201708\cm\Paging;
use Google\AdsApi\AdWords\v201708\cm\ApiException;
use Google\AdsApi\AdWords\v201708\cm\RateExceededError;
use Google\AdsApi\AdWords\v201708\o\AttributeType;
use Google\AdsApi\AdWords\v201708\o\IdeaType;
use Google\AdsApi\AdWords\v201708\o\LanguageSearchParameter;
use Google\AdsApi\AdWords\v201708\o\NetworkSearchParameter;
use Google\AdsApi\AdWords\v201708\o\RelatedToQuerySearchParameter;
use Google\AdsApi\AdWords\v201708\o\RequestType;
use Google\AdsApi\AdWords\v201708\o\TargetingIdeaSelector;
use Google\AdsApi\AdWords\v201708\o\TargetingIdeaService;
use Google\AdsApi\Common\OAuth2TokenBuilder;
use Google\AdsApi\Common\Util\MapEntries;

class GoogleAdwords {

    const INI_FILE = "path/to/adsapi_php.ini";

    public static function main($keyword) {
        $oAuth2Credential = (new OAuth2TokenBuilder())
            ->fromFile(self::INI_FILE)
            ->build();

        $session = (new AdWordsSessionBuilder())
            ->fromFile(self::INI_FILE)
            ->withOAuth2Credential($oAuth2Credential)
            ->build();

        return self::getVolume(new AdWordsServices(), $session, $keyword);
    }

    public static function get(AdWordsServices $adWordsServices, AdWordsSession $session, $keyword) {
        $ret = [];
        $ret["original_keyword"] = $keyword;
        $ret["keyword"] = "";
        $ret["volume"] = 0;
        $ret["competition"] = 0;

        try {
            $targetingIdeaService = $adWordsServices->get($session, TargetingIdeaService::class);
            $selector = new TargetingIdeaSelector();

            // Set "STATS" to Request type.
            $selector->setRequestType(RequestType::STATS);
            $selector->setIdeaType(IdeaType::KEYWORD);
            // Set Attributes you want to get.
            $selector->setRequestedAttributeTypes([
                AttributeType::KEYWORD_TEXT,
                AttributeType::COMPETITION,
                AttributeType::TARGETED_MONTHLY_SEARCHES,
            ]);
            $searchParameters = [];
            $relatedToQuerySearchParameter = new RelatedToQuerySearchParameter();
            $relatedToQuerySearchParameter->setQueries([$keyword]);
            $searchParameters[] = $relatedToQuerySearchParameter;
            $languageParameter = new LanguageSearchParameter();
            // Japanese
            $jp = new Language();
            $jp->setId(1005);
            $languageParameter->setLanguages([$jp]);
            $searchParameters[] = $languageParameter;
            $networkSetting = new NetworkSetting();
            $networkSetting->setTargetGoogleSearch(true);
            $networkSetting->setTargetSearchNetwork(false);
            $networkSetting->setTargetContentNetwork(false);
            $networkSetting->setTargetPartnerSearchNetwork(false);
            $networkSearchParameter = new NetworkSearchParameter();
            $networkSearchParameter->setNetworkSetting($networkSetting);
            $searchParameters[] = $networkSearchParameter;
            $selector->setSearchParameters($searchParameters);
            $selector->setPaging(new Paging(0, 1));

            $page = $targetingIdeaService->get($selector);
            if ($page->getEntries() !== null && $page->getTotalNumEntries() > 0) {
                foreach ($page->getEntries() as $targetingIdea) {
                    $data = MapEntries::toAssociativeArray($targetingIdea->getData());
                    $ret["keyword"] = $data[AttributeType::KEYWORD_TEXT]->getValue();
                    // getValue()は月間平均検索ボリュームを月別に配列で返してくれる。今回はlatestを取得
                    $ret["volume"] =
                        ($data[AttributeType::TARGETED_MONTHLY_SEARCHES]->getValue() !== null) ? $data[AttributeType::TARGETED_MONTHLY_SEARCHES]->getValue()[0]->getCount() : 0;
                    $ret["competition"] = ($data[AttributeType::COMPETITION]->getValue() !== null) ? $data[AttributeType::COMPETITION]->getValue() : 0;
                    $ret["competition"] = round($ret["competition"],4);
                }
            }

        } catch (ApiException $ae) {
            foreach ($ae->getErrors() as $error) {
                if ($error instanceof RateExceededError) {
                    // You had better handle exeptions with based on this.
                    // $ret["retry_interval"] = $error->getRetryAfterSeconds() + 1;
                }
            }

        } catch (\Exception $e) {
            // Do something...

        } finally {
            return $ret;
        }
    }
}

以下の様に呼び出せばキーワードのボリュームと競合性が取得できます。

// ループで処理する場合はスリープを入れる
$ret = GoogleAdwords::main("Any keyword");


githubにもあります。
https://github.com/kentaro-a/GoogleAdwordsApiSample/blob/master/GoogleAdwords.php