SpookyJSでadwordsとスポンサードサーチとYDNのレポートをダウンロード
GoogleもYahooも広告配信レポートを現在APIでダウンロードすることができません。Google AdwordsではAPIで簡易的にレポートを作成できますが、インプレッションシェアなどの指標を指定することが出来ず、中途半端です。
メールで作られたよと報告はされるのですが、どうせなら送ってほしいものですよね。
というわけで全部ダウンロードするスクリプトを書いたのですが、私のMac Book Airちゃんがぶっ壊れてタイムマシーンで2週間前に戻ってしまい、危機感を覚えたのでここにメモしておきます。作業途中的な感じですが、わたくしの記憶力が普通の人間と同じぐらいであれば1週間後には出来上がっていると思います。
ダウンロードスクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
// user settings | |
var G_ID = "google_id", | |
G_PASS = "google_pass", | |
Y_ID = "y_id", | |
Y_PASS = "y_pass"; | |
// wait setting | |
var waitTime = 5000; | |
// UA setting | |
var UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36"; | |
// URL settings | |
var Y_URL = "https://login.bizmanager.yahoo.co.jp/login?url=https://promotionalads.business.yahoo.co.jp"; | |
try { | |
var Spooky = require('spooky'); | |
} catch (e) { | |
var Spooky = require('../lib/spooky'); | |
} | |
if (process.argv.length < 3) { | |
console.log('missing argument.'); | |
return; | |
}else{ | |
var argValue = process.argv; | |
console.log(argValue); | |
} | |
var spooky = new Spooky({ | |
child: { | |
transport: 'http' | |
}, | |
casper: { | |
logLevel: 'debug', | |
verbose: true | |
} | |
}, | |
function (err) { | |
if (err) { | |
e = new Error('Failed to initialize SpookyJS'); | |
e.details = err; | |
throw e; | |
} | |
spooky.userAgent(UA); | |
spooky.start(Y_URL); | |
spooky.then(function () { | |
this.evaluate(function(id,password) { | |
document.getElementById('user_name').value = id; | |
document.getElementById('password').value = password; | |
document.login_form.submit(); | |
}, "y_id","y_pass"); | |
}); | |
spooky.wait(waitTime, function() { | |
this.click('a[sl="header_SS"]'); | |
}); | |
spooky.wait(waitTime, function() { | |
this.click('a[sl="header_SSReports"]'); | |
}); | |
spooky.wait(waitTime, function() { | |
var response = this.evaluate(function () { | |
var url = document.querySelector('tr[sl="ReportsReport_row_0"] a[sl=ReportsReport_download_]').href; | |
var title = document.getElementById('yjJtReportBody').getElementsByTagName('tr')[0].getElementsByTagName('td')[0].textContent; | |
var xhr = new XMLHttpRequest(), | |
dataString = "", | |
dataList = []; | |
method = "GET"; | |
var contentType = "application/x-www-form-urlencoded"; | |
xhr.open(method, url, false); | |
xhr.overrideMimeType("text/plain; charset=shift_jis"); | |
if (method === "POST") { | |
if (typeof data === "object") { | |
for (var k in data) { | |
dataList.push(encodeURIComponent(k) + "=" + encodeURIComponent(data[k].toString())); | |
} | |
dataString = dataList.join('&'); | |
this.log("sendAJAX(): Using request data: '" + dataString + "'", "debug"); | |
} else if (typeof data === "string") { | |
dataString = data; | |
} | |
xhr.setRequestHeader("Content-Type", contentType); | |
} | |
xhr.send(method === "POST" ? dataString : null); | |
return { | |
data: xhr.responseText, | |
title: title | |
}; | |
}); | |
var fs = require('fs'); | |
fs.write(response.title+'.csv', response.data, 'w'); | |
}); | |
spooky.run(function(){ | |
this.exit(); | |
}); | |
}); | |
spooky.on('error', function (e, stack) { | |
console.error(e); | |
if (stack) { | |
console.log(stack); | |
} | |
}); | |
/* | |
// Uncomment this block to see all of the things Casper has to say. | |
// There are a lot. | |
// He has opinions. | |
spooky.on('console', function (line) { | |
console.log(line); | |
}); | |
*/ | |
spooky.on('hello', function (greeting) { | |
console.log(greeting); | |
}); | |
spooky.on('log', function (log) { | |
if (log.space === 'remote') { | |
console.log(log.message.replace(/ \- .*/, '')); | |
} | |
}); |
https://gist.github.com/tanshio/045c1e1193f97cfa5e05
使い方
要node.js、casperjs、spookyjs(package.jsonをあとで置いておきます)
最初の行のIDとかPassを自分のに変えて下さい。
まとめ
いまのところスポンサードサーチしか動きません。UTF-8のCSVなのでExcelでそのまま開くことが出来ません。