Version 8 of Akismet spam filtering

Updated 2007-06-01 20:51:00 by jdc

Here's a script to filter spam submissions (emails, pages, comments, whatever) through the Akismet filtering service - see http://akismet.com/ for details:

  # Copyright (c) 2007 Jean-Claude Wippler
  # http://www.opensource.org/licenses/mit-license.php

  package provide akismet 0.1
  package require http

  # see http://akismet.com/development/api/
  #
  #   blog (required)
  #     The front page or home URL of the instance making the request. For a blog
  #     or wiki this would be the front page. Note: Must be a full URI, including
  #     http://.
  #
  #   user_ip (required)
  #     IP address of the comment submitter.
  #
  #   user_agent (required)
  #     User agent information.
  #
  #   referrer (note spelling)
  #     The content of the HTTP_REFERER header should be sent here.
  #
  #   permalink
  #     The permanent location of the entry the comment was submitted to.
  #
  #   comment_type
   #     May be blank, comment, trackback, pingback, or a made up value like
  #     "registration".
  #
  #   comment_author
  #     Submitted name with the comment
  #
  #   comment_author_email
  #     Submitted email address
  #
  #   comment_author_url
  #     Commenter URL.
  #
  #   comment_content
  #     The content that was submitted.
  #
  #   Other server enviroment variables
  #     In PHP there is an array of enviroment variables called $_SERVER which
  #     contains information about the web server itself as well as a key/value
  #     for every HTTP header sent with the request. This data is highly useful to
  #     Akismet as how the submited content interacts with the server can be very
  #     telling, so please include as much information as possible.

  namespace eval akismet {
    variable key
    variable blog
    variable app

    proc setup {key_ blog_ {app_ ""}} {
      variable key $key_
      variable blog $blog_
      variable app $app_
      if {[_connect verify-key "" key $key] ne "valid"} {
        error "Akismet: invalid key" 
      }
    }

    proc comment-check {uip uagent args} {
      variable key
      _connect comment-check $key. user_ip $uip user_agent $uagent {*}$args
    }

    proc submit-spam {uip uagent args} {
      variable key
      _connect submit-spam $key. user_ip $uip user_agent $uagent {*}$args
    }

    proc submit-ham {uip uagent args} {
      variable key
      _connect submit-ham $key. user_ip $uip user_agent $uagent {*}$args
    }

    namespace export *
    namespace ensemble create

    proc _connect {type prefix args} {
      variable blog
      variable app
      set ver [package require akismet]
      set token [::http::geturl http://${prefix}rest.akismet.com/1.1/$type \
                          -headers [list User-Agent "$app | akismet.tcl/$ver"] \
                          -query [http::formatQuery blog $blog {*}$args]]
      set ncode [http::ncode $token]
      set data [http::data $token]
      http::cleanup $token
      if {$ncode != 200} { error "Akismet: $type failed (code $ncode)" }
      return $data
    }
  }

It's quite effective at tagging things we all are tired of having to clean up...


LV Too bad something like this couldn't be plugged into the Wiki...

jcw - Don't see why not...


jdc Is it possible to give a usage example? I've tried the following but always get the true return, indicating my string is spam (setup completed without errors):

 set ip <my ip address>
 set ua "Mozilla/5.0"

 set rt [akismet::comment-check $ip $ua comment_content "An example of using this packages."]
 puts "Check: $rt"

Category Internet