Puppeteerで位置情報(Geolocation)取得許可と位置(緯度経度)指定する方法と注意点

Puppeteerを操作する際に位置情報が重要になることありますが、普通に操作しらたPuppeteerが動作しているマシンの大体の位置が利用されます。
例えば、Googleの検索だとマシンのIPで大体の位置を特定してその位置を使います。
さらに、位置情報を取得するにはユーザーによる許可(permission)が必要ですが、何も設定していないと手動で許可しないといけなくなるので、自動化にはなりませんよね。
今回はPuppeteerで位置情報(Geolocation)取得許可(permission default allow)して、さらにPuppeteerで緯度と経度を指定する方法を書いてみます。

とりあえずやってみよう

下の例は許可するoriginを「www.google.com」 を例としてあげます。

位置情報を取得許可

const context = browser.defaultBrowserContext();
await context.overridePermissions('https://www.google.com/', ['geolocation']);

緯度と経度を設定

await page.setGeolocation({
  latitude: fetchParams.geolocation.latitude,
  longitude: fetchParams.geolocation.longitude,
  accuracy: 100
});

注意点

httpsを使う

位置情報を取得するにはhttpsプロトコルを利用する必要があります。 httpではダメです。
ブラウザーにもよりますが、ChromeだとGeolocation API はセキュアなコンテキスト(HTTPS)でのみ機能します。セキュアでない仕組み(HTTP など)でホストされているサイトの場合、ユーザーの場所を取得するリクエストは機能しなくなります。
https://developers.google.com/web/fundamentals/native-hardware/user-location?hl=ja

accuracyを設定する

accuracyを元に、この位置情報を使うかどうか判断するサイトもあります。
例えばGoogleの場合、accuracyが設定されていないと、IPを利用して現在地を特定します。

参考

Puppeteer公式: https://devdocs.io/puppeteer/#browsercontextoverridepermissionsorigin-permissions

Originについて説明: https://developer.mozilla.org/en-US/docs/Glossary/Origin