Poradnik

Bot Telegram do formularza: pisać własnego?

Kreatory AI często radzą: „napisz własnego bota”. Oto kod, który działa, czego mu brakuje i kiedy bot w ogóle nie jest potrzebny.

Krótka odpowiedź. Zgłoszenia z formularza można wysyłać do Telegrama własnym botem: utwórz go w @BotFather, znajdź chat ID i przekazuj formularz przez małą funkcję serwerową, która wywołuje sendMessage. Token bota musi zostać na serwerze. Jeśli nie chcesz utrzymywać tego kodu, usługa formularzy z wbudowanym Telegramem zrobi to samo bez bota.

Formgong·

Bot Telegram do formularza: pisać własnego?
Bot Telegram do formularza: pisać własnego?

Trzy sposoby na zgłoszenia w Telegramie

Zapytaj Bolt, Lovable albo ChatGPT, jak wysłać formularz do Telegrama, a zwykle usłyszysz: „zbuduj własnego bota”. To działa. Ale to tylko jedna z trzech dróg:

  • Własny bot i mała funkcja serwerowa. Za darmo u większości hostingów i w pełni pod Twoją kontrolą. Piszesz i utrzymujesz około 25 linii kodu.
  • Narzędzie do automatyzacji, np. Zapier, Make lub n8n. Webhook odbiera formularz, kolejny krok wysyła go do Telegrama. Bez kodu, ale to kolejne konto i osobny cennik.
  • Usługa formularzy z wbudowanym Telegramem. Zmieniasz action formularza i podłączasz czat. Bez bota i bez kodu serwera. Tak działa Formgong, a także Formspree z wtyczką Telegram.

Poniżej budujemy pierwszą opcję od początku do końca. Potem pokazujemy, czego ten kod nie robi, żeby wybór był świadomy.

1. Utwórz bota i znajdź chat ID

  1. Otwórz @BotFather w Telegramie i wyślij /newbot. Podaj nazwę i nazwę użytkownika kończącą się na bot.
  2. BotFather odeśle token w stylu 123456789:AAH…. Traktuj go jak hasło.
  3. Otwórz nowego bota i naciśnij Start. Bez tego bot nie może do Ciebie pisać.
  4. W przeglądarce otwórz https://api.telegram.org/bot<TOKEN>/getUpdates. Znajdź "chat":{"id":…}. Ta liczba to Twój chat ID.

Dla grupy zespołu dodaj bota do grupy i wyślij tam /start@your_bot. ID grup są ujemne, np. -1001234567890. Zostaw minus.

2. Przekaż formularz przez Cloudflare Worker

Formularz potrzebuje serwera, który trzyma token i wywołuje Bot API. Najmniejsza opcja to Cloudflare Worker. Darmowy plan Workers obejmuje 100 000 żądań dziennie (sprawdzone 03.10.2026). Ten sam kod pasuje też do Supabase Edge Function lub Netlify Function.

Worker czyta formularz, odrzuca boty złapane w ukryte pole-pułapkę, skraca długie wartości i wysyła zwykły tekst. Zwykły tekst nie psuje się przy imionach z apostrofem czy znakiem <. Wiadomość w Telegramie mieści do 4096 znaków, dlatego treść zgłoszenia przycinamy do 3000.

JavaScript
// src/index.js: odbiera formularz i wysyła go do Telegrama
export default {
  async fetch(request, env) {
    if (request.method !== "POST") return new Response("POST only", { status: 405 });
    const form = await request.formData();
    // Honeypot: people never see this field, bots fill it in.
    if (form.get("botcheck")) return Response.redirect(env.THANK_YOU_URL, 303);
    const name = String(form.get("name") ?? "").slice(0, 200);
    const email = String(form.get("email") ?? "").slice(0, 200);
    const message = String(form.get("message") ?? "").slice(0, 3000);
    if (!email || !message) return new Response("Email i wiadomość są wymagane", { status: 400 });
    const text = `Nowe zgłoszenie\nImię: ${name}\nEmail: ${email}\n\n${message}`;
    const sent = await fetch(`https://api.telegram.org/bot${env.TELEGRAM_BOT_TOKEN}/sendMessage`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ chat_id: env.TELEGRAM_CHAT_ID, text }),
    });
    if (!sent.ok) return new Response("Nie udało się dostarczyć wiadomości", { status: 502 });
    return Response.redirect(env.THANK_YOU_URL, 303);
  },
};
Polecenia wdrożenia i sekrety
Terminal
npm create cloudflare@latest contact-to-telegram
cd contact-to-telegram
# paste the Worker code into src/index.js, then:
npx wrangler secret put TELEGRAM_BOT_TOKEN
npx wrangler secret put TELEGRAM_CHAT_ID
# add to wrangler.jsonc: "vars": { "THANK_YOU_URL": "https://example.com/dziekujemy" }
npx wrangler deploy
Formularz HTML wysyłający dane do Workera
HTML
<form action="https://contact-to-telegram.YOUR-SUBDOMAIN.workers.dev" method="POST">
  <label>Imię <input name="name" autocomplete="name"></label>
  <label>Email <input type="email" name="email" required autocomplete="email"></label>
  <label>Wiadomość <textarea name="message" required></textarea></label>
  <input type="text" name="botcheck" tabindex="-1" autocomplete="off" hidden>
  <button type="submit">Wyślij</button>
