def test_contains(self): rule = '-contain 变化' content = '变化' last_content = '不变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-contain 变化' content = '你好' last_content = '不变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 1)
def test_no_rule(self): rule = '' content = '变化' last_content = '变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 0) rule = '' content = '变化' last_content = '不变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 3)
def test_without(self): rule = '-without 变化' content = 'abcdas' last_content = '不变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-without 变化' content = '我发生变化了' last_content = '不变化' res = is_changed(rule, content, last_content) self.assertEqual(res, 1)
def test_equal(self): rule = '-equal 3' content = '3.1' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 1) rule = '-equal 3' content = '3' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-equal 3' content = '3' last_content = '3' res = is_changed(rule, content, last_content) self.assertEqual(res, 0)
def test_less(self): rule = '-less 3' content = '3' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 1) rule = '-less 3' content = '2.9' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-less 3.1' content = '3' last_content = '3' res = is_changed(rule, content, last_content) self.assertEqual(res, 0)
def test_decrease(self): rule = '-decrease 3' content = '1882.1' last_content = '1885.1' res = is_changed(rule, content, last_content) self.assertEqual(res, 1) rule = '-decrease 3' content = '1882' last_content = '1885.1' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-decrease 0' content = '1888.1' last_content = '1888.1' res = is_changed(rule, content, last_content) self.assertEqual(res, 0) rule = '-decrease 0' content = '1888.0' last_content = '1888.1' res = is_changed(rule, content, last_content) self.assertEqual(res, 2)
def test_multi_rules(self): rule = '-contain 3;-contain 4' content = '3' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-contain 3;-contain 4' content = '4' last_content = '2' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-contain 3;-contain 4' content = '2' last_content = '1' res = is_changed(rule, content, last_content) self.assertEqual(res, 1) rule = '-contain 3;-contain 4' content = '3' last_content = '3' res = is_changed(rule, content, last_content) self.assertEqual(res, 0) rule = '-contain 3;-contain 4' content = '4' last_content = '4' res = is_changed(rule, content, last_content) self.assertEqual(res, 0) rule = '-contain 2;-more 4' content = '5' last_content = '1' res = is_changed(rule, content, last_content) self.assertEqual(res, 2) rule = '-contain 2;-more 4' content = '2' last_content = '1' res = is_changed(rule, content, last_content) self.assertEqual(res, 2)
def test_last_content_empty(self): rule = '' content = '变化' last_content = '' res = is_changed(rule, content, last_content) self.assertEqual(res, 3)
def monitor(id, type): status = '' global_content = None try: if type == 'html': task = Task.objects.get(pk=id) name = task.name url = task.url selector_type = task.selector_type selector = task.selector is_chrome = task.is_chrome content_template = task.template notifications = [i for i in task.notification.iterator()] regular_expression = task.regular_expression rule = task.rule headers = task.headers try: last = Content.objects.get(task_id=id, task_type=type) except Exception: last = Content(task_id=id) last_content = last.content content = get_content(url, is_chrome, selector_type, selector, content_template, regular_expression, headers) global_content = content status_code = is_changed(rule, content, last_content) logger.info( 'rule: {}, content: {}, last_content: {}, status_code: {}'. format(rule, content, last_content, status_code)) if status_code == 1: status = '监测到变化,但未命中规则,最新值为{}'.format(content) last.content = content last.save() elif status_code == 2: status = '监测到变化,且命中规则,最新值为{}'.format(content) msg = wraper_msg(content, url) send_message(msg, name, notifications) last.content = content last.save() elif status_code == 3: status = '监测到变化,最新值为{}'.format(content) msg = wraper_msg(content, url) send_message(msg, name, notifications) last.content = content last.save() elif status_code == 0: status = '成功执行但未监测到变化,当前值为{}'.format(content) elif type == 'rss': rss_task = RSSTask.objects.get(id=id) url = rss_task.url name = rss_task.name notifications = [i for i in rss_task.notification.iterator()] try: last = Content.objects.get(task_id=id, task_type=type) except Exception: last = Content(task_id=id, task_type='rss') last_guid = last.content item = get_rss_content(url) global_content = item['guid'] if item['guid'] != last_guid: content = wraper_rss_msg(item) send_message(content, name, notifications) last.content = item['guid'] last.save() status = '监测到变化,最新值:' + item['guid'] else: status = '成功执行但未监测到变化,当前值为{}'.format(last_guid) except FunctionTimedOut: logger.error(traceback.format_exc()) status = '解析RSS超时' except PartNotificationError as e: logger.error(traceback.format_exc()) status = repr(e) last.content = global_content last.save() except Exception as e: logger.error(traceback.format_exc()) status = repr(e) task_status = TaskStatus.objects.get(task_id=id, task_type=type) task_status.last_run = datetime.now() task_status.last_status = status task_status.save()