Zurück zur Startseite

Telegram Lead Bot auf Python: Kostenloses CRM

Der Artikel beschreibt die Implementierung eines Lead-Bots in Telegram auf Python für ein Mini-CRM. Verwendet Yandex Cloud Functions, Supergroup-Themen und zustandslose Logik. Geeignet zur Verarbeitung von bis zu 20 Leads pro Monat ohne Kosten.

Kostenloser Telegram Bot CRM für Leads auf Python
Advertisement 728x90

Kostenloser Lead-Bot in Telegram mit Python und Yandex Cloud

Solo-Entwickler und kleine Teams können mit einem Telegram-Bot eine einfache CRM-Lösung aufbauen – ohne Kosten. Der Bot qualifiziert eingehende Leads mit nur zwei interaktiven Fragen, erstellt für jeden Kunden einen eigenen Themenbereich in einer Supergroup und ermöglicht eine vollständige bidirektionale Nachrichtenübermittlung. Bereitstellen auf Yandex Cloud Functions mit Free-Tier: 1 Million Aufrufe und 1 GB Objektspeicher pro Monat.

Ablauf: Nutzer folgt einem Deep Link von der Website → Bot fragt nach Branchentyp und Ziel → erstellt ein Thema wie »Iwan — E-Commerce — KI-Agent« → alle Kommunikation ist zentralisiert im Gruppenchat mit Suchfunktion und Benachrichtigungen.

Leichtgewichtiges Wrapper über die Telegram-Bot-API

Für Cloud-Funktionen funktionieren leichte Lösungen ohne schwere Frameworks wie aiogram am besten. Die Cold-Start-Zeit wird minimiert, indem ausschließlich httpx verwendet wird. Die gesamte API-Schicht umfasst nur 57 Zeilen:

Google AdInline article slot
"""telegram_api.py — minimaler Wrapper über die Bot-API."""
import os
import httpx

BOT_TOKEN = os.environ.get("BOT_TOKEN", "")
BASE_URL = f"https://api.telegram.org/bot{BOT_TOKEN}"

def _call(method: str, **kwargs) -> dict:
    resp = httpx.post(f"{BASE_URL}/{method}", json=kwargs, timeout=10)
    return resp.json()

def send_message(chat_id, text, reply_markup=None, message_thread_id=None):
    params = {"chat_id": chat_id, "text": text, "parse_mode": "HTML"}
    if reply_markup:
        params["reply_markup"] = reply_markup
    if message_thread_id:
        params["message_thread_id"] = message_thread_id
    return _call("sendMessage", **params)

def create_forum_topic(chat_id, name):
    return _call("createForumTopic", chat_id=chat_id, name=name)

def copy_message(chat_id, from_chat_id, message_id, message_thread_id=None):
    params = {"chat_id": chat_id, "from_chat_id": from_chat_id, "message_id": message_id}
    if message_thread_id:
        params["message_thread_id"] = message_thread_id
    return _call("copyMessage", **params)

copy_message wird gegenüber forward_message bevorzugt: Es entfernt den Text »Weitergeleitet von…« und hält die Nachrichten sauber.

Webhook-Handler mit Validierung

Die Yandex Cloud Function verarbeitet direkt HTTPS-Anfragen von Telegram (allow-unauthenticated-invoke). Die Validierung erfolgt mittels X-Telegram-Bot-Api-Secret-Token:

def handler(event, context):
    """Einstiegspunkt für Yandex Cloud Function."""
    headers = event.get("headers", {})
    secret = headers.get("X-Telegram-Bot-Api-Secret-Token") or \
             headers.get("x-telegram-bot-api-secret-token", "")
    if secret != WEBHOOK_SECRET:
        return {"statusCode": 403, "body": "Forbidden"}

    body = event.get("body", "{}")
    update = json.loads(body) if isinstance(body, str) else body

    if "callback_query" in update:
        _handle_callback(update["callback_query"])
    elif "message" in update:
        _handle_message(update["message"])

    return {"statusCode": 200, "body": "ok"}

Die Trennung der Logik in _handle_callback und _handle_message hält den Code übersichtlich und wartbar.

Google AdInline article slot

Zustandslose Lead-Qualifizierung

Der Befehl /start löst eine zweiteilige Umfrage aus: Erstens zum Branchentyp, zweitens zum Ziel. Die Callback-Daten kodieren beide Antworten: q2:sales:ecommerce. Die 64-Byte-Grenze wird für vorgegebene Optionen beachtet.

