I have a a bogus form input (something like zip, or any other info that bots love to fill out but you really don't need) that has visibility: hidden; position: absolute
. The motivation behind this is to get an input that is invisible to the user, but visible to the bot. So, whenever you get a request where that specific input is filled out, you know that it wasn't a human.
I use visibility: hidden; position: absolute
so that it still uses up space, but doesn't clutter the design. This is for the bots that use more elaborate techniques to detect hidden inputs since, for JS, something isn't hidden if it takes up any amount space.
I haven't tested this technique on largely successful site as of yet, but it is still worth a try. Beware however that some Browsers (I am looking at you Safari/OSX!) that take info from your contact list and fills out all the input fields automatically (potentially even your hidden inputs) for you so you better check for bugs in that direction.