NIEUW 📢 Beperkte lanceeractie: tot 70% korting op je eerste maand, voor elke game!Bekijk pakketten

Een telebot-bot 24/7 hosten (Go, Telegram)

Telegram-bothostingUpdated Nov 6, 202613 min read

Om een telebot-bot 24/7 te hosten laat je hem draaien op een machine die altijd aan staat: een Linux-VPS met een systemd-service die hem opnieuw start als hij stopt, of een botabonnement bij PlayNHost (vanaf US$1.99 per maand), waar je het klare programma uploadt en het paneel er de token aan geeft en het opnieuw start als het crasht. In onze test gebruikte een telebot 3.3.8-bot (gopkg.in/telebot.v3) zo'n 11 MB geheugen. Een Go-bot bouw je op je eigen computer als één Linux x86-64-programma: op de server wordt niets gecompileerd. De stappen bij PlayNHost:

  1. Bouw je bot op je computer voor Linux x86-64, zoals hieronder getoond onder Build it for Linux.
  2. Klik bij Telegram-bothosting op Server aanmaken bij een abonnement. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies Go.
  3. Open je server in het paneel. De kaart Je bot instellen op Overzicht opent bij Verbinden met Telegram; de eerste stap, Wat er draait, hoort Deze bot draait Go Bot. te zeggen.
  4. Plak bij Verbinden met Telegram de token van @BotFather onder Plak je bottoken, klik op Verbinden, controleer de getoonde botnaam en klik op Ja, doorgaan.
  5. Klik bij Je code op Bestanden uploaden, klik dan in Files op Uploaden en kies je programma, genaamd bot. Of laat de server het ophalen: zet op de pagina Bot, in het deel Code, bij de kaart Instellingen, de Downloadlink (optioneel) op een https-link naar het programma en klik op Opslaan.
  6. Klik op Bot starten en open Console. Na [PlayNHost] Starting your bot drukt je bot Logged in as @your_bot af en wordt de chip op Overzicht Online in Telegram.
  7. Klik op de pagina Bot, in het deel Telegram, op Openen in Telegram en stuur je bot /start.

Het maken van de bot in @BotFather en de instelkaart worden uitgelegd in Een Telegram-bot hosten. Het type Go Bot zelf (het Startbestand, de Startargumenten (optioneel) en de downloadlink) is hetzelfde voor Discord- en Telegram-bots: Een Go Discord-bot hosten. Deze pagina gaat over telebot: wat het op een server gebruikt en wat je moet weten voordat je het host.

Wat we hebben gemeten

BibliotheekVersieGeheugen zonder belastingStart tot het antwoord van het platformProgrammagrootte
telebot (Telegram)3.3.811 MB0,1 s8,1 MB
go-telegram/bot (Telegram)1.27.011 MB0,1 s8,1 MB
discordgo (Discord)0.29.012 MB0,3 s9,0 MB
Een Go-programma zonder bibliotheekGo 1.23.122 MBgeen2,1 MB

Hoe: op onze eigen node, in een wegwerpcontainer ingesteld als een botabonnement van 1 GB met één CPU en het Debian-image waarop ons type Go Bot draait, riep het programma van elke bibliotheek Telegram of Discord aan met een nep-token, wat werd geweigerd; het programma zonder bibliotheek deed geen aanroep. Het geheugen is het resident geheugen 15 seconden na dat antwoord, de starttijd loopt van het starten tot het antwoord en elk cijfer is de mediaan van de runs 2 tot 4. De programma's zijn gebouwd met Go 1.23.12 en CGO_ENABLED=0.

Dit zijn ondergrenzen: een programma zonder chats en nog zonder gegevens. Je eigen code, wat die in het geheugen houdt en het aantal chats komen erbovenop, dus een minimaal telebot-programma gebruikt maar een klein deel van het STARTER-abonnement van 0,5 GB.

Een minimale telebot-bot

Hij beantwoordt /start, leest de token die het paneel hem geeft, drukt een klaar-regel af, zegt duidelijk wanneer Telegram de token weigert en stopt netjes wanneer je op Stoppen drukt. Zet beide bestanden in één map en voer dan go mod tidy uit, dat telebot downloadt en go.sum schrijft.

go.mod

module bot

go 1.23

require gopkg.in/telebot.v3 v3.3.8

main.go

package main

import (
	"errors"
	"fmt"
	"os"
	"os/signal"
	"strings"
	"syscall"
	"time"

	tele "gopkg.in/telebot.v3"
	"gopkg.in/telebot.v3/middleware"
)

