Skip to content
Snooker is a pure-Rust implementation of Jonathan Snook's spam detection algorithm
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.


Type Name Latest commit message Commit time
Failed to load latest commit information.

Snooker - Lightweight spam detection for blog comments Docs License

This crate provides a pure-Rust implementation of Jonathan Snook's spam detection algorithm for blog comments.

As described in the afore-linked post, it works on a points system. Points are awarded and deducted based on a variety of rules. If a comments final score is greater than or equal to 1, the comment is considered valid. If the comments final score is 0 then it's considered to be worth of moderating. If the comments final score is below 0 then it's considered to be spam. Each comment starts with a score of 0.


If you're using Cargo, just add Snooker to your Cargo.toml:

snooker = "0.1.0"


Snooker gives the example comment below a score of -10 based off of the following patterns:

  • The body has less that 2 links in it: +2 points
  • The body is more that 20 characters long but contains 1 link: +1 point
  • The link in the body contains one keyword considered spammy ("free"): -1 point
  • The body contains one phrase considered spammy ("limited time only"): -1 point
  • The body starts with a word considered spammy when it's the first word of the comment ("nice"): -10 points
  • The author field doesn't contain http:// or https://: +0 points (unchanged)
  • The url field contains a keyword considered spammy ("free"): -1 point
  • None of the URLs use a TLD considered spammy: +0 points (unchanged)
  • None of the URLs are longer that 30 characters: +0 points (unchanged)
  • No consonant groups were found: +0 points (unchanged)
  • No data was provided about the comments previously submitted with this email address: +0 points (unchanged)
use snooker::{Comment, Snooker, Status};

let comment = Comment {
    author: Some("Johnny B. Goode".to_string()),
    url: Some("".to_string()),
    body: String::from("
        <p>Nice post! Check out our free (for a limited time only) eBook
        <a href=\"\">here</a> that's totally relevant</p>
    previously_accepted_for_email: None,
    previously_rejected_for_email: None,
    previous_comment_bodies: None,

let snooker_result = Snooker::new(comment);
assert_eq!(snooker_result.score, -10);
assert_eq!(snooker_result.status, Status::Spam);


Snooker is released under the MIT LICENSE.


This crate was written by Elliot Jackson.

You can’t perform that action at this time.