I've had good success with adding a text field to forms that must remain blank. Hide it from humans with CSS and then let the form fail silently if there is content on that field upon submission.
I've also noticed that bots always fill fields based upon their name attribute, so call your fields something other than "email" and "username" and reject submissions where fld9624-v2 is not a valid email address.
Remember, you don't need a perfect solution to this. When you and another person are being chased by a tiger, you don't need to outrun the tiger, just outrun the other guy.