Beispiel für die erste Frage:

def _handle_start(chat_id, from_user):
    if storage.get_topic_id_by_user(chat_id):
        tg.send_message(chat_id,
            "Sie haben bereits eine Anfrage abgeschickt. Wir melden uns bald bei Ihnen.

"            "Wenn Sie etwas ergänzen möchten, antworten Sie einfach hier.")
        return

    keyboard = {"inline_keyboard": [
        [{"text": "E-Commerce / Marktplätze", "callback_data": "q1:ecommerce"}],
        [{"text": "Dienstleistungen / SaaS",           "callback_data": "q1:services"}],
        [{"text": "Fertigung",               "callback_data": "q1:production"}],
        [{"text": "IT / Startup",               "callback_data": "q1:it"}],
        [{"text": "Sonstiges",                     "callback_data": "q1:other"}],
    ]}
    tg.send_message(chat_id, f"Hallo, {from_user.get('first_name', '')}! Ich bin der VexAI-Bot.

"                      "Beantworten Sie 2 kurze Fragen, dann kontaktieren wir Sie.")
    tg.send_message(chat_id, "<b>Welche Art von Unternehmen betreiben Sie?</b>", reply_markup=keyboard)

Duplikatvermeidung: Überprüfung der Zuordnung im Objektspeicher. Für »Sonstiges« wird eine temporäre Statusdatei genutzt.

Google AdInline article slot

Die zweite Frage funktioniert ähnlich und überträgt den q1_key in den Callback-Daten.

Themen-Erstellung und Nachrichtenweiterleitung

Nach Abschluss der Umfrage wird ein Thema mit einer Länge von maximal 128 Zeichen erstellt:

def _finalize(chat_id, from_user, q1_answer, q2_answer):
    tg.send_message(chat_id, "Danke! Wir melden uns kurz bei Ihnen.")

    full_name = f"{from_user.get('first_name', '')} {from_user.get('last_name', '')}".strip()
    topic_title = f"{full_name} — {q1_answer} — {q2_answer}"
    if len(topic_title) > 128:
        topic_title = topic_title[:125] + "..."

    result = tg.create_forum_topic(ADMIN_GROUP_ID, topic_title)
    topic_id = result["result"]["message_thread_id"]

    summary = (f"<b>Neuer Lead</b>\n\n"
               f"<b>Name:</b> {full_name}\n"
               f"<b>Branche:</b> {q1_answer}\n"
               f"<b>Ziel:</b> {q2_answer}\n"
               f"<b>Quelle:</b> Webseite")
    tg.send_message(ADMIN_GROUP_ID, summary, message_thread_id=topic_id)

    storage.save_topic_mapping(topic_id, chat_id)
    storage.save_user_mapping(chat_id, topic_id)

Nachrichtenweiterleitung in _handle_message:

  • Admin antwortet im Thema → kopiert an den Kunden.
  • Kunde schreibt an den Bot → kopiert ins Thema.

Deep Links werden unterstützt: /start website zur Quellenverfolgung.

Einrichtung und Einschränkungen

  • Erstellen Sie eine Supergroup und aktivieren Sie Themen.
  • Fügen Sie den Bot als Admin hinzu: Themen verwalten, Nachrichten senden.
  • Konfigurieren Sie Yandex Cloud: Service Account mit storage.editor, Bucket, Zugriffsschlüssel.
  • Richten Sie den Webhook mit Token-Token ein.

Sie erhalten:

  • Durchsuchbare Lead-Historie.
  • Echtzeit-Benachrichtigungen.
  • Pinnierte Lead-Karten.

Einschränkungen: Kein Verkaufsfunnel, keine Analytics, kein Team-Work. Ideal für bis zu 20 Leads pro Monat.

Wichtige Erkenntnisse

  • Kostenlose Bereitstellung: Yandex Cloud Functions + Objektspeicher im Free-Tier.
  • Zustandslose Architektur: Callback-Daten speichern den Zustand; minimaler Speicherbedarf.
  • Vollständige Weiterleitung: Alle Gespräche sind in Themen zentralisiert – keine externen Tools nötig.
  • Sicherheit: Secret-Token + Duplikat-Schutz.
  • Skalierbarkeit: Unterstützt bis zu 20 Leads pro Monat ohne kostenpflichtige CRM-Software.

— Editorial Team

Advertisement 728x90

Weiterlesen