Spidermon集成Telegram Bot:如何将自定义消息纳入通知?
解决Spidermon Telegram通知不包含自定义测试消息的问题
我之前也遇到过一模一样的问题——默认的Telegram通知动作只会发送通用的爬虫结束信息,不会自动带上你在测试用例里定义的自定义错误提示。要解决这个问题,有两种灵活的方案可选:
方法1:自定义Telegram通知动作(最灵活可控)
你可以继承默认的SendTelegramMessageSpiderFinished类,重写get_message方法,把失败测试的详情(包括你定义的msg)拼接进最终发送的消息里:
from spidermon.contrib.actions.telegram.notifiers import SendTelegramMessageSpiderFinished class CustomTelegramNotifier(SendTelegramMessageSpiderFinished): def get_message(self): # 获取默认的基础消息(包含爬虫名称、运行状态、耗时等) base_message = super().get_message() # 提取所有失败的测试用例 failed_tests = self.data.monitor_results.failed if failed_tests: # 拼接自定义的失败详情 error_details = "\n\n⚠️ 失败测试详情:" for test in failed_tests: error_details += f"\n- {test.name}: {test.message}" base_message += error_details return base_message
然后在你的监控套件里替换原来的通知动作:
class SpiderCloseMonitorSuite(MonitorSuite): monitors = [ ItemCountMonitor, ErrorCountMonitor ] monitors_failed_actions = [ CustomTelegramNotifier, # 使用自定义通知类 ]
方法2:修改消息模板(更简洁)
如果不想编写自定义类,也可以通过配置SPIDERMON_TELEGRAM_MESSAGE_TEMPLATE来直接渲染包含失败测试详情的消息。在你的Scrapy项目settings.py中添加:
SPIDERMON_TELEGRAM_MESSAGE_TEMPLATE = """ 🐜 爬虫 {{ spider.name }} 运行结束 状态:{{ status }} 耗时:{{ elapsed_time }} {% if failed_tests %} ❌ 失败测试列表: {% for test in failed_tests %} - {{ test.name }}: {{ test.message }} {% endfor %} {% endif %} """
这个模板会自动读取failed_tests变量(其中包含所有失败测试的name和message——也就是你在测试用例里定义的msg),默认的通知动作会自动渲染并发送这个模板内容。
关键说明
- 你当前测试用例中
self.assertTrue(..., msg=msg)的写法是正确的,这个msg会被自动保存到测试结果的message属性中,两种方案都能读取到它。 - 确保你的Spidermon版本是较新的,旧版本可能不支持
failed_tests这类模板变量。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

