GoogleChrome/puppeteer: Headless Chrome Node API というHeadless Chromeを操作するJavaScriptライブラリが出たので使ってみました。

何度も実行してロボット判定されてしまったので、実際にはHeadlessで動作確認していないが(おそらく)こんな感じで取得できるはず。

2017/09/10追記

デバッグモード以外では毎回ロボット判定されてしまうため、Cookieからログインする方法に変えました。 初回ログイン時は、デバッグモードで動かし、Cookieを保存し、2回目以降はCookieからログインする。

インストール

yarn add puppeteer

コード

const puppeteer = require('puppeteer');
const fs = require('fs');

const cookies_path = './cookies_amazon.json';
const {AMAZON_ID, AMAZON_PW} = require('./config');

/**
 * debugモードでログイン
 */
async function login(page) {
  await page.goto('https://affiliate.amazon.co.jp/');
  await page.click('#a-autoid-0-announce');
  await page.waitFor(2000);

  await page.focus('#ap_email');
  await page.type(AMAZON_ID);
  await page.waitFor(2000);
  await page.focus('#ap_password');
  await page.type(AMAZON_PW);
  await page.waitFor(2000);

  await page.click('#signInSubmit');
  await page.waitFor(5000);
  await page.screenshot({path: 'images/amazon_logined.png'});
}

/**
 * Cookieを利用してログイン
 */
async function loginWithCookie(page) {
  const cookies = JSON.parse(fs.readFileSync(cookies_path, 'utf-8'));
  for (let cookie of cookies) {
    await page.setCookie(cookie);
  }
}

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
  });
  const page = await browser.newPage();
  await page.setViewport({width: 1280, height: 700});

  // await login(page);
  await loginWithCookie(page);
  await page.goto('https://affiliate.amazon.co.jp/home');
  await page.screenshot({path: 'images/amazon_login.png'});

  await page.goto('https://affiliate.amazon.co.jp/home/reports?ac-ms-src=summaryforthismonth');
  await page.waitForSelector('#ac-report-commission-commision-total');
  const commission = await page.evaluate(() => {
    return document.querySelector('#ac-report-commission-commision-total').textContent;
  });
  console.log(commission);

  await page.screenshot({path: 'images/amazon_after.png'});
  const afterCookies = await page.cookies();
  fs.writeFileSync('cookies_amazon.json', JSON.stringify(afterCookies));

  browser.close();
})();

Cookie操作

Cookie保存

const cookies = await page.cookies();
fs.writeFileSync('cookies_amazon.json', JSON.stringify(cookies));

Cookie取得・設定

const cookies_path = './cookies_amazon.json';
const cookies = JSON.parse(fs.readFileSync(cookies_path, 'utf-8'));
for (let cookie of cookies) {
  await page.setCookie(cookie);
}

こんな感じで保存したCookieを設定してあげることで、2回目以降Cookieを使ってログインできました。

参考