Excel VBA

Excel VBAでWebスクレイピング!テキストCAPTCHAの突破/回避方法

こんにちは!ゆーたろうです。

最近のWebサイトだとほとんど導入されている、bot対策のCAPTCHA(キャプチャ )という仕組み。

人間による操作なのか、ロボット(ツールやプログラミング)による操作なのかを識別するためのものです。

今回は画像CAPTCHA、音声CAPTCHA、テキストCAPTCHAとさまざまある中の「テキストCAPTCHA」について、回避方法を紹介していこうと思います。

テキストCAPTCHAとは?

こういうものですね。

画像に表示された英数字を入力フォームに打ち込むことで、機能するものです。

解析方法

ソースを見る

スクレイピングたるもの、ソースコードを見なければ始まりませんので、例に倣ってソースコードを見てみましょう。

Windowsなら、「右クリック>ページのソースを表示」です。

するとこのような感じでソースを表示することができます。

フォームの命名規則や文字コード、テキストCAPTCHAの使用手段など見てもあまりプログラミングに詳しくない方が作成した感じが見えますね😅

さて、この部分のソースを読み解いてみましょう。

纏めるとこのような情報が分かりました。

  1. 回答を入力するフォームのidは「captcha_code」であること
  2. http://対象ドメイン/…/captcha.php?Math.random()からCAPTCHAの文字列の正答を取得してきていること
  3. 入力値と「2」の結果が同じなら、http://対象ドメイン/…/search.phpへ遷移していること

ここで、Math.random()はどんな値を返すものかを調べてみましょう。

検索すると「0以上1未満の浮動小数点数をランダムで返す」ものだと分かりました。

→検索結果:math.random() javascript

↓実行結果:

つまり、captcha.php?Math.random()の部分は

captcha.php?0~captcha.php?0.9までの数値が入ることが分かるとともに、Random()ということで、captcha.php内部では特に使われていない値であることも分かります。

そのため、とりあえず「?」の後ろには何かしら数値をつけておけいてもいいですし、つけなくても動作に問題ないと分かりますね。

URLを組み立てる

さてここまでくれば後は簡単です。組み立てるだけです。

まず、対象のページを開きます。

そして、http://対象ドメイン/…/captcha.phpへアクセスします。

はい!できましたね。

画像認識の答えが、「文字列として」取得できました。

後はこの文字列をメインページの「captcha_code」がidとなっているformにプログラムから入力すれば、晴れてプログラムからの自動認証が可能となります。

VBAでスクレイピングした時のソース

最後に、VBAでスクレイピングした時のソースも残しておきます。

Sub main()

    '----------------------------------------------------------------
    '大元のページを開く
    '----------------------------------------------------------------
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.navigate "https://対象ドメイン/member/"
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.document
    
    
    
    '----------------------------------------------------------------
    'キャプチャを取得する
    '----------------------------------------------------------------
    Dim capcha As InternetExplorer
    Set capcha = CreateObject("InternetExplorer.Application")
    
    capcha.Visible = True
    capcha.navigate "https://対象ドメイン/member/captcha.php?1"
    
    Do While capcha.Busy = True Or capcha.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    Dim caP As String
    
    '***************** ここで回答の値を取得しています
    caP = capcha.document.body.innerHTML
    
    
    capcha.Quit
    Set capcha = Nothing
    
    
    
    '----------------------------------------------------------------
    'キャプチャの回答を入力
    '----------------------------------------------------------------
    objIE.document.getElementById("captcha_code").Value = caP
    
    
    
End Sub


まとめ

いかがだったでしょうか。

認証系のスクレイピングは一見すると難しそうに見えますが、ソースコードをしっかり読んでいけば、サイトの構成が分かりますので、簡単に突破することが可能です。

情報には価値があります。どんな情報でも欲している人がいます。ぜひ、スクレイピング力(りょく)をつけて、ばしばしビジネスを展開していきましょう!

P.S.

このサイトは認証成功後に遷移するsearch.phpでは、セキュリティ対策をしていませんでした。

つまり、search.phpのURLに直接アクセスすれば、テキスト認証をわざわざプログラムで組まなくてもダイレクトにスクレイピングできるということです。

認証突破プログラムを作る前に、直接スクレイピングが可能かどうかをいったん検討してプログラミングしたほうが効率的ですね😊

参考にした記事

今回のプログラミングに伴い、勉強になった記事があるので備忘録も兼ねて残しておきます。