Przejdź do głównej zawartości

Wyślij raporty Cryptohopper MCP na Telegram, Discord lub e-mail

Naucz się wysyłać raporty Cryptohopper MCP na Telegram, Discord lub e-mail – skrypty, porównanie kanałów i poprawki błędów.

Napisane przez Isaac

Wymagania wstępne

  • Działający przepływ pracy MCP, który generuje treści, które chcesz dostarczyć — zobacz, jak zbudować raport codziennych największych moverów jako szablon.

  • Środowisko skryptowe do kroku dostarczania. Python lub Node.js to popularne wybory. Dostarczanie jest osobnym krokiem po tym, jak MCP wygeneruje swój wynik — nie jest jego częścią.

  • Poświadczenia dla Twojego kanału docelowego: token bota dla Telegrama lub Discorda, albo poświadczenia SMTP / transactional email dla poczty e-mail.


Konfiguracja — Telegram

  1. Utwórz bota na Telegramie

    Napisz wiadomość do @BotFather, wyślij /newbot i postępuj zgodnie z instrukcjami. Zachowaj token bota.

  2. Uzyskaj swój ID czatu

    Wyślij dowolną wiadomość do swojego bota na Telegramie, a następnie pobierz poniższy URL. chat.id w odpowiedzi to to, czego potrzebujesz.

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

  3. Przetestuj dostarczanie

    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 obsługuje Markdown, więc tabele i pogrubienia z MCP są renderowane natywnie. Wiadomości dłuższe niż 4096 znaków muszą zostać podzielone — dziel długie raporty na granicach akapitów.


Konfiguracja — Discord

  1. Utwórz webhooka

    Na swoim serwerze Discord, otwórz kanał → ikona zębatki → Integracje → Webhooks → Nowy Webhook. Skopiuj URL webhooka.

  2. Przetestuj dostarczanie

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")

Limit treści Discorda wynosi 2000 znaków na wiadomość — dziel długie raporty. Discord nie ma natywnego wsparcia dla tabel; formatuj tabele jako wyrównane bloki kodu przy użyciu potrójnych cudzysłowów. Aby uzyskać bogatsze wyjście, użyj wbudowanych elementów widżetów Discorda (tytuł, opis, pola) zamiast surowej treści.


Konfiguracja — Poczta e-mail

Dwie opcje: SMTP przez Gmaila lub podobne (proste, darmowe, ograniczone tempo) lub usługa transakcyjna, jak SendGrid, Mailgun lub Resend (niezawodne, preferowane dla zaplanowanych zadań).

Przykład 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...")


Używaj Markdown lub HTML do raportów wysyłanych e-mailem — zwykły tekst szybko staje się nieczytelny dla danych tabelarycznych.


Wybór odpowiedniego kanału

Kanał

Najlepszy do

Ograniczenia

Telegram

Alerty w czasie rzeczywistym, na telefonie, szybkie czytanie

Limit 4096 znaków, Markdown-lite

Discord

Wspólny kanał zespołu, bogate formatowanie, dyskusja wokół alertów

Limit 2000 znaków, brak natywnych tabel

Poczta e-mail

Dłuższe podsumowania, archiwizacja, wszystko, co będziesz chciał później wyszukać

Wyższa latencja, łatwo zignorować

Alerty ad-hoc → Telegram. Wyjście widoczne dla zespołu → Discord. Poranne podsumowania → e-mail.


Kanoniczny wzorzec

Oddziel krok MCP i krok dostarczania. Awaria dostarczenia (zakłócenie sieci, wygasły token) nie powinna spowodować utraty wynikowi MCP — możesz go nadal odzyskać z logów.

# 1. Uruchom przepływ pracy MCP (generuje dane wyjściowe tekstowe)
report_text = run_mcp_workflow(prompt)

# 2. Dostarcz
try:
send_telegram(report_text)
except Exception as e:
log(f"Delivery failed: {e}")

Rozwiązywanie problemów

getUpdates na Telegramie zwraca pustą listę

Nie wysłałeś jeszcze żadnej wiadomości do bota lub wykonujesz zapytanie z innym tokenem. Najpierw wyślij dowolną wiadomość ze swojego konta Telegram do bota, a następnie spróbuj ponownie.

Webhook Discorda zwraca 429

Osiągnięto limit przydziału. Webhooki Discorda pozwalają na około 30 wiadomości na minutę — przestrzegaj nagłówka Retry-After. W przypadku alertów o wysokiej częstotliwości grupuj wiele zdarzeń w jedną wiadomość, zamiast wysyłać jedną na zdarzenie.

E-maile trafiają do spamu

Użyj poprawnego adresu nadawcy z własnej domeny, z skonfigurowanym SPF/DKIM/DMARC. Unikaj tematów pisanych wielkimi literami, słów wywołujących spam i załączników. Usługa transakcyjna obsługuje większość z tego poprawnie; zwykły SMTP od współdzielonego dostawcy często tego nie robi.

Długie raporty MCP są przycinane na Telegramie lub Discordzie

Zbuduj dzielnik, który łamie tekst na granicach akapitów. Nie dziel w środku wiersza tabeli — tnij po ostatnim pełnym wierszu, który się mieści, a następną wiadomość otwórz nagłówkiem (ciąg dalszy).

Dostarczanie cicho zawodzi podczas zaplanowanych uruchomień, ale działa ręcznie

Najczęstszą przyczyną jest brak zmiennej środowiskowej lub wygasły token w zaplanowanym środowisku. Zadania Cron uruchamiają się bez środowiska Twojej powłoki; GitHub Actions wymaga skonfigurowania sekretów. Zaloguj pełny błąd przy każdej awarii, aby natychmiast się pojawił.

Chcesz otrzymywać alerty tylko wtedy, gdy coś faktycznie zostanie oznaczone

Uczyń dostarczanie warunkowym — nie wysyłaj wiadomości "nic do zgłoszenia", stają się one szumem i zaczniesz ignorować kanał.

Chcesz dostarczać do wielu kanałów jednocześnie

Zapakuj dostarczanie w wyjście rozproszone (fan-out), aby każdy kanał był niezależny, a awaria w jednym nie blokowała pozostałych: for ch in [send_telegram, send_discord, send_email]: try ch(text).

Czy to odpowiedziało na twoje pytanie?