puppeteerでreCAPTCHAのボタンをクリックする方法

部屋の掃除は月1回。どうも、伊藤くんです。

この度、ロボットを判定?するシステムであるreCAPTCHAの、「私はロボットではありません」ボタンをクリックする処理をpupeteerで書くことになり、意外にも苦戦したのでそのやり方をメモに残しておきます。

ちなみに、決してreCAPTCHAを突破するプログラムとかを作っているわけではなく、とある理由で「私はロボットではありません」のチェックボックスのみをクリックする処理を書いただけなので、決して悪いことしてるわけではないですよ。

この記事を見た方も、絶対に悪いことには使用しないでください!

最初に結論

1、page.frames().find(…)でiframeを取得
2、puppeteer.launchにargs: [‘–disable-features=site-per-process’]を設定

では、詳しく解説していきます。

1、iframeを取得

iframeとは、外部ページのURLをsrc=で指定するとそのページの内容をインラインフレームで表示できるタグです。
reCAPTCHAは、このiframeで埋め込まれているため、まずはそれを取得します。

const iframe = await page
  .frames()
  .find((f) =>
    f.url().startsWith('取得したいiframeのURL(パラメータ部分は必要なし)')
  );

よくiframeの取得時にURLではなくnameで取得する処理を見かけますが、iframeにはnameがなかったりランダムな文字列っぽい感じになっていたりするので、URLで取得する方がいいのではと思います。reCAPTCHAがまさにそれにあたります。

これでiframeを取得したあとは、await (await iframe.$(‘selector’)).click()みたいな感じでボタンをクリックできます。

2、puppeteer.launchの設定

これで完了です。みたいな感じで書きましたが、reCAPTCHAさんはこれだけでは許してくれませんでした。なんかよく分かりませんがこれだけではうまく取得できません。

これの解決策は、Browserインスタンスを作成する時のlaunch()メソッドで、args: [‘–disable-features=site-per-process’]というオプションを指定します。

return (async () => {
  const browser = await puppeteer.launch({
    args: [
      '--disable-features=site-per-process'
]
});
return browser;
})();

これでなんかよく分かりませんがiframeをいい感じに取得できるようになります。このオプションの意味は正直よく分かりませんが…

しかし、このオプションをつけるとなぜか立ち上がったブラウザ内でのデベロッパーモードができなくなります。ご注意ください。

参考 : https://github.com/GoogleChrome/puppeteer/issues/2548

追記 : あとで気づきましたが、このオプションが必要なのはヘッドレスモードがoffの時だけで、onの時はこのオプションなしでも問題なくiframeを取得できたみたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です