Spam checker API avec ASP.NET C# - Comment éviter le SPAM avec stopforumspam

 01/01/2019 |   Admin |  C#


Avoir rencontré plusieurs problemes de spam dans certaines de mes applications j'ai décidé de me pencher sur le sujet. Apres avoir étudié différentes solutions je décide d'utiliser l'API gratuite du site stopforumspam.

Elle est gratuite, simple d'utilisation et communautaire, c'est pourquoi il ne faut pas hésiter a envoyer la liste de ses potentiels spammeurs sur ce forum.

Il y a juste une limite de 20000 requets a ne pas dépasser par jour, ce qui est correcte.

Pour moi le nom d'utilisateur n'est pas assez fiable pour savoir si c'est un spam ou non. C'est pourquoi la détection va se faire premierement par l'adresse IP de l'utilisateur puis par l'email.

Cette API est tres fiable mais l'adresse IP peut etre lié a un autre utilisateur par exemple. Si vous voulez filtrer des commentaires je vous conseille donc de ne pas les supprimer mais de les marquer avec un tag IsSpam = 1

C'est cadeaux, voici la classe:

///<summary>
/// SpamChecker class
///</summary>
public class SpamChecker
{
    ///<summary>
    /// Check if the comment is inside the spam list
    ///</summary>
    ///<param name="ip">The ip to test</param>
    ///<param name="email">The email to test</param>
    ///<returns>True if it's a spam</returns>
    public static bool Check(string ip, string email)
    {
        bool isSpam = false;
  
        try
        {
            string rootUrl = http://www.stopforumspam.com/api;
  
            // 1 - Check by ip
            string urlIp = string.Format(rootUrl + "?ip={0}", ip);
            isSpam = CheckResponse(urlIp);
  
            // If ip is in the spammer list, no need to check the username
            if (isSpam)
            {
                return true;
            }
  
            // 2 - Check by email
            string urlEmail = string.Format(rootUrl + "?email={0}", email);
            isSpam = CheckResponse(urlEmail);
        }
        catch (Exception ex)
        {
                            ...Your log tool....
 
        }
  
        return isSpam;
    }
  
 
    ///<summary>
    /// Read the response from the api and return if it's a spam
    ///</summary>
    ///<param name="url">The url to read</param>
    ///<returns>True if contain a yes response</returns>
    private static bool CheckResponse(string url)
    {
        bool isSpam = false;
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = (HttpWebResponse)request.GetResponse();
        var responseStream = response.GetResponseStream();
  
        if (responseStream != null)
        {
            var reader = new StreamReader(responseStream);
            var value = reader.ReadToEnd();
            reader.Close();
  
            isSpam = value.ToLowerInvariant().Contains("<appears>yes</appears>") ? true : false;
        }
  
        return isSpam;
    }
}

Utilisation:

SpamChecker.Check(comment.IpAddress, comment.Email);

Plus loin:

Si vous désirez dénoncer un spammeur par le biais de cette API antispam, il suffit juste de s'inscrire et de lancer une requete HTTP GET avec cette URL :

http://www.stopforumspam.com/add.php ?username=SpammeurUsername &ip_addr=SpammeurIPadresse &evidence=Evidence (Peut rester vide si vous n'avez pas de valeur assez fiable) &email=SpammeurEmail &api_key=VotreCléSpamForumAPI 

Voici la classe c# :

private const string URL = "http://www.stopforumspam.com/";
private const string API_KEY = "xxxxxxxxxxxxxxxx";
/// <summary>
/// Submit spammer to stopForum
/// </summary>
/// <param name="ip">spammer IP</param>
/// <param name="username">spammer name</param>
/// <param name="email">spammer email</param>
/// <returns>Submit state</returns>
public static bool SubmitForumSpammer(string ip, string username, string email)
{
WebRequest req = WebRequest.Create(URL + "add");
string postData = String.Format("username={0}&email={1}&ip_addr={2}&api_key={3}", username, email, ip, API_KEY);
  
byte[] send = Encoding.Default.GetBytes(postData);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = send.Length;
  
Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();
  
WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();
  
return returnvalue.Contains("Data submitted successfully");
}