"reCAPTCHA is a free CAPTCHA service that helps to digitize books, newspapers and old time radio shows" - reCAPTCHA.net
I had some issues making it work well with Lift so I decided to blog about it (sharing is caring)
The standard approach described docs (code under) did't show up in Opera so I chose to go with the AJAX API.
The html:
Recaptcha.create() brings up the captcha. When the form is submitted we call setHidden() to set the hidden lift form elements. <lift:msgs/> displays messages set with S.error.
On the server side we verify the response by calling the reCaptcha API.
Binding using the -%> operator binds the attributes from the html (here the essential id attributes). The code was tested on Google App Engine and might need some modifications to work other places.