最近、自動化システム開発依頼が多い。。。
その中でも、広告数値を自動で抽出してほしいという依頼が多く、とりかかっていたら日本語の記事が少ないと思ったので、「これは記事にしておいたほうがいいな」と思いました。
まー割とエンジニアとしてやっているかたは、リファレンスみるだけで進められると思うのですが、初学者にとってはリファレンスもよくわからないという方も多いと思います。(現に私も昔はリファレンスは情報が多すぎて、よくわからない状態でした(笑))
目次
Yahoo広告APIの申請からスタート
まずはYahooに「広告のAPIを使いたいです」という申請をし、Yahooから「使っていいですよ」という回答が返ってきたら、使えるようになります。
以下URLからYahooのDeveloper Centerというところに飛んでください。
https://ads-developers.yahoo.co.jp/developercenter/ja/yahoo-ads-api/
以下のような画面が出てくるかと思います。

スタートアップガイドからお申込み手順をクリックしてください。

そうしたら、以下のように選択肢が[A][B][C]とでてきます。
すでに広告を行っているかと思いますので、[A]を選択してください

すると、ログイン情報を求められるので、IDとパスワードをそれぞれ入力していきます。

ログイン情報を入力したら、申し込みフォームがでてきますので、それぞれ入力していきます。
使用用途等を細かく入力する必要がありますので、なるべく詳細に入力してください。
※YahooAPIを申請する際は、登録しているメールアドレスがフリーアドレス(gmail等の無料のアドレス)だと使えませんので、それ以外のアドレスを使うようにしてください。会社の申請であれば、@以下を会社のアドレスに変更してください。
入力が完了したら、待ちです。大体3日から1週間程度かかるといわれています。
API申請後、アプリケーションの登録へ
API申請が認証されたら、再度先ほどのURLをたたきます。
https://ads-developers.yahoo.co.jp/developercenter/ja/yahoo-ads-api/
今度はアプリケーションを登録してきます。
こちらの進め方はdeveloper centerに乗っているので、その通りに進めてください。

APIコールを実施する
アプリケーションの登録が完了したら、実際にAPIが呼べるかどうか確認します。
developer center からスタートアップガイド>APIコールを実施するをクリックします。

進め方は書いてあるとおりですが、より詳細にお伝えしていきます。
API認証設定

青枠の部分をエディタORメモ帳にコピペします。
コピペしたら、アプリケーション登録で取得したClient_ID,Redirect_URIを取得した内容に修正していきます。
修正したら、ブラウザにそのURLをペーストし、アクセスすると
認証画面が表示されるので、承認をクリックします。

すると、認可コード(Auth_code)と呼ばれるものが画面上に表示されるので、エディタORメモ帳にコピペします。
アクセストークンの取得

上記で取得したClient_ID,Client_secret,Redirect_uri,Auth_codeをそれぞれ修正し、再度ブラウザにペーストして、アクセスしていきます。

すると、上記のようにaccess_tokenと記載されたデータが画面上にでてくると思うので、それをまたメモ帳ORエディタにコピーします。
※yahooのアクセストークンは1時間で失効しますので、スクリプトから実行する場合は、リフレッシュトークンを使って取得します。(スクリプトからの取得例は後述します)

API認証確認
ここまでくれば、あとはAPIがちゃんと認証できているか確認するだけです。
おそらくエンジニアでない方や初学者の方は以下の6番で躓いてしまうのではないかと思います。

HTTPヘッダー??HTTPステータスコード??200レスポンス??となってしまいますよね。
今回はそれが何なのかは置いておいて、やり方だけ記載致しますね。
まず、以下URLにアクセスしてください。
https://ads-developers.yahoo.co.jp/reference/ads-search-api/
こちらは、yahoo広告APIのリファレンスです。通常はこちらを参照して、プログラムを組んでいきます。
アクセスしたら、Authorizeをクリックします。

クリックしたら、以下のような画面がでてくるかと思いますので、
上記で取得したClientID,Client_secretをいれて、scopesをクリックし、Authorizeをクリックしてください。
その後認証画面が表示され、進むとまたこの画面に戻ってきます。

認証が済んで画面に戻ってきたら、closeをクリックします。
そうしたら、下にスクロールしていき、
「ReportDefinitionService」をクリックし、「getReportFields」をクリックします。

自動で下にスクロールされたかと思いますので、
続いて「/ReportDefinitionService/getReportFields」をクリックし、「Try it out」をクリックします。

