The ways I can think of are:
- Measure the time between actions.
- Compare the posts' content (if they're too similar to each other) or, better yet, only the posted links.
- Checking the distribution over a period of time the user is active (if the user is active, say posting once every hour, for a week, then either we have a superman or a bot here).
- Some special activity expected: like in stackoverflow, I would expect users to press their user name link (top middle) to see their new answers, comments, questions etc.
- (added by chakrit) Number of links in a post.
- Not heuristic. Use some async JS for user login. (Just makes life a bit harder on the bot programmer).
- (added by Alekc) Not heuristic. User-agent values.
- And, How could I forget Google's approach (mentioned down by Will Hartung). Give users the ability to mark someone as Spam, enough Spam votes means this is a Spam user. (calculating what is enough users, is the work here).
Any more ideas?