parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

ReCAPTCHA Parser3

G_Z 16.03.2011 03:27 / 16.03.2011 03:28

@CLASS
ReCAPTCHA


@auto[]
$self.hDefaultOptions[
	$.theme['clean']
	$.lang['ru']
]

$self.sChallengeURL[http://api.recaptcha.net/challenge]
$self.sNoscriptChallengeURL[http://api.recaptcha.net/noscript]
$self.sAJAXURL[http://api.recaptcha.net/js/recaptcha_ajax.js]
$self.sVerifyURL[http://api-verify.recaptcha.net/verify]


@create[hOptions]
^self.hDefaultOptions.add[^hash::create[$hOptions]]


@printHTML[sPublicKey;hOptions;sErrorCode][sError]
$sError[]

^if(def $sErrorCode){
	$sError[&error=$sErrorCode]
}

$result[<script type="text/javascript">
	var RecaptchaOptions = ^self._printOptions[$hOptions]
</script>
<script type="text/javascript" src="${self.sChallengeURL}?k=${sPublicKey}$sError"></script>
<noscript>
	<iframe src="${self.sNoscriptChallengeURL}?k=${sPublicKey}$sError" height="300" width="500" frameborder="0"></iframe><br/>
	<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
	<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
</noscript>]


@printAJAX[sPublicKey;hOptions;sErrorCode][hDefaultOptions;sField;sValue]
$result[<div id="recaptcha_container"></div>
<script type="text/javascript" src="$self.sAJAXURL"></script>
<script type="text/javascript">
	Recaptcha.create("$sPublicKey", "recaptcha_container", ^self._printOptions[$hOptions])^;
</script>]


@verify[sPrivateKey;hData][fResult;tResult]
$result[^hash::create[]]

$fResult[^file::load[text;$self.sVerifyURL][
	$.method[POST]
	$.form[
		$.privatekey[$sPrivateKey]
		$.remoteip[$env:REMOTE_ADDR]
		$.challenge[$hData.recaptcha_challenge_field]
		$.response[$hData.recaptcha_response_field]
	]
	$.headers[
		$.[USER-AGENT][reCAPTCHA Parser3]
	]
	$.timeout(10)
]]

$tResult[^table::create[nameless]{^taint[as-is][$fResult.text]}]

$result.valid(^tResult.0.bool(false))
^tResult.offset(1)
$result.errorcode[$tResult.0]


@_printOptions[hOptions][hDefaultOptions;sField;sValue]
$hDefaultOptions[^hash::create[$self.hDefaultOptions]]
^hDefaultOptions.add[^hash::create[$hOptions]]

$result[{^hDefaultOptions.foreach[sField;sValue]{${sField}: $sValue}[, ]}]
Звать так:
^ReCAPTCHA:printHTML[$sPublicKey]
или, например, так:
^ReCAPTCHA:printAJAX[$sPublicKey][
	$.callback[myCallbackFunction]
]
Если вызывать динамически, то можно передать опции в констурктор и исключить их из вызова методов:
$oReCAPTCHA[^ReCAPTCHA::create[
	$.lang['en']
]]^oReCAPTCHA.printHTML[$sPublicKey]
Проверка:
# хэш-результат с двумя ключами: флаг «valid» и описание ошибки «errorcode»
$hCAPTCHA[^ReCAPTCHA:verify[$sSecretKey;$form:fields]]

^if($hCAPTCHA.valid){
	OK
}{
	something wrong, ^ReCAPTCHA:printHTML[$sPublicKey;;$hCAPTCHA.errorcode]
}