Just dropping this here in case we start getting false positives from dup-links method: it could be made more narrow by replacing len(links) != len(set(links)) with len(links)==2 and len(set(links)) == 1
I think we do need this. Spam questions only have two links in total. This fp had more. @hichris123
@hichris123 True, but only on Patents. On other sites we won't have that repeated links spam, because new users (<10 rep) can only post 2 links in total. Maybe keep the current version just for Patents.
@ProgramFOX The logic of repeated words still misfires at times. \,\,\,\,\,\, is a silly, but common way to create space in MathJax. It was detected as repeated word. Perhaps repeated words should be required to consist of word characters? Possibly, more than one character.
a a a a a a b b b b b c c c c is probably someone illustrating input data, rather than a troll.
I once remembered this structure, but then forgot. Here is a SEDE query for questions ending with a link. Naturally, these are the legitimate ones... but there aren't many on Drupal: e.g., seven in all of June.
General remark: there is a difference between methods that identify blacklisted content and methods that apply heuristics: "nested quotes, repeated words, duplicate links, link at the end etc" none of which are problematic in themselves. I'd say that the latter should rely more heavily on reputation that the former: possibly, being restricted to 1-rep users.
In case of blacklisted content, like repair tools, there is a wider range of reputation because a spammer may be using a sockpuppet to get answer accepted or upvoted. But this never happens with the post-and-run spam that the heuristic methods target.