跳转到主要内容

将 Cryptohopper 市场报告发送到 Telegram、Discord 或电子邮件

学习如何发送 Cryptohopper MCP 报告到 Telegram、Discord 或邮箱,包含设置脚本、频道对比和常见投递问题修复。

作者:Isaac

准备工作

  • 一个能生成你想要发布内容的、可用的 MCP 工作流——可以参照如何构建每日热门报告的模板。

  • 一个用于发布的脚本环境。常用的选择是 PythonNode.js。发布是 MCP 生成其输出后的一个独立步骤,它本身不属于 MCP。

  • 你的目标频道的凭证:Telegram 或 Discord 的机器人令牌,或者用于邮件的 SMTP / 事务性邮件凭证。


设置 — Telegram

  1. 创建 Telegram 机器人

    @BotFather 发消息,输入 /newbot,然后按提示操作。保存好机器人令牌。

  2. 获取你的聊天 ID

    给你的 Telegram 机器人发一条任意消息,然后访问下面的 URL。响应中的 chat.id 就是你需要的值。

    https://api.telegram.org/bot /getUpdates

  3. 测试发布

    import requests

    TOKEN = "your_bot_token"
    CHAT_ID = "your_chat_id"

    def send_telegram(text: str) -> None:
    requests.post(
    f"https://api.telegram.org/bot{TOKEN}/sendMessage",
    json={
    "chat_id": CHAT_ID,
    "text": text,
    "parse_mode": "Markdown",
    },
    ).raise_for_status()

    send_telegram("Hello from your Cryptohopper MCP workflow")

Telegram 支持 Markdown,所以 MCP 中的表格和粗体格式可以原生显示。超过 4,096 个字符的消息必须拆分——在段落边界处截取长报告。


设置 — Discord

  1. 创建 Webhook

    在你的 Discord 服务器上,打开一个频道 → 点击齿轮图标 → Integrations → Webhooks → New Webhook。复制 Webhook URL。

  2. 测试发布

import requests

WEBHOOK = "https://discord.com/api/webhooks/..."

def send_discord(text: str) -> None:
requests.post(WEBHOOK, json={"content": text}).raise_for_status()

send_discord("Hello from your Cryptohopper MCP workflow")

Discord 的内容限制是每条消息 2,000 个字符——拆分长报告。Discord 没有原生的表格支持;使用三个反引号将表格格式化为对齐的代码块。为了获得更丰富的输出,请使用 Discord embeds(标题、描述、字段)而不是原始内容。


设置 — 邮件

两种选择:通过 Gmail 或类似服务发送 SMTP(简单、免费、有速率限制)或使用 SendGrid、Mailgun、Resend 等事务性服务(可靠,推荐用于计划性任务)。

SendGrid 示例

import os
import requests

API_KEY = os.environ["SENDGRID_API_KEY"]
FROM = os.environ.get("ALERT_FROM_EMAIL", "[email protected]")
TO = os.environ.get("ALERT_TO_EMAIL", "[email protected]")

def send_email(subject: str, body: str) -> None:
requests.post(
"https://api.sendgrid.com/v3/mail/send",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"personalizations": [{"to": [{"email": TO}]}],
"from": {"email": FROM},
"subject": subject,
"content": [{"type": "text/markdown", "value": body}],
},
).raise_for_status()

send_email("Daily top movers", "## Today's movers\n...")


使用 Markdown 或 HTML 来发送邮件报告——纯文本对于表格数据来说很快就难以阅读了。


选择合适的频道

频道

最适合

限制

Telegram

实时提醒,在手机上,一目了然

4,096 字符限制,Markdown 有限

Discord

团队共享频道,丰富的格式,围绕提醒进行讨论

2,000 字符限制,无原生表格

邮件

较长的摘要,存档,任何你以后想搜索的内容

延迟较高,容易被忽略

临时提醒 → Telegram。团队可见的输出 → Discord。晨报摘要 → 邮件。


标准模式

保持 MCP 步骤和发布步骤分开。发布失败(网络波动,令牌过期)不应丢失 MCP 输出——你仍然可以从日志中恢复它。

# 1. 运行 MCP 工作流(生成文本输出)
report_text = run_mcp_workflow(prompt)

# 2. 发布
try:
send_telegram(report_text)
except Exception as e:
log(f"发布失败: {e}")

故障排除

Telegram getUpdates 返回空列表

你还没有给机器人发消息,或者你使用的令牌不正确。先从你的 Telegram 账户给机器人发条消息,然后重试。

Discord Webhook 返回 429

达到速率限制。Discord Webhook 每分钟大约允许 30 条消息——请遵守 Retry-After 头部。对于高频率的警报,将多个事件合并到一个消息中,而不是每个事件都发送一条。

邮件进入垃圾箱

使用你自己拥有的域名下的有效发件人地址,并配置 SPF/DKIM/DMARC。避免全大写主题行、触发词和附件。事务性服务通常能正确处理这些问题;来自共享提供商的普通 SMTP 通常不行。

长 MCP 报告在 Telegram 或 Discord 中被截断

构建一个在段落边界处分块的拆分器。不要在表格行的中间拆分——在适合的最后一个完整行之后截取,并在下一条消息开头添加一个 (续) 标题。

计划运行中的发布悄无声息地失败,但手动运行却正常

最常见的原因是计划环境中的环境变量丢失或令牌过期。Cron 运行没有你的 shell 的 env;GitHub Actions 需要配置 secrets。记录每次失败的完整错误,以便立即发现。

只在真正出现标记时才发送提醒

使发布条件化——不要发送“没有报告内容”的消息,这会造成干扰,你会开始忽略该频道。

一次性将内容发布到多个频道

将发布包装成扇出模式,这样每个频道都是独立的,一个频道的失败不会阻止其他频道:for ch in [send_telegram, send_discord, send_email]: try ch(text)

这是否解答了您的问题?