How to implement a CAPTCHA for Google Forms
Is it possible to make a random captcha for a google form? You may search and find on google groups and other sources a hard no to this question but, in fact, there is one method that I made that works pretty well. Unfortunately, there are some catches with the method that I am about to show you, but until we get to that, we first have to ensure that we can meet a requirement that this method has. This primary requirement is an URL/server that can generate dynamically a captcha image from a given text passed into an HTTP GET variable.
Luckily there are some free servers that can do just that. In this instance, I had used "dummyimage.com", but if you want you can use your own server as there are many examples of code for generating an image from an HTTP get variable available in many web programming languages.
Ok so, if we met this requirement, is time to do a somewhat detailed explaining of how this method will work. First of all, is important to know that this method will use a google script, and regrettably, the captcha can't be generated for every user request as google API does not allow execution of scripts when a client opens a form. So instead the captcha will be generated on a time-based trigger. In my example, I used two hours but google permits triggers to execute even after one minute. Just be careful to not exceed the resource quota allocated for your account.
So here is the google apps script:
function OpenForm() {
var text = "";
var lastIndexItem = 4;
var formId = '1MXfvfUjUM1L-phthM7oKv-teXK1ChisaEBcd0ekmLqA';
var existingForm = FormApp.openById(formId);
while(existingForm.getItems().length > lastIndexItem){
existingForm.deleteItem(existingForm.getItems().length-1);
}
Logger.log(existingForm.getItems().length)
var strLen = 5;
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// Make somthing random
for( var i=0; i < strLen; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
var img = UrlFetchApp.fetch('https://dummyimage.com/200x100/ffffff/000000.png&amp;text='+text);
// Add the iamge to the form
existingForm.addImageItem()
.setTitle('Verificare')
.setHelpText('Verificare impotriva spam') // The help text is the image description
.setImage(img);
// Add the text Item
var textItem = existingForm.addTextItem().setTitle('Introduce textul de mai sus.').setRequired(true);
var textValidation = FormApp.createTextValidation()
.setHelpText("Nu ai introdus corect textul de verificare") // Error message text if input is not correct.
.requireTextContainsPattern(text)
.build();
textItem.setValidation(textValidation);
}
As you can see from this script you must set some variables according to your needs:
- strLen - number of characters displayed in the captcha
- img - URL for getting the image
- lastIndexItem - the last index of your form entry ( captcha will be added after this one)
- formId - id of your form
After that set your trigger as you can see in this image.
The final result should look like:
Is worth noticing that all data validation that is made in google Forms have the answers present in plain javascript in the source code, so it can't protect you from a smart bot, but it will help with most of them as I think no one will spend time to write a bot that passes your captcha even though is not very hard.