すると、以下のように出てくると思いますので、「Execute」をクリックします。

下にスクロールすると「Responses」と記載があり、codeの部分を見ると200になっているかと思います。こちらが上記のHTTPレスポンス200のことです。
これで、ちゃんと認証されていることが確認できました。

(例)GASでレポートを取得し、スプレッドシートに日時反映
今回は数あるスクリプトの中からGASで実装したスクリプトをご紹介しようかと思います。
非エンジニアの方もGASであれば書いたことがある、理解できるといった方も多いかと思いましたので、こちらを例にとりました。
以下スクリプトです。
// Yahoo!広告の認証
const URL_TOKEN = 'https://biz-oauth.yahoo.co.jp/oauth/v1/token';
const YSS_URL_API = 'https://ads-search.yahooapis.jp/api/v1';
const YDN_URL_API = 'https://ads-display.yahooapis.jp/api/v1';
const YAHOO_CLIENT_ID = '取得したCLIENTIDをいれてください';
const YAHOO_CLIENT_SECRET = '取得したCLIENTSECRETをいれてください';
const YAHOO_REFRESH_TOKEN = '取得したREFRESHTOKENをいれてください';
const YSS_ACCOUNT_ID = "アカウントIDを入れてください";
const YDN_ACCOUNT_ID = "アカウントIDを入れてください";
//昨日の日付取得
function getYesterday() {
var date = new Date();
var today = Utilities.formatDate(date, 'JST', 'yyyyMMdd');
var day = date.getDate();
date.setDate(day-1);
var yesterday = Utilities.formatDate(date, 'JST', 'yyyyMMdd');
return yesterday;
}
// 出力先シート名
var yss_group_day_sheet_name = 'シート名をいれてください';
var ydn_campaign_day_sheet_name = 'シート名をいれてください';
var access_token = getAccessToken(YAHOO_REFRESH_TOKEN);
//YSS
function yss_Group_Day_Report() {
var YSS_GROUP_DAY_REPORT_JOB_ID = yss_group_day_report_getReportJobId(YSS_URL_API, access_token, YSS_ACCOUNT_ID);
Utilities.sleep(60000);
var yss_group_day_data = downloadReport(YSS_URL_API, access_token, YSS_ACCOUNT_ID, YSS_GROUP_DAY_REPORT_JOB_ID);
updateCsv(yss_group_day_sheet_name, yss_group_day_data);
}
//YDN
function ydn_Campaign_Day_Report(){
var YDN_CAMPAIGN_DAY_REPORT_JOB_ID = ydn_campaign_day_report_getReportJobId(YDN_URL_API, access_token, YDN_ACCOUNT_ID);
Utilities.sleep(60000);
var ydn_campaign_day_data = downloadReport(YDN_URL_API, access_token, YDN_ACCOUNT_ID, YDN_CAMPAIGN_DAY_REPORT_JOB_ID);
updateCsv(ydn_campaign_day_sheet_name, ydn_campaign_day_data);
}
//スプレッドシートに記載
function updateCsv(sheet_name, data) {
var values = Utilities.parseCsv(data);
var this_sheet = SpreadsheetApp.getActive().getSheetByName(sheet_name);
var firstlastrow = this_sheet.getLastRow();
var headerrow = this_sheet.getLastRow() +1;
this_sheet.getRange(headerrow, 1, values.length, values[0].length).setValues(values);
this_sheet.deleteRows(headerrow);
var lastrow = this_sheet.getLastRow();
this_sheet.deleteRows(lastrow);
}
//アクセストークン再取得
function getAccessToken(refresh_token) {
var payload = {
grant_type: 'refresh_token',
client_id: YAHOO_CLIENT_ID,
client_secret: YAHOO_CLIENT_SECRET,
refresh_token: refresh_token
};
var params = {
payload : payload
};
var response = UrlFetchApp.fetch(URL_TOKEN, params);
var response_body = JSON.parse(response.getContentText());
return response_body['access_token'];
}
//YSSのレポートJOBIDを取得
function yss_group_day_report_getReportJobId(url, access_token, account_id) {
var headers = {
'Authorization': 'Bearer ' + access_token
};
var payload = {
"accountId": account_id,
"operand": [{
"accountId": account_id,
"dateRange": {
"endDate": getYesterday(),
"startDate": getYesterday()
},
"reportDateRangeType": "CUSTOM_DATE",
"reportDownloadEncode": "UTF-8",
"reportDownloadFormat": "CSV",
"fields": [
"DAY",
"CAMPAIGN_NAME",
"IMPS"
],
"reportIncludeZeroImpressions": "FALSE",
"reportLanguage": "JA",
"reportName": "yss_group_day_report",
"reportType": "ADGROUP",
"sortFields": [
{
"field": "DAY",
"reportSortType": "ASC"
}
]
}]
};
var params = {
method : 'post',
contentType: 'application/json',
headers: headers,
payload: JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url + "/ReportDefinitionService/add", params);
var response_body = JSON.parse(response);
var reportJobId = response_body["rval"]["values"][0]["reportDefinition"]["reportJobId"];
return Number(reportJobId);
}
//YDNのレポートJOBIDを取得
function ydn_campaign_day_report_getReportJobId(url, access_token, account_id) {
var headers = {
'Authorization': 'Bearer ' + access_token
};
var payload = {
"accountId": account_id,
"operand": [{
"accountId": account_id,
"dateRange": {
"endDate": getYesterday(),
"startDate": getYesterday()
},
"dateRangeType": "CUSTOM_DATE",
"downloadEncode": "UTF-8",
"downloadFormat": "CSV",
"fields": [
"DAY",
"CAMPAIGN_NAME",
"IMPS"
],
"filters": [
{
"field": "IMPS",
"filterOperator": "GREATER_THAN_EQUALS",
"values": [
"1"
]
}
],
"lang": "JA",
"reportName": "ydn_campaign_day_report",
"sortFields": [
{
"field": "DAY",
"reportSortType": "ASC"
}
]
}]
};
var params = {
method : 'post',
contentType: 'application/json',
headers: headers,
payload: JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url + "/ReportDefinitionService/add", params);
var response_body = JSON.parse(response);
var reportJobId = response_body["rval"]["values"][0]["reportDefinition"]["reportJobId"];
return Number(reportJobId);
};
//レポートをダウンロード
function downloadReport(url, access_token, account_id, report_jod_id) {
var headers = {
'Authorization': 'Bearer ' + access_token
};
var payload = {
accountId: account_id,
reportJobId: report_jod_id
};
var params = {
method : 'post',
contentType: 'application/json',
headers: headers,
payload: JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url + '/ReportDefinitionService/download', params);
return response;
}
こちらの例では、
YSSとYDNを別々のシートに昨日分のデータだけ取得・更新していくようになっております。
取得するデータは、日、キャンペーン名、インプレッション数としております。
また、yahooはレポートを裏で登録して取得するような仕様になっているため、毎回レポートを登録する必要があります。ちょっと面倒です。。。
関数でいうと、○○getReportJobIdという部分です。こちらでURLとアカウントID、取得するレポート内容を指定してあげて、Curlの代わりにFetchでレスポンスを流している形になります。
この関数がないと、例えば毎日、毎月データを更新していきたいという場合はそれができなくなってしまうので、注意が必要です。要するに一回レポートを登録していけばデータが更新されるわけではなく、毎回日付を指定してあげて、レポートを更新しないといけないということです。。。
googleだったら、そんな面倒な仕様ではなく、単に日付指定してあげるだけでとってこれるんですけどね(笑)
あと、重要なところでいうとアクセストークンの部分です。
上記のYahoo広告API設定時にもお伝えしましたが、アクセストークンは1時間で失効してしまうため、アクセスする都度更新する必要があります。
関数でいうと、getAccessTokenの部分でリフレッシュトークンを使って、レスポンスを投げる形です。
こちらもないとアクセスそのものができなくなってしまうので、注意が必要です。
細かく説明すると結構きりがなくなってきてしまうので、こんなところにしておこうかと思います。
まとめ

今回はYahoo広告のAPIで数値を自動取得することについて、記事を書いていきました。
私は本当に言語化して説明するのが苦手で、その練習のためにブログで発信しようと思った次第です。自分の復習にもなるし。
ただ、記事を書くのってあまり得意じゃなくて、この時間をコード書く時間にしたほうが成長するじゃんってたまに思ったりもするのですが、私ももう社会人二年目で下に後輩もついてきたので、一人でただやるわけにもいきません。
そのためにはやはり説明する力、プレゼンする力というのは必須になってきますよね。
なので、これからもなるべくプロダクト作ったら、ブログにアウトプットしていこうかなと思います。
もしこの記事が好評だったらgoogleAPIの連携から数値抽出、GAAPIの連携から数値抽出、自動インポートの記事なども書こうかなと思います。
ではまた。