func main() {
	token := os.Getenv("TELEGRAM_BOT_TOKEN")
	if token == "" {
		fmt.Println("TELEGRAM_BOT_TOKEN is not set. Paste your token on the Bot page, Telegram, then restart.")
		os.Exit(1)
	}
	// Network errors contain the request address, and the address contains the token.
	hide := func(err error) string { return strings.ReplaceAll(err.Error(), token, "<token>") }

	b, err := tele.NewBot(tele.Settings{
		Token:  token,
		Poller: &tele.LongPoller{Timeout: 10 * time.Second},
	})
	if errors.Is(err, tele.ErrUnauthorized) {
		fmt.Println("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.")
		os.Exit(1)
	}
	if err != nil {
		fmt.Println("Could not start the bot:", hide(err))
		os.Exit(1)
	}

	// Without this, a panic in one handler stops the whole program.
	b.Use(middleware.Recover())

	b.Handle("/start", func(c tele.Context) error {
		return c.Send("Hello! I am running on PlayNHost.")
	})

	// A webhook left on the bot blocks polling. Remove it and keep the messages that are waiting.
	if err := b.RemoveWebhook(); err != nil {
		fmt.Println("Could not remove the webhook:", hide(err))
	}

	fmt.Println("Logged in as @" + b.Me.Username)
	go b.Start()

	// The panel stops the bot with Ctrl+C (SIGINT).
	stop := make(chan os.Signal, 1)
	signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
	<-stop
	b.Stop()
}

De regel Logged in as @your_bot zet de chip op Online in Telegram. Het paneel geeft je programma de token als TELEGRAM_BOT_TOKEN, en ook als TOKEN, BOT_TOKEN, TELEGRAM_TOKEN en TELOXIDE_TOKEN. Het README-voorbeeld van telebot leest os.Getenv("TOKEN"), dus de tokenregel daarvan werkt ook ongewijzigd.

Voor Linux bouwen

Vanuit je projectmap, op elke computer:

# macOS or Linux
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bot

# Windows PowerShell
$env:GOOS="linux"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0"; go build -o bot

