AutoIt WebDriverでロボットだと認識されないようにする

webdriverでgoogleにアクセスしすぎるとロボットと見なされる WebDriver

SEO対策というか、googleで人気の検索クエリと、自分のページのランキングを取得するようなスクリプトを作ったら、googleがロボットですよね?的なページを表示してきました。まぁロボットなんですが。google検索にアクセスしすぎですよね。というわけで、ロボットと認識されないよう、人の操作に近くしてみようかなと。

autoit webdriver googleに過剰にアクセスするとロボットと疑われる
スポンサーリンク

1. googleから一旦離れる

一番簡単なのはgoogleから一旦離れて違うサイトに行き、再度戻ってくる感じです。
人が検索してサイトを訪れ、「やっぱもう一度検索しよう」という操作ですね。
Chromedataを指定しないと、WebDriver経由で新規セッション作る度に新しいデータとなるので、履歴残らず。

2. 人の操作っぽくマウス動かしたりする

WebDriverと、MouseMove()、Send()などを使って、キー入力やマウス操作を人間っぽくやる方法です。

2.1 WebDriverで要素のrectを取得

2.1.1 Chromeのウィンドウ矩形

_WD_Window($session, “rect”)でWebDriver経由で立ち上げたChromeのウィンドウ矩形を取得できます。Json形式で返ってくるので、Json_Get()で取得します。書き方がちょっと特殊なので忘れてしまいますね・・・

$rect = _WD_Window($session, “rect”)
Local $x = Json_Get($rect, “[x]”)
Local $y = Json_Get($rect, “[y]”)
Local $w = Json_Get($rect, “[width]”)
Local $h = Json_Get($rect, “[height]”)

2.1.2 要素の矩形はクライアント座標

_WD_FindElement()で取得した要素(例えばdivやpの要素)に対して_WD_ElementAction()します。ただ、この座標はタブバー、メニューバーなどを除いたページ表示領域の左上座標を0,0としたものです。

$elm = _WD_FindElement($session, “xpath”, “//div[@id=’targetid’]”)
$rect = _WD_ElementAction($session, $elm, “rect”)
Local $x = Json_Get($rect, “[x]”)
Local $y = Json_Get($rect, “[y]”)
Local $w = Json_Get($rect, “[w]”)
Local $h = Json_Get($rect, “[h]”)

w3cの Get Element Rectを呼んでいます。

WebDriver
WebDriver is a remote control interface that enables introspection and control of user agents. It provides a platform- and language-neutral wire protocol as a w...

2.1.3 スクロール位置はWebDriver経由でJavaScriptを実行

WebDriver UDFではページのスクロール座標を取得できる関数がないので、Seleniumでやっていることを検索すると、javascriptのwindow.pageYOffsetを実行しているようです。
WebDriver UDFでも同じように_WD_ExecuteScriptがあるのでやってみます。
wd_core.au3のFunc _WD_GetMouseElement($sSession)などを参考に書くと良いです。

Local $sscript = “return window.pageYOffset”
$sres = _WD_ExecuteScript($session, $sscript, “”)
$sjson = Json_Decode($sres)
$scrolly = Json_Get($sjson, “[value]”)

2.2 要素にマウスを合わせるには上記を加味した座標で

Mouseはスクリーン座標なので、要素にマウス合わせたい場合は、以下な感じで。

$mousex = chromex + chromeborderw + elmx – scrollx + (elmw/2)
$mousey = chromey + chromecontrolh + elmy – scrolly + (elmh/2)

適当な回数のループで移動幅を変えたり座標をちょっとずらしたりしながら目的地点までマウス移動したり、Sendでスペースや矢印でページ移動させたり、いい感じに人が閲覧している具合を出せばロボットと認識されにくくなるかもしれません。

5. (番外)自分のサイトにWebDriver経由で操作されないようにする

なんでもJavaScriptの変数でわかるらしいです。
navigator.webdriver = true ならwebdriver経由で操作されているとのことで、操作されるのが嫌なら違うページに行くようにすると良いです。
下記参考サイトではxvideosに行くという。それかもっとポップアップ出まくりのサイトを指定しても良さそうですね。

Selenium禁止 - Qiita
こんにちは! 今日もAPIがアレなWebサービスをアレしてますか! W3C WebDriverでは、WebDriverによるアクセスを禁止できる 実は、W3Cが規定するWebDriver規格では、WebDriverによる自動アク...

コメント

タイトルとURLをコピーしました