Wagtailのお問合せページのスパム対策で日本語が含まれない本文はスルーする

こんにちは。
毎日寒いですね。

以下記事にて、お問合せページにreCaptchaを追加していますが、

Wagtailのお問合せページにスパム対策用reCaptchaを追加する

2020.12.27
mami
それでも来るんですね…

さすがにBotではないと思うのですが、英文の怪しいプロモーションメールが来ました。受け取りたくないし、数が増えたら困るので、本Webページのコメントで対策している「日本語含まれないコメントはスパム扱い」というプラグインを真似て、問合せフォームにも同じような対策をしたいと思います。

日本語判定をする

どのように日本語判定をするか迷いましたが、このサイトを参考に以下にしました。ひらがなとカタカナは日本語のみで使われている文字なので、これで十分な気がしますね!

import re
def is_japanese(str):
    return True if re.search(r'[ぁ-んァ-ン]', str) else False

問合せページに組み込む

こちらはWagtailのお問合せページ限定の処理になりますが、reCaptchaの処理に加えて、forms.pyに以下を更に追加しました。

class RecaptchaForm(AbstractEmailForm):
    form_builder = RecaptchaFormBuilder

    def process_form_submission(self, form):
        remove_captcha_field(form)
        return super().process_form_submission(form)

    #ここから追加
    def send_mail(self, form):
        if self.chk_japanese(form):
            return super().send_mail(form)

    def chk_japanese(self, form):
        content = []

        cleaned_data = form.cleaned_data
        for field in form:
            if field.name not in cleaned_data:
                continue

            if field.label == 'お問合せ内容':
                value = cleaned_data.get(field.name)
                return self.is_japanese(value)

        return True

    def is_japanese(self, str):
        return True if re.search(r'[ぁ-んァ-ン]', str) else False
    #ここまで追加

    class Meta:
        abstract = True

注意点としては、「if field.label == ‘お問合せ内容’:」としているので、ラベルは適切に変更する必要があります。とりあえず急いで対策するには、これで十分です。日本語が含まれないものは、さも送信されたかのように動きますが、メール送信されません。どれくらいスパムがあるか、ログは取った方がいいかもですが、それはまた別の機会に。

こんな感じにコメントを入れてあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)