CGO_ENABLED=0 maakt één op zichzelf staand bestand dat niet afhangt van de systeembibliotheken van de server, dus het draait op ons Debian-image op welk systeem je ook bouwt. Het resultaat is een bestand met de naam bot zonder extensie. Een Windows-.exe of een macOS-build draait niet op de server: de console zegt dan [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again.

Als de token fout is

In onze test gaf tele.NewBot met een nep-token deze fout terug (ons testprogramma drukte hem af na het type van de fout):

*telebot.Error: telegram: Unauthorized (401)

NewBot vraagt Telegram wie de bot is (getMe) voordat het terugkeert, dus een geweigerde token stopt het programma voordat het gaat pollen. telebot geeft zijn fout ErrUnauthorized terug voor het antwoord Unauthorized van Telegram. Het README-voorbeeld beëindigt het programma met log.Fatal(err); de bot hierboven drukt in plaats daarvan Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. af, een regel die het paneel herkent: het toont de banner Telegram heeft je bottoken niet geaccepteerd boven Console.

Om het op te lossen stuur je in @BotFather /mybots, kies je je bot, dan API Token, en kopieer je de token opnieuw. Klik op de pagina Bot, in het deel Telegram, op Token vervangen, plak hem, klik op Token opslaan en dan op Nu herstarten.

Wat je moet weten over telebot op een server

  • Fouten tijdens het pollen zijn stil. Als het opvragen van berichten bij Telegram mislukt, probeert de LongPoller van telebot het meteen opnieuw, zonder pauze, en drukt hij de fout alleen af als Verbose aan staat. Dus als een andere kopie van de bot met dezelfde token pollt (409 Conflict), er een webhook is ingesteld of de token wordt ingetrokken terwijl de bot draait, blijft je bot draaien maar krijgt hij weinig of geen berichten, en blijft de console stil. Stop elke andere kopie voordat je hem hier start, en lees Telegram-bot 409 Conflict oplossen.
  • Zien wat het pollen doet. Verbose: true in tele.Settings logt elk verzoek en het antwoord van Telegram, zodat de tekst 409 Conflict in Console verschijnt en het paneel Je bot draait ook ergens anders kan tonen. Het logt ook de berichten die mensen je bot sturen, dus zet het aan voor een test, niet permanent.
  • Een webhook die op de bot is blijven staan. b.Start() verwijdert geen webhook, en zolang er een is ingesteld, mislukt het pollen stil. De bot hierboven roept b.RemoveWebhook() aan voordat hij start, waardoor de wachtende berichten behouden blijven. Je kunt ook op Webhook verwijderen klikken in het deel Telegram. De Webhook-poller van telebot heeft een openbaar HTTPS-adres nodig, dat onze abonnementen nog niet bevatten: gebruik LongPoller.
  • Een panic in een handler beëindigt het programma. telebot draait elke handler in zijn eigen goroutine (tenzij Synchronous aan staat), en een panic daar stopt alles. b.Use(middleware.Recover()) maakt van een panic een fout die in plaats daarvan wordt afgedrukt. Roep b.Use aan vóór b.Handle: middleware wordt gekoppeld wanneer een handler wordt toegevoegd.
  • Handlerfouten worden voor je afgedrukt. Een fout die je handler teruggeeft, gaat naar de standaard foutafhandelaar van telebot, die het updatenummer en de fout afdrukt. Stel OnError in tele.Settings in om dat te veranderen.
  • Je token in foutmeldingen. telebot zet de token in elk verzoekadres (/bot gevolgd door de token), en de netwerkfouten van Go bevatten dat adres. De bot hierboven vervangt de token voordat hij een fout afdrukt. Deel geen ruwe consoleuitvoer van een bot die fouten ongewijzigd afdrukt.
  • Netjes stoppen. Het paneel stopt een Go-bot met Ctrl+C (SIGINT). b.Start() draait tot b.Stop() wordt aangeroepen, dus de bot hierboven start het in een goroutine, wacht op het signaal en roept dan b.Stop() aan, wat het lopende verzoek annuleert.
  • Updates. Het type Go Bot heeft geen veld Packages en geen Git-bron: je modules zitten in het programma. Om te updaten verwijder je het oude programma in Files, upload je de nieuwe build en herstart je. Met een downloadlink publiceer je de nieuwe build op die link, verwijder je het programma in Files en klik je op Starten.

Zelf hosten op een Linux-VPS

Kopieer het gebouwde programma naar de VPS; daar is geen Go nodig, en een build met CGO_ENABLED=0 hangt niet af van de systeembibliotheken van de VPS. Maak een gebruiker voor de bot, zet het programma in zijn map en bewaar de token in een bestand dat alleen root kan lezen:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo install -o mybot -m 755 bot /opt/mybot/bot
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

Maak /etc/systemd/system/mybot.service aan:

[Unit]
Description=telebot Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/opt/mybot/bot
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Start hem nu en bij elke boot, en volg dan zijn uitvoer:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f

systemctl stop stuurt standaard SIGTERM, waarnaar de bot hierboven ook luistert, dus hij stopt netjes. Restart=always start de bot opnieuw na een crash of een afsluiting. Stop eerst elke andere kopie: met telebot toont een 409 Conflict ook in journalctl niets.

Zelf hosten of een botabonnement

Op een VPS die je zelf beheert, zorg je voor:

  • Updates en beveiliging van het besturingssysteem.
  • Het kopiëren van elke nieuwe build, het servicebestand, het tokenbestand en de rechten ervan.
  • Het lezen van journalctl om te weten te komen waarom de bot is gestopt.
  • Back-ups van de gegevens van de bot.

Daar staat tegenover dat een VPS alles kan draaien, en je hem een domein met HTTPS kunt geven voor een webhook.

Bij een botabonnement van PlayNHost doet het paneel dit voor je:

  • Een Debian-image dat een Linux x86-64-programma draait, en een controle bij het starten die het zegt als het bestand een Windows- of macOS-build is.
  • Uploaden in Files, of een downloadlink die de server bij het starten ophaalt.
  • De token, gecontroleerd bij Telegram, versleuteld opgeslagen en aan je programma gegeven als TELEGRAM_BOT_TOKEN en TOKEN.
  • Het opnieuw starten van de bot na een crash. Crasht hij binnen een minuut opnieuw, dan blijft hij gestopt en zegt Console waarom.
  • Een knop Webhook verwijderen in het deel Telegram, en een banner boven Console wanneer je bot afdrukt dat Telegram de token heeft geweigerd.

Vragen die mensen stellen

Moet ik telebot v3 of v4 gebruiken?

v3.3.8 (6 aug. 2024) is de nieuwste stabiele versie en degene die we hebben gemeten. Het werk is verschoven naar v4: het is de standaardbranch van de repository en de README installeert gopkg.in/telebot.v4, maar het is nog een bèta (v4.0.0-beta.10, 16 juni 2026). De v4-bèta's voegen nieuwere versies van de Telegram Bot API toe, tot Bot API 10.1 in v4.0.0-beta.10, die v3.3.8 niet heeft. Het startvoorbeeld in de README is in beide hetzelfde op het importpad na. Beide draaien op dezelfde manier op onze servers: bouwen, uploaden, starten.

Waarom draait mijn telebot-bot maar antwoordt hij niet?

Meestal pollt een andere kopie met dezelfde token, op je pc of een oude host, of is er een webhook ingesteld. telebot drukt geen van beide problemen af, dus de console ziet er normaal uit. Stop de andere kopie, of trek de token in bij @BotFather en plak de nieuwe in het deel Telegram; controleer in hetzelfde deel op een webhook. Om de oorzaak te zien, herstart je één keer met Verbose: true.

Kan ik de webhook van telebot gebruiken in plaats van pollen?

Nog niet. Een webhook heeft een openbaar HTTPS-adres nodig, dat onze abonnementen nog niet bevatten. LongPoller heeft geen adres nodig: de bot vraagt Telegram om nieuwe berichten, met een wachttijd van 10 seconden in de bot hierboven.

telebot of go-telegram/bot?

Beide draaien op dezelfde manier op het type Go Bot. In onze test gebruikte go-telegram/bot 11 MB tegenover 11 MB voor telebot, dus het geheugen beslist niet tussen beide. De nieuwste release van go-telegram/bot is v1.27.0, van 11 sept. 2026. Als je een tutorial volgt, gebruik dan de bibliotheek die daarin wordt gebruikt.

Klaar om je telebot-bot de klok rond te laten draaien? Bekijk de abonnementen bij Telegram-bothosting.

Draait je bot al ergens anders? Verhuis hem naar ons

ONZE NIEUWSTE BLOGS