Поместить сообщение в лог сообщений. Дополнительно можно при помещении в лог указать дополнительный тэг, который будет сохранен в логе вместе с сообщением. @param domain: домен, относительно которого идёт анализ @type domain: L{IDomain} @param message: сообщение @type message: L{spamfighter.interfaces.IMessage} @param log: имя свойства домена, содержащего лог сообщений @type log: C{str} @param tag: дополнительный тэг, записываемый в лог @type tag: C{str} """ try: messageLog = domain.get(log) except DomainKeyError: raise errors.AttributeKeyException, log if not IMessageLog.providedBy(messageLog): raise errors.NotAMessageLogError, log if tag is None: tags=[] else: tags=[tag] return messageLog.put(message=message, tags=tags).addCallback(lambda _: True) factory.registerRule(messageLogPut)
try: self.text = message[attribute].value() except AttributeNotFoundError: raise errors.MessageAttributeKeyException, attribute class modelClassify(ModelRule): """ Классификация сообщения по модели: истинно, если модель сообщает, что сообщение относится к классу *плохих*. """ def analyze(self, domain, message, **kwargs): super(modelClassify, self).analyze(domain, message, **kwargs) return self.model.classify(self.text) class modelTrain(ModelRule): """ Обучить модель на сообщении: всегда истинно. """ def analyze(self, domain, message, marker="good", **kwargs): """ @param marker: тип сообщения для модели, "good" или "bad" @type marker: C{str} """ super(modelTrain, self).analyze(domain, message, **kwargs) return self.model.train(self.text, marker == "good").addCallback(lambda _: True) factory.registerRule(modelClassify) factory.registerRule(modelTrain)
@type attribute: C{int} @param storage: имя атрибута домена, содержащего хранилище @type storage: C{str} @param timeout: время в течении которого пользователь может отправлять указанное количество сообщений @type timeout: C{int} @param count: максимально допустимое количество сообщение в указанный период времени @type count: C{int} """ storage = domain.get(storage) user_key = 'ufreq_' + attribute + str(message.get(attribute).serialize()) def gotKey(value): if value < count: return storage.incr(user_key).addCallback(lambda value: value < count).addErrback(noKey) else: return False def noKey(failure): failure.trap(KeyError) def errback(failure): failure.trap(KeyError) return gotKey(0) return storage.add(user_key, 1, timeout).addCallback(lambda _: True).addErrback(errback) return storage.get(user_key).addCallbacks(gotKey, noKey) factory.registerRule(userFrequencyCheck) factory.registerRule(messageFrequencyCheck)
@param attribute: имя атрибута сообщения для проверки на соответствие @type attribute: C{str} @param value: значение для проверки на соответствие @type value: C{object} """ return message.get(attribute).value() == value def hasAttribute(domain, message, attribute): """ Правило проверки наличия аттрибута у сообщения @param domain: домен, относительно которого идёт анализ @type domain: L{IDomain} @param message: сообщение @type message: L{spamfighter.interfaces.IMessage} @param attribute: имя атрибута сообщения для проверки на наличие @type attribute: C{str} """ try: message.get(attribute) return True except AttributeNotFoundError: return False factory.registerRule(regexpCheck) factory.registerRule(lengthCheck) factory.registerRule(hasAttribute) factory.registerRule(attributeCheck)
@param minLength: минимальная длина сообщения для анализа @type minLength: C{int} @param minMean: минимальное значение математического ожидания @type minMean: C{float} @param maxVariance: максимальное значение дисперсии @type maxVariance: C{float} """ str = clearSpacesRE.sub('', message.get(attribute).value()).lower() if len(str) < minLength: return True result = {} for i in xrange(len(str)-2): result[str[i:i+3]] = result.get(str[i:i+3], 0) + 1 s = sum(result.itervalues()) sum_sqr = sum(imap(lambda x: x*x, result.itervalues())) n = len(result) mean = s/float(n) if n > 0 else 0 variance = (sum_sqr - s*mean)/float(n-1) if n > 1 else 0 if mean > minMean and variance < maxVariance: return False return True factory.registerRule(messageFloodCheck)