</form>

Nigdy nie umieszczaj tokena bota w przeglądarce

Część wygenerowanego kodu wywołuje api.telegram.org prosto ze strony. W podglądzie to działa. Ale każdy może otworzyć źródło strony, skopiować token i przejąć bota: pisać w jego imieniu, czytać aktualizacje albo zmienić webhook.

Trzymaj token w sekrecie po stronie serwera, jak w poleceniach powyżej. Jeśli token trafił już do kodu frontendu, wyślij do BotFather /revoke i zapisz nowy token jako sekret. To samo dotyczy projektów w Bolt i Lovable: poproś kreator o przeniesienie wywołania do funkcji backendu, a tokena do jej sekretów.

Czego nie robi bot zbudowany samodzielnie

Powyższy Worker to działające minimum. Zanim powierzysz mu prawdziwe zgłoszenia, poznaj jego braki:

  • Brak kopii zgłoszenia. Gdy Telegram nie działa albo chat ID jest błędny, odwiedzający widzi błąd, a wiadomość nie zostaje nigdzie zapisana. Jeśli zgłoszenia są ważne, dodaj bazę albo email.
  • Słaba ochrona przed spamem. Honeypot zatrzymuje tylko proste boty. Gdy pojawi się spam, dodaj Cloudflare Turnstile albo limity żądań.
  • Jeden czat, bez statusów. Kilka czatów, przyciski „załatwione” czy przypomnienia o zgłoszeniach bez odpowiedzi to dodatkowy kod.
  • Limity. Telegram prosi, by bot wysyłał najwyżej około jednej wiadomości na sekundę do jednego czatu i 20 wiadomości na minutę do grupy. Formularz kontaktowy rzadko się do tego zbliża.
  • Utrzymanie. Wymiana tokena, alerty o błędach i aktualizacje są teraz po Twojej stronie.

Bez bota: podłącz Telegram do formularza

Jeśli potrzebujesz tylko każdego zgłoszenia w czacie, usługa formularzy oszczędzi Ci bota i Workera. W Formgong wygląda to tak:

  1. Odbierz darmowy klucz formularza na formgong.com i potwierdź email.
  2. Skieruj formularz do Formgong: ustaw action="https://formgong.com/submit" i dodaj klucz w ukrytym polu. Wygląd formularza się nie zmienia.
  3. W ustawieniach formularza otwórz Telegram i kliknij „Połącz”. Otworzy się bot Formgong; naciśnij Start. Dla grupy dodaj bota i wyślij kod /connect z ustawień.

Każde zgłoszenie trafia też do skrzynki w panelu i na email, a spam jest odfiltrowany, zanim dotrze do czatu. Telegram jest w darmowym planie z 300 zgłoszeniami miesięcznie; szczegóły w cenniku. Instrukcja krok po kroku: zgłoszenia ze strony w Telegramie. Usługi z Telegramem porównujemy w porównaniu usług formularzy.

Pytania i odpowiedzi

Czy token bota Telegram może być w kodzie strony?

Nie. Każdy, kto otworzy źródło strony, może skopiować token i sterować botem. Trzymaj go w sekrecie na serwerze i wywołuj Bot API z funkcji serwerowej. Jeśli wyciekł, unieważnij go w BotFather.

Jak znaleźć chat ID w Telegramie?

Naciśnij Start w czacie z botem, a potem otwórz w przeglądarce adres getUpdates ze swoim tokenem. Potrzebna wartość to id w polu chat. Dla grupy wyślij w niej /start@your_bot; ID grup są ujemne.

Czy bot może wysyłać zgłoszenia do grupy?

Tak. Dodaj bota do grupy, odczytaj ID grupy z getUpdates i użyj go jako chat_id. Telegram pozwala botowi na około 20 wiadomości na minutę w jednej grupie.

Czy Cloudflare Worker jest darmowy dla formularza kontaktowego?

Dla większości stron tak. Darmowy plan Workers obejmuje 100 000 żądań dziennie według stanu na 3 października 2026. Jedno zgłoszenie to jedno żądanie.

Czy do zgłoszeń w Telegramie potrzebny jest własny bot?

Nie. Usługi formularzy, takie jak Formgong, podłączają czat do formularza przez własnego bota. Zmieniasz tylko action formularza i klikasz „Połącz” w ustawieniach.

Źródła i dokumentacja

Oficjalne materiały pomocnicze: Telegram Bot API: sendMessage, Telegram Bot FAQ: limits, Telegram: BotFather, Cloudflare Workers pricing, Cloudflare Workers secrets. Dokumentacja Formgong, Przechowywanie danych.

Artykuł w formacie Markdown
← Wróć do bloga