如果用户评论太快,Captcha popup?

时间:2014-03-25 02:22:20

标签: javascript popup meteor chat captcha

我正在与Meteor开发聊天应用程序,我假设垃圾邮件将成为一个问题,所以如果你评论得太快(比如5秒内超过3次),我想加入弹出的Captcha。我有下面的javascript代码,但我不知道如何做到这一点。是否可以在屏幕上的某处弹出一个Captcha?如果是这样,有人知道怎么做吗?以下是聊天应用程序部分的代码:

使用Javascript:

// render all of our messages in the ui
Template.chatBox.helpers({
  "messages": function() {
    return chatCollection.find();
  }
});

// get the value for handlerbar helper user
Template.chatMessage.helpers({
  "user": function() {
    if(this.userId == 'me') {
      return this.userId;
    } else if(this.userId) {
      getUsername(this.userId);
      return Session.get('user-' + this.userId);
    } else {
      return 'anonymous-' + this.subscriptionId;
    }
  }
});

// when Send Chat clicked at the message to the collection
Template.chatBox.events({
    "click #send": function() {
        if (Meteor.user() == null) {
            alert("You must login to post");
            return;
        }
        $('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
        var message = $('#chat-message').val();
        chatCollection.insert({
            userId: 'me',
            message: message
        });
        $('#chat-message').val('');

        //add the message to the stream
        chatStream.emit('chat', message);
    },

    "keypress #chat-message": function(e) {
        if (Meteor.user() == null) {
            alert("You must login to post");
            return;
        }
        if (e.which == 13) {
            $('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
            console.log("you pressed enter");
            e.preventDefault();
            //repeat function from #send click event here
            var message = $('#chat-message').val();
            chatCollection.insert({
                userId: 'me',
                message: message
            });
            $('#chat-message').val('');

    //add the message to the stream
    chatStream.emit('chat', message);
    }
  }
});

chatStream.on('chat', function(message) {
  chatCollection.insert({
    userId: this.userId,
    subscriptionId: this.subscriptionId,
    message: message
  });
});

2 个答案:

答案 0 :(得分:2)

这听起来很棒,但使用“条件验证码”存在一些问题。一个是除了cookie和localStorage之外,JavaScript没有任何方法可以在页面重新加载之后继续存在。因此,简单的重新加载和清除cookie会使其失败。更不用说如何在服务器上处理它,这不确定它是否应该期望有效的验证码输入。

有了这个警告,您可以设置一个充当“计时器”的全局变量,并跟踪失效。所以用以下代码替换最后一个块:

chatStream.on('chat', function(message) {
  //do we already have a timer?
  if(typeof window.chatTimer == 'undefined'){
      //no, so start one right now
      window.chatTimer = new Date().getTime();
  }else{
      //we already have a timer. Is it 5 seconds old?
      var now = new Date().getTime();
      if( now - window.chatTimer < 5000) {
        alert('Not so fast, tiger.');
        return false;
      }else{
       chatCollection.insert({
       userId: this.userId,
       subscriptionId: this.subscriptionId,
       message: message
      });
  }

此示例使用reCaptcha,减去您传入的自定义内容。

最近可能已经发生了变化,但Spambots并没有运行JavaScript。它们有点像搜索引擎爬虫,它们跟随链接并查找formtextbox元素,然后将它们的毒药编织到对表单的action属性的POST请求中,绕过任何想要阻止它的JavaScript。

事实上,验证码的替代方法之一就是使用JavaScript动态生成隐藏输入,该输入具有服务器等待的模糊ID /名称。 Spambots不会运行此JavaScript,因此永远不会生成复选框,因此机器人会在不知道原因的情况下被拒绝。 Here's more on that

答案 1 :(得分:1)

我在代码中添加了一些代码。我从不使用Meteor,所以我不知道这个代码在Meteor中是否有效。但是通过创建明喻项目here

进行测试
Template.chatBox.events({
    "click #send": function() {
        if (Meteor.user() == null) {
            alert("You must login to post");
            return;
        }

        //Validation
       var bot =Check_bots();

        if(bot==false)
        {
            $('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
            var message = $('#chat-message').val();
            chatCollection.insert({
                userId: 'me',
                message: message
            });
            $('#chat-message').val('');

            //add the message to the stream
            chatStream.emit('chat', message);
        }
        else
        {
            // Do whatever you want when a Bot detected
        }
    },

    "keypress #chat-message": function(e) {
        if (Meteor.user() == null) {
            alert("You must login to post");
            return;
        }
        if (e.which == 13) {
            $('#messages').animate({"scrollTop": $('#messages')[0].scrollHeight}, "fast");
            console.log("you pressed enter");
            e.preventDefault();
            //repeat function from #send click event here
            var message = $('#chat-message').val();
            chatCollection.insert({
                userId: 'me',
                message: message
            });
            $('#chat-message').val('');

    //add the message to the stream
    chatStream.emit('chat', message);
    }
  }
});

以下是验证码

<script type="text/javascript">
var lastintime=0;
var defference=0;
var msg_count=0;

function Check_bots()
{
    var seconds = new Date().getTime() / 1000;
    seconds=parseInt(seconds);

    if(lastintime < seconds)
    {
        defference = seconds -lastintime;
        lastintime=seconds;

        if(defference<=5 && msg_count>=3)
        {
            return true;
        }
        else
        {
             return false;
        }
    }
}

</script>