Integrar reCaptcha en JComments
JComments y Joomla!
JComments es un excelente componente para Joomla! que permite a los usuarios dejar comentarios en los artículos (contenido). Usa la tecnología AJAX y tiene muchas configuraciones, entre las que destaco: la posibilidad de permitir o restringir los comentarios anónimos, banear IP, términos censurados, moderar mensajes, flexibilidad ACL y un largo etc...
Tiene otros posibles complementos que puedes instalar y se integran perfectamente pero lo que más llama la atención, es que JComments es gratuito bajo licencia GNU. Desde mi punto de vista, el gran esfuerzo que se ha hecho para el lanzamiento de la nueva versión compatible con Joomla! > 2.5 es impresionante. Desde aquí quiero agradecer ese esfuerzo a todos los que lo han hecho posible.
Viendo todo este gran trabajo realizado, me interesé hace unos días en integrar reCaptcha en JComments. Esta idea ya la tuvo el usuario Grinse en el foro oficial de JComments [ENG]: http://www.joomlatune.com/forum/index.php/topic,942.0.html
Usando el esqueleto de esa idea he creado y preparado un código TEMPORAL para que reCaptcha funcione perfectamente en JComments. Puede que no sea estable o que todavía queden cosas por perfeccionar, que entre todos podemos mejorar. La responsabilidad de su buen o mal uso es únicamente tuya, esto es un consejo no profesional y puede fallar. Debes realizar un backup y probar antes en tu disco duro, no hagas pruebas en tu servidor.
Para su código he usado los consejos de Joomla!, por ejemplo:
To retrieve GET/POST request data, Joomla! uses the getVar method of the JRequest class (JRequest::getVar())
Sin más dilación, os muestro los preparativos y todos los cambios realizados y al final de este artículo podéis observar los resultados en esta web.
GARANTÍA
Este código se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA. JComments se distribuye bajo licencia GNU GPL.
This code is provided on an AS IS basis, without warranty of any kind, including without limitation the warranties of merchantability, fitness for a particular purpose and non-infringement. The entire risk as to the quality and performance of the code is borne by you. JComments is released under the GNU GPL license.
Preparar los archivos
Antes de hacer las modificaciones, hay que preparar todo. Este ejemplo está realizado con Joomla! 2.5.6 y con JComments 2.3.0. Necesitamos reCaptcha, así que haremos estos sencillos pasos:
- Debemos obtener una clave privada y pública, que luego se piden en el código fuente. Puedes obtenerlas gratuitamente desde aquí: http://www.google.com/recaptcha/whyrecaptcha
- Descargamos la librería reCAPTCHA para PHP. Aquí: http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest
- Descomprime el archivo zip en una carpeta llamada recaptcha. El resultado tiene que ser la carpeta recaptcha y en su interior 5 archivos.
- Accede a la carpeta recaptcha y abre la libreía recaptchalib.php. Añádele al principio, si quieres, para evitar accesos directos o fuera de la sesión de Joomla!: defined( '_JEXEC' ) or die( 'Restricted access' );
- Agrega a esos 5 archivos un archivo index.html (que suele estar con una línea de código: <html><body bgcolor="#FFFFFF"></body></html>) que puedes copiar de cualquier sitio de tu instalación de Joomla!. Normalmente la verás en cualquier carpeta.
- Finalmente copia (o corta) la carpeta recaptcha con los 6 ficheros y pégalo en tu instalación de Joomla! + JComments en:
components/com_jcomments/libraries
Cambios realizados
Importante: Debes saber que el código que debes modificar no lo he escrito entero, solo muestro la PRIMERA línea de código, para simplificar. Creo que no es necesario que lo ponga. ¿o sí?
Important: I do not show all the code to be modified, only show the first line, for simplicity. I do not think it is necessary.
Primer cambio:
- Archivo: components/com_jcomments/jcomments.ajax.php
- Línea aproximada: 275
- Primera línea: if ($acl->check('enable_captcha') == 1) { ...
Sustituir por el siguiente código:
if ($acl->check('enable_captcha') == 1) { $captchaEngine = $config->get('captcha_engine', 'recaptcha'); $captchaEngine = 'recaptcha'; if ($captchaEngine == 'kcaptcha_original') { require_once( JCOMMENTS_BASE.DS.'jcomments.captcha.php' ); if (!JCommentsCaptcha::check($values['captcha_refid'])) { self::showErrorMessage(JText::_('ERROR_CAPTCHA'), 'captcha'); JCommentsCaptcha::destroy(); $response->addScript("jcomments.clear('captcha');"); return $response; } } else if ($captchaEngine == 'recaptcha') { require_once(JCOMMENTS_BASE.DS.'libraries/recaptcha/'.'recaptchalib.php'); $privatekey = "Tu clave privada reCaptcha debe ir aqui"; // the response from reCAPTCHA $resp = null; // the error code from reCAPTCHA, if any $error = null; // get captcha data $challenge = JRequest::getCmd("recaptcha_challenge_field", null, 'POST'); $challenge = $challenge == null ? JRequest::getCmd("recaptcha_challenge_field", null, 'GET') : $challenge; if ($challenge != null) { // get user response $responses = JRequest::getCmd("recaptcha_response_field", null, 'POST'); $responses = $responses == null ? JRequest::getCmd("recaptcha_response_field", null, 'GET') : $responses; //$privatekey = trim($params->get('private_key')); // futuro $remoteAddr = JRequest::getVar('REMOTE_ADDR', '127.0.0.1', 'server'); $resp = recaptcha_check_answer($privatekey, $remoteAddr, $challenge, $responses); // Si falla la verificacion, genera mensaje de error y recarga el Recaptcha (funcion javascript) if (!$resp->is_valid) { self::showErrorMessage(JText::_('El valor Captcha introducido no es correcto. Intente de nuevo.')); $response->addScript("Recaptcha.reload();"); return $response; } } else { self::showErrorMessage(JText::_('ERROR_CAPTCHA')); //return $response; } }
Segundo cambio:
- Archivo: components/com_jcomments/jcomments.ajax.php (el mismo archivo)
- Línea aproximada: 408
- Código original: $response->addScript("jcomments.clear('comment');");
Añadir el siguiente código:
$response->addScript("Recaptcha.reload();");
En este caso, podríamos utilizar una comparación (if - else) según el motor Captcha utilizado.
Tercer cambio:
- Archivo: components/com_jcomments/tpl/default/tpl_form.php
- Línea aproximada: 114
- Código inicial ORIENTATIVO: if ($this->getVar('comments-form-captcha', 0) == 1)
Sustituir por el siguiente código:
getVar('comments-form-captcha', 0) == 1) { $captcha = 'recaptcha'; if ($captcha == 'recaptcha') { require_once(JCOMMENTS_BASE.DS.'libraries/recaptcha/'.'recaptchalib.php'); $publickey = "Tu clave publica reCaptcha tienes que ir aqui"; $theme = "clean"; $lang =& JFactory::getLanguage(); $tag = explode("-", $lang->getTag() ); $availableLanguages =array("en","nl","fr","de","pt","ru","es","tr"); $langCode = (in_array($tag[0],$availableLanguages))? $tag[0]: "en"; //Generando el javascript y adjuntando al documento: $js = "var RecaptchaOptions = {"."\n"; $js .= "theme : '".$theme."',"."\n"; $js .= "lang : '".$langCode."'"."\n"; $js .= "};"; $recaptchaOptions =& JFactory::getDocument(); $recaptchaOptions->addScriptDeclaration($js); ?> <span id="comments-form-captcha" name="captcha-refid"> </span> } elseif ($captcha == 'kcaptcha_original') { $link = JCommentsFactory::getLink('captcha'); ?>;
Espero que este código os pueda ser útil.