ブログ
各reCaptchaバージョンのコールバック関数を見つける方法

reCaptchaの各バージョンのコールバック関数の見つけ方

WARNING

すべてのウェブサイトは異なります。以下の方法が問題を解決できない場合、 独自に調査を進めてください。

APIを介して正常に認識されたgRecaptchaResponseの値を取得した後、seleniumなどの模倣ソフトウェアを使用している場合、正常に認識されたことをウェブページに伝えるためにコールバック関数を実行する必要があります。コールバック関数を見つける方法を学びましょう。

注意:一部の場合、コールバック関数が存在しないことがあります。この場合、g-recaptcha-responseコンテナに直接値を割り当ててフォームを送信できます。

方法1:コンソール要素を通じて検索

表示されているページを開き、F12キーを押してコンソールに入り、要素内でCtrl+Fを押して検索し、検索キーワード:data-callback

以下のように、ここで私たちのコールバック関数はonSuccessです。それから、この関数をseleniumで実行するだけです。

見つからない場合、混乱しているか、その他の状況かもしれないため、他の方法を試すことができます。

driver.execute_script(f'onSuccess("{gRecaptchaResponse}")')

img.png

方法2:reCaptcha V3シリーズに適用

方法1と同様に、キーワードを検索します:grecaptcha.render

同様のコードを見つけ、コールバックはコールバック関数です。

grecaptcha.render('example', {
  'sitekey': 'someSitekey',
  'callback': myCallbackFunction,
  'theme': 'dark'
});

方法3:コンソールを通じて検索

F12キーを押してコンソールに入り、___grecaptcha_cfg.clientsを入力します。エラーが報告される場合、ウェブページはreCaptchaをロードしていません。

通常、多くのノードがありますので、違いに注意を払う必要があります。ここでonSuccessは私たちが探しているコールバック関数です。

img.png

方法4:自動検索関数を使用して検索

上記の方法を実行するのが難しい場合は、自動検索関数を定義して検索することもできます。

F12キーを押してコンソールに入り、次の自動定義関数findRecaptchaClients()を入力します。

 
function findRecaptchaClients() {
// eslint-disable-next-line camelcase
  if (typeof (___grecaptcha_cfg) !== 'undefined') {
// eslint-disable-next-line camelcase, no-undef
    return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
      const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' }
      const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object')
 
      objects.forEach(([toplevelKey, toplevel]) => {
        const found = Object.entries(toplevel).find(([_, value]) => (
          value && typeof value === 'object' && 'sitekey' in value && 'size' in value
        ))
 
        if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV') {
          data.pageurl = toplevel.baseURI
        }
 
        if (found) {
          const [sublevelKey, sublevel] = found
 
          data.sitekey = sublevel.sitekey
          const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback'
          const callback = sublevel[callbackKey]
          if (!callback) {
            data.callback = null
            data.function = null
          } else {
            data.function = callback
            const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('')
            data.callback = `___grecaptcha_cfg.clients${keys}`
          }
        }
      })
      return data
    })
 
  }
  return []
}
 
findRecaptchaClients && findRecaptchaClients()

次に、この関数findRecaptchaClients()コンソールで実行して、対応する関数を見つけます。

[
  {
    "id": "0",
    "version": "V2",
    "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "function": "onSuccess",
    "callback": "___grecaptcha_cfg.clients['0']['l']['l']['callback']",
    "pageurl": "https://www.google.com/recaptcha/api2/demo"
  }
]

「reCaptcha」匿名関数の呼び出し方は?

注意:見つかったコールバック関数が関数名である場合、例えば上記の`

onSuccessのように、呼び出す際には単にonSuccess(gRecaptchaResponse)`を呼び出すだけです。しかし、見つかったコールバック関数が匿名関数である場合、つまり関数名が存在しない場合があります。次のような場合です。

この匿名関数の場合、先ほど見つけた完全なパスに従って実行するだけで、効果は同じです。例えば:

___grecaptcha_cfg.clients.xxxxxxxxx.xxxxx.xxxxx.callback(gRecaptchaResponse)

このウェブサイトを例に取りましょう。___grecaptcha_cfg.clientsを入力して検索を展開でき、ここでコールバック関数promise-callbackが匿名関数であることがわかりますf(token)

img.png

これに対して右クリックし、「Copy property path」をクリックしてこのノードパスをコピーできます

[100000].l.l["promise-callback"]("gRecaptchaResponse")

___grecaptcha_cfg.clientsを追加し、この関数の完全なパスを取得できます

___grecaptcha_cfg.clients[100000].l.l["promise-callback"]

最後に、上記で説明した実行方法と同じです。通常の関数として実行するだけです

___grecaptcha_cfg.clients[100000].l.l["promise-callback"](gRecaptchaResponse)