You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:48:00