動かざることバグの如し

近づきたいよ 君の理想に

Puppeteerで位置情報取得を有効化して現在地を偽造する

環境

  • Nodejs 12
  • puppeteer 1.17

概要

puppeteerは本当に便利で、やろうと思えば(大抵のことは)なんでもできる。今回は現在位置をうまく偽装してみる。

コード

今回は東京駅にセットしてみる。ただしデフォルトではブラウザの左上の確認プロンプトが出てしまって一生JavascriptGPSにアクセスできないので、overridePermissions()を使って現在地取得を許可しておく

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const url = 'https://map.ultra-zone.net/g/';

  // geolocationを有効化
  const context = browser.defaultBrowserContext();
  await context.overridePermissions(url, ['geolocation']);
  // 現在位置を東京駅にセット
  const client = await page.target().createCDPSession();
  await client.send('Emulation.setGeolocationOverride', {
    latitude: 35.681236,
    longitude: 139.767125,
    accuracy: 100
  });

  await page.goto(url);
  await page.screenshot({
    path: 'example.png'
  });

  const result = await page.evaluate(() => {
    return new Promise(resolve => {
      navigator.geolocation.getCurrentPosition(position => {
        resolve({lat: position.coords.latitude, lng: position.coords.longitude});
      });
    });
  });
  console.log(result);

  await browser.close();
})();

実行して以下のように表示されればおk

 $node index.js
{ lat: 35.681236, lng: 139.767125 }

f:id:thr3a:20190525145732p:plain

まぁ悪用厳禁ってことでね(