Filtrar atividade de bot para a gema public_activity

public_activity é uma grande joia para rastrear automaticamente a atividade nos registros do seu modelo, e Ryan Bates acabou de fazer um RailsCast sobre ela. Em poucas palavras, a atividade pública permite que você rastreie automaticamente cria, atualiza e destrói registros de modelo. Você também pode usá-lo para rastrear seus próprios eventos usando o método `PublicActivity :: Model # create activity`.

Estamos usando isso para rastrear visualizações de registros para que possamos rastrear quem está visualizando o quê, o que significa que os números podem ser distorcidos por bots que visitam ações do controlador que são acionadas PublicActivity::Model#create_activitysem autenticação.

Existem várias joias que detectam bots, descobrimos que elas não são tão boas, então apenas gerencie nosso próprio método em nosso ApplicationController. O nosso é assim, mas você pode substituí-lo pelo método de detecção de bot de sua escolha:

def is_bot? user_agent = nil
!Rails.env.test? and (user_agent or request.user_agent).match(/asynchttpclient|alexa|bot|butterfly/d.d|crawl(er|ing)|crowsnest|curl|embedly|eventmachine|facebookexternalhit|feedburner|flipboardproxy|firephp|google web preview|(^java)|LongURL|MetaURI|nagios|(^NING/d.d$)|news.me|peerindex|pingdom|postrank|(^python)|rockmeltembedservice|(^ruby$)|slurp|spider|viadeo|yahoo!|yandex/i)
end

É bastante fácil de manter, mas precisa ser revisado de vez em quando.

Assim que tivermos isso no lugar, basicamente precisamos substituir PublicActivity::Model#public_activity_enabled?para também chamar nosso #is_bot?método e garantir que o resultado seja falso. Poderíamos fazer um monkey patch, PublicActivity::Activitymas pessoalmente prefiro implementar meu próprio módulo que o inclua, além de evitar um monkey patch, ele me permite definir padrões de campo personalizados em meus modelos e definir um gancho para enviar atividades para o mixpanel. Se parece com isso:

module ActiveRecord
module EventTracking

extend
ActiveSupport::Concern
include
PublicActivity::Model

# Override to only track if it isn't a bot
def public_activity_enabled?
PublicActivity.enabled? && (!PublicActivity.get_controller || !PublicActivity.get_controller.is_bot?)
end

end
end

Primeiro verificamos se temos um controlador, pois é inteiramente possível que nosso modelo seja iniciado fora do contexto de um controlador (testes de unidade de modelo, por exemplo) e, em seguida, perguntamos se a solicitação atual é de um bot.

Então, tudo o que resta é incluir em ActiveRecord::EventTrackingvez de PublicActivity::Modelem suas classes ActiveRecord.

Escreverei mais tarde como envio atividades para o Mixpanel e defino os valores padrão de public_activity em várias classes de modelo.