reCaptcha突破サービス「2captcha」の実装方法(node)

コンビニの店員さんに絶対顔覚えられてる。
どうも、伊藤くんです。

この度、reCaptchaを突破するサービスである「2captcha」をnodeで利用してみたので、その方法をメモしておきます。
つまり自動車の画像を選択してくださいみたいな認証のあれをプログラムで突破するやり方ってわけだす。
具体的には、2captchaからAPI経由でg-recaptcha-responseの値を取得します。g-recaptcha-responseの解説は後半でします。

あくまで実装方法です。サービスへの登録方法とかは他のサイトを参考にしてください。

結論から言いますと、すごく簡単に突破できます。
reCaptchaの存在意義を疑ってしまうほど簡単です。

注意点

最初に一応2つ注意点をば。

※1 お金がかかります

2captchaは有料サービスですので、お金がかかります。とはいえ、1回reCaptcha解かせるのにかかるお金はたったの0.4円(くらい)。金額的にはかなり良心的です。
でも有料サービスって時点でいくら安くても敷居が高くなりますよね。しかも2captchaは海外のサービスだし、何よりサービス内容自体がすでにグレーですからね。入金するのが怖い。
伊藤くんは勇気を振り絞って入金し、特に問題なく使えていますが、だからと言って絶対安全です!って言う保証はできません。
まあでもかなり大きなサービスですし、特にトラブルが起きたみたいなのも見聞きしませんので、大丈夫だろうとは思います。

※2 悪いこと・迷惑行為になるようなことはしちゃパメ!

まあそういうことです。あーはいはい常套句乙って感じかも知れませんが本当にね!
田舎の母ちゃんが泣くぞ!

API key確認

さてさて登録方法はすっ飛ばして本題へ入りましょう。nodeでの実装方法です。

まずAPI keyを確認してください。

これです。

久しぶりに画像貼りました。こういうのはシークレットな情報が写り込んでないか怖いですね。
他でもないAPI keyもシークレットな情報となりますので、人に見せてはダメですよ。
伊藤くんのAPI keyは個人情報保護法ちゃんが守ってくれています。今日も上を向いて生きていますね。

このAPI keyが確認できる状況になっていれば、とりあえずOKです。

実装:STEP1 reCaptcha解除始めてくださいリクエスト

それではコードを書いていきます。どうやら2captcha用のライブラリもあるようですが、それは使わずシンプルにAPIを叩く方法でいきます。

いきなりですが、最初にreCaptcha解除を始めちゃってくださいという旨のリクエストを投げます。

とりあえずコード載せますね。

const fetchCaptchaIdRequestUrl =
'http://2captcha.com/in.php?key=' +
ここに2captchaのAPI key +
'&method=userrecaptcha&googlekey=' +
ここにrecaptcha site key +
'&pageurl=' +
ここにrecaptchaが設置してあるページのURL;

const options = {
url: fetchCaptchaIdRequestUrl,
method: 'GET'
};

request(options, function(error, response, body) {
console.log(body);
});

とりあえず何をすればいいかっていのを伝えるためのコードだからね。くそコードとか言わないでね。これだからコードを載せたくないんですよ。

はい。すみません。コードを載せる時は言い訳を添えたくなるものなのです。

えっと見ての通り「http://2captcha.com/in.php」にGETでリクエスト投げるだけです。

でもってここ注意ポイントです。

このリクエストに対して、料金が発生します。(多分)

先ほど1回あたり0.4円だと申し上げましたが、このリクエストの回数×0.4円の支払い、というわけだす。(マジで多分)
間違って無限ループとかにならないようにお気をつけください。
そしてなんと伊藤くんはまさに無限ループをやらかしてしまいました。とはいえすぐ止めたので20円くらいしか持ってかれませんでしたが。

さて、このリクエストに必要なパラメータは3つです。1つ目と3つ目は説明もいらないと思うので、2つ目のパラメータの説明をします。「recaptcha site key」ってやつですね。
これは、recaptchaが設置してあるページにdiv.g-recaptchaというHTMLエレメントがあり、そのエレメントの「data-sitekey」という属性の値です。

2sZcwidAKDDDAAsck6Ac65aA-3J4aseAdSf3kz

みたいなやつです。
ブラウザのデベロッパーツールなどを使用し、この値を見つけたらどこかにメモしておいてください。
このrecaptcha site keyはページごとに一意なので、一度メモすればOKです。サイト側が何かしない限り、値は変わらないはずです。

ちょっと説明が雑なのは許してください。早く夜ご飯食べたいんです。

これでリクエストを投げる準備は整いました。上記のコードを参考に、GETリクエストを投げてみてください。
再度注意ですが、多分このタイミングで料金が発生します。0.4円ですが。
うまい棒1/25本と同じ料金です。うまい棒の方がお得やんけ!と感じた方は今すぐPCを閉じてうまい棒を買いに行くことをオススメします。できれば1/25本単位で売ってくれるお店に行くのがいいでしょう。

成功すれば、以下のような文字列のレスポンスが返ってきます。

OK|123456789

この「OK|~」が返ってこれば、あっちでreCaptchaの解除作業が開始されます。
あくまでこのレスポンスは正常に作業開始しましたよの合図であり、解除の結果ではありません。

あ、言い忘れていましたが、2captchaは人力らしいですw
実際にどこかの誰かがこれを受けてreCaptchaを解いていくらしいです。

利用者側はインターフェースだけ知っていれば、裏側でどんな処理が行われているか知らなくても利用できる、というのがAPIの魅力の1つですが、こんなにもその魅力を感じるAPIは人生で初めてですwww
それを意識するとこのAPIに愛着さえ湧いてきます。

でもって、このレスポンスの「OK|」以降の数字が、「captchaId」となります。
これを適当に「|」でsplitしたりして「OK|」を除き、captchaIdだけを取り出して変数などに保持しておきます。

実装:STEP2 終わりましたかー?リクエストポーリング

さて次は、reCaptcha解除終わりましたかー?の確認をするリクエストを投げます。

とりあえずコード。

const fetchRecaptchaTokenRequestUrl =
'http://2captcha.com/res.php?key=' +
ここに2captchaのAPI key +
'&action=get&id=' +
ここにcaptchaId;

const options = {
url: fetchRecaptchaTokenRequestUrl,
method: 'GET'
};

request(options, function(error, response, body) {
console.log(body);
});

これも簡単ですね。
「http://2captcha.com/res.php?key」にちょっとパラメータつけてGETリクエスト投げるだけです。

一つ目は2captchaのAPI key、二つ目はSTEP1で取得したcaptchaIdです。
シンポーですね。

これのレスポンスですが、最初はこんなんが返ってきます。

CAPCHA_NOT_READY

最初は戸惑いました。あれっなんか失敗してね?って感じでした。

しかしこれはこれで正常なレスポンスです。
このレスポンスの意味は、「まだ終わってないンゴよ」的な感じです。

なるほどなるほど。そこまでわかればあとは何をすべきか見えてきます。

そう、ズバリ、reCaptcha解除終了しましたのレスポンスが返って来るまで、このリクエストでポーリングを行うのです!!
ポーリング・・・一定間隔でリクエストを送り続けること

これが、この2captchaのちょっと特殊なところで、唯一ハマったところでした。

ポーリングの間隔ですが、公式ドキュメントには5秒以内でやってねと書いてありました。
伊藤くんはなんとなく4秒間隔にしました。

再帰なり、wait入れながらのループ処理なり、ポーリングを行ってください。

先ほどSTEP1で無限ループで課金を加速してしまったと申し上げましたが、この辺のポーリング処理の書き方をミスったのが原因でした。
なぜかSTEP1のお金がかかるリクエストまで繰り返しで投げるように書いてしまったのです。しかもwait無しで。

さてポーリングしながら30秒くらい待っていると、以下のようなレスポンスが返ってきます。

OK|03AOLasfBLT7d23rrqAKsSeidsdQlw1RwqTADACrVsjdKOw3fqafc3sY2uHZjuA...

これで、reCaptcha解除成功です!!
「OK|」以降にある文字列がg-recaptcha-responseの値となります!!

g-recaptcha-responseがなんたるかをご存知の方は、これにて終了です。お疲れ様でした。

さて、とはいえ、ここからどうするの…?という方もいらっしゃるかと思います。
ので、軽く解説します。

まず、「OK|」以降にある文字列、これが「g-recaptcha-response」の値となります。
これは、reCaptchaを解除した時に得られる文字列で、いわば「私はBotではありませんよ」の証明書になります。

reCaptchaが設置してあるページには、何かしらのPOSTを行うフォームがあると思います。
そのフォームから送るPOSTのリクエストボディの中にこのg-recaptcha-responseを含めることで、ウェブサイトはユーザがBotであるかどうかを判定します。

つまり、curlか何かで直接、そのフォームから投げられるPOSTを再現し、そのリクエストボディの中に

{g-recaptcha-response:03AOLasfBLT7d23rrqAKsSeidZjuA...}

と付け加えれば、reCaptcha突破となるのです!!!
もちろん、Cookie内のセッションIDなどは、ちゃんとしたものを使用しなければなりませんが。

また、スクレイピングでやりたいという方は、reCaptchaが設置してあるページの

textarea#g-recaptcha-response

というHTMLエレメントの値として入れればいけるそうです。
伊藤くんはこのやり方は試していません。

その際、display:none属性を解除するコードを書く必要もあるそうなので、ご注意ください。

いやはや、伊藤くんにしてはなかなかに壮大な記事になってしまいました。
お腹が空きすぎてやばいです。

最後に改めて、決して悪いことに使わないでくださいね!

では、お疲れ様でしたー

参考:https://tanuhack.com/pr-2captcha/
※ 神サイトです。てか伊藤くんの記事よりこっち見た方がいいかもですww

コメントを残す

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