I have a simple approach now. I have an Asterisk PBX running on an old Sheevaplug, a MySQL database and a few Perl scripts. An incoming call gets the CLI looked up in the database and known bad numbers are answered, a recorded message is played and then it hangs up, all without ringing the house phone. Unknown numbers get ignored, on the basis that real people will leave a message, scammers will just hang up. Then I look up the dodgy ones and add them to the database for next time. Known good numbers also get added to the database so that they'll present an identifiable text string to the phone.