Telegram News Bot in Python (2026): aiogram + APScheduler

Kent Hudson

Kent Hudson

·

25 minuten Lesen

Telegram News Bot in Python (2026): aiogram + APScheduler

Erstellen eines Telegramm-Nachrichtenbots mit Python (2026-Edition)

Ein Telegram-Nachrichtenbot ist ein Python-Programm, das Artikel aus einer Nachrichtenquelle API abruft, sie nach Thema oder Sentiment filtert und sie automatisch in einen Telegram-Chat oder -Kanal postet. In 2026 ist die schnelle Möglichkeit, einen zu erstellen, aiogram 3.27 für den asynchronen Telegram-Client, APScheduler für In-Process-Planung und eine Nachrichtenquelle API, die Sentiment und Entitäten offenlegt, damit Sie kuratierte Streams statt alles posten können.

Wichtige Erkenntnisse

  • Verwenden Sie aiogram 3.27 (async) anstelle von python-telegram-bot für Kanal-Auto-Posting-Bots mit über ca. 50 gleichzeitigen Benutzern.
  • Filtern Sie die API-Antwort der Nachrichten nach sentiment.overall.polarity und entities[], damit der Kanal kuratierte Inhalte und nicht alles postet.
  • APScheduler's AsyncIOScheduler läuft innerhalb der aiogram-Ereignisschleife – ein Prozess für Abfragen, Abruf und geplante Veröffentlichung.
  • Auslieferung als mehrstufiges Python 3.12 Docker-Image mit restart: unless-stopped; Fly.io, Railway oder ein VPS für $5/Monat sind alle geeignet.

Dieses Tutorial führt durch einen produktionsreifen Kanal-Bot in etwa 100 Zeilen: Er zieht Artikel alle 15 Minuten, verwirft alles, was nicht mit dem Sentiment- und Entitätsfilter übereinstimmt, dedupliziert nach Artikel-ID und überlebt einen Container-Neustart. Am Ende haben Sie einen Docker-Container-Dienst, den Sie auf jedem VPS einsetzen können.

Was Sie bauen werden

  • Ein asynchroner Telegram-Bot, der automatisch Nachrichten in einen Kanal postet
  • Sentiment + Entitätsfilter (e.g., nur negative Artikel über Tesla posten)
  • APScheduler läuft innerhalb der aiogram-Ereignisschleife – kein Cron, kein zweiter Prozess
  • Deduplizierung nach Artikel-ID und Wiederholung bei Telegram-Ratenlimits
  • Ein mehrstufiger Dockerfile mit restart: unless-stopped, den Sie noch heute versenden können

aiogram vs. python-telegram-bot — schnelle Entscheidung

Beide Bibliotheken werden in 2026 gepflegt; die richtige Wahl hängt von der Arbeitslast ab.

Kriteriumaiogram 3.27python-telegram-bot 21.x
Concurrency-ModellNur Async (asyncio)Async seit v20; Sync-Wrapper noch verfügbar
Latenz bei 100 gleichzeitigen Updates~80 ms 95~600 ms 95 (synchron) / ~120 ms (asynchron)
Kanal-Auto-Post + Scheduler in einem ProzessNative Passform (AsyncIOScheduler)Funktioniert, aber mehr Boilerplate
FSM, Middleware, FilterFirst-ClassFirst-Class
Am besten geeignet fürKanal-/Gruppenbots, Nachrichten-/Benachrichtigungsströme, >500 BenutzerPersönliche Bots, befehlsgesteuerte Workflows, schrittweise Migration von synchron zu asynchron
Community-Entwicklung im 2026Schneller bewegend, Fokus auf Channel-BotsGrößeres Ökosystem, mehr Legacy-Beispiele

aiogram ist seit Version 3 nur noch asynchron, was bedeutet, dass es sich eine einzige Ereignisschleife mit AsyncIOScheduler und httpx.AsyncClient teilt – keine Brücken, keine Thread-Pools, keine Callback-Wrapper. Praktische Regel: unter 50 gleichzeitigen Updates ist jede Bibliothek in Ordnung; über 500 oder für jeden Channel-Auto-Poster hinaus wählen Sie aiogram. Wir werden aiogram für den Rest dieses Tutorials verwenden.

Voraussetzungen

  • Python 3.10 oder neuer (3.12 empfohlen)
  • Ein Telegram-Bot-Token von @BotFather
  • Ein Telegram-Kanal, zu dem Ihr Bot als Administrator mit der Berechtigung „Nachrichten posten“ hinzugefügt wurde
  • Ein APITube API-Schlüssel von apitube.io – die kostenlose Stufe beinhaltet Sentiment und Entitäten bei jedem Artikel (Offenlegung: Ich arbeite an APITube)
  • Vertrautheit mit async/await – wenn await client.get(...) fremd aussieht, überfliegen Sie zuerst das Python asyncio Tutorial

Wie man einen Telegram-Nachrichtenbot in Python erstellt (6 Schritte)

  1. Holen Sie sich ein Bot-Token von BotFather
  2. Richten Sie das Projekt ein und installieren Sie Abhängigkeiten
  3. Nachrichten von APITube abrufen (async)
  4. Filtern nach Sentiment und Entitäten
  5. Kanalbeiträge mit APScheduler planen
  6. Befehle /start, /subscribe, /filter hinzufügen

Schritt 1 – Holen Sie sich ein Bot-Token von BotFather

Öffnen Sie Telegram, senden Sie eine Nachricht an @BotFather, senden Sie /newbot, wählen Sie einen Namen und einen Benutzernamen. Sie erhalten ein Token, das wie 8123456789:AAH... aussieht. Speichern Sie es.

Erstellen Sie dann einen Kanal (oder verwenden Sie einen vorhandenen), öffnen Sie dessen Einstellungen → Administratoren → Administrator hinzufügen → suchen Sie nach dem Benutzernamen Ihres Bots → gewähren Sie „Nachrichten posten“. Holen Sie sich die Kanal-ID, indem Sie eine beliebige Kanalnachricht an @JsonDumpBot weiterleiten – Sie benötigen die chat.id, die bei Kanälen eine negative Zahl wie -1001234567890 ist.

Schritt 2 – Richten Sie das Projekt ein

mkdir telegram-news-bot && cd telegram-news-bot
python -m venv .venv && source .venv/bin/activate
pip install aiogram==3.27.0 apscheduler==3.10.4 httpx==0.27.0 python-dotenv==1.0.1

Erstellen Sie .env:

BOT_TOKEN=8123456789:AAH...
CHANNEL_ID=-1001234567890
APITUBE_KEY=your_apitube_key

Schritt 3 – Nachrichten von APITube abrufen

Der GET /v1/news/everything-Endpunkt von APITube nimmt einen Suchbegriff, eine Sprache, eine Kategorie und einen Datumsbereich entgegen und gibt Artikel zurück, die mit Sentiment-Scores und benannten Entitäten angereichert sind. Die Authentifizierung erfolgt über den X-API-Key-Header.

Schnelle Plausibilitätsprüfung von der Shell aus:

curl "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2" \
  -H "X-API-Key: $APITUBE_KEY"

Antwort – ein vollständiges Artikelobjekt, jedes Feld, das APITube pro Ergebnis zurückgibt:

{
  "status": "ok",
  "limit": 2,
  "path": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1",
  "page": 1,
  "has_next_pages": true,
  "next_page": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=2",
  "has_previous_page": false,
  "previous_page": "",
  "export": {
    "json": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=json",
    "xlsx": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=xlsx",
    "csv": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=csv",
    "tsv": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=tsv",
    "xml": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=xml",
    "rss": "https://api.apitube.io/v1/news/everything?title=Tesla&language.code=en&per_page=2&page=1&export=rss"
  },
  "request_id": "5978d89c-46f6-4ab4-b65c-8b4a6000d4ac",
  "results": [
    {
      "id": 982451653,
      "href": "https://example.com/tesla-recall",
      "published_at": "2026-05-02T08:14:00Z",
      "title": "Tesla recalls 1.2M vehicles over autopilot flaw",
      "description": "The recall covers most Model 3 and Y units...",
      "body": "Tesla on Friday recalled roughly 1.2 million vehicles over a defect in its autopilot driver-assistance system. The recall covers most Model 3 and Model Y units built since 2023.",
      "body_html": "<p>Tesla on Friday recalled roughly 1.2 million vehicles over a defect in its autopilot driver-assistance system. The recall covers most Model 3 and Model Y units built since 2023.</p>",
      "language": "en",
      "author": {
        "id": 4521,
        "name": "Jane Doe"
      },
      "image": "https://example.com/images/tesla-recall.jpg",
      "categories": [
        {
          "id": 211,
          "name": "transport",
          "score": 0.91,
          "taxonomy": "iptc_mediatopics",
          "links": {
            "self": "https://api.apitube.io/v1/news/category/iptc_mediatopics/medtop:20000337"
          }
        }
      ],
      "topics": [
        {
          "id": "industry.automotive_news",
          "name": "Automotive Industry News",
          "score": 0.34,
          "links": {
            "self": "https://api.apitube.io/v1/news/topic/industry.automotive_news"
          }
        }
      ],
      "industries": [
        {
          "id": 88,
          "name": "Automotive",
          "links": {
            "self": "https://api.apitube.io/v1/news/industry/88"
          }
        }
      ],
      "entities": [
        {
          "id": 8821,
          "name": "Tesla",
          "type": "organization",
          "links": {
            "self": "https://api.apitube.io/v1/news/entity/8821",
            "wikipedia": "https://en.wikipedia.org/wiki/Tesla,_Inc.",
            "wikidata": "https://www.wikidata.org/wiki/Q478214"
          },
          "frequency": 5,
          "title": {
            "pos": [
              {"start": 0, "end": 5}
            ]
          },
          "body": {
            "pos": [
              {"start": 0, "end": 5},
              {"start": 142, "end": 147}
            ]
          },
          "metadata": {
            "name": "Tesla",
            "type": "business",
            "country": {"code": "US", "name": "United States"},
            "description": "Electric vehicle manufacturer"
          }
        },
        {
          "id": 19233,
          "name": "Model 3",
          "type": "product",
          "links": {
            "self": "https://api.apitube.io/v1/news/entity/19233"
          },
          "frequency": 2,
          "title": {
            "pos": []
          },
          "body": {
            "pos": [
              {"start": 58, "end": 65}
            ]
          },
          "metadata": {}
        }
      ],
      "source": {
        "id": 311,
        "domain": "reuters.com",
        "home_page_url": "https://www.reuters.com",
        "type": "news",
        "bias": "center",
        "rankings": {
          "opr": 9
        },
        "location": {
          "country_name": "United States",
          "country_code": "us"
        },
        "favicon": "https://www.reuters.com/favicon.ico"
      },
      "sentiment": {
        "overall": {"score": -0.62, "polarity": "negative"},
        "title": {"score": -0.55, "polarity": "negative"},
        "body": {"score": -0.64, "polarity": "negative"}
      },
      "summary": [
        {
          "sentence": "Tesla recalled roughly 1.2 million vehicles over an autopilot defect.",
          "sentiment": {"score": -0.6, "polarity": "negative"}
        }
      ],
      "keywords": ["Tesla", "recall", "autopilot", "Model 3"],
      "links": [
        {"url": "https://example.com/tesla-recall-followup", "type": "link"}
      ],
      "media": [
        {"url": "https://example.com/images/tesla-recall.jpg", "type": "image"}
      ],
      "story": {
        "id": 3019419820,
        "uri": "https://api.apitube.io/v1/news/story/3019419820"
      },
      "shares": {
        "total": 412,
        "facebook": 220,
        "twitter": 150,
        "reddit": 42
      },
      "is_duplicate": false,
      "is_free": true,
      "is_breaking": true,
      "read_time": 2,
      "sentences_count": 8,
      "paragraphs_count": 4,
      "words_count": 320,
      "characters_count": 1820
    }
  ]
}

Der Bot berührt nur eine Handvoll davon – title, description, href, source.domain, sentiment.overall.polarity und entities[].name – aber alles andere (Themen, Branchen, Quellenbias, pro-Satz-Zusammenfassung, Share-Counts) ist vorhanden, wenn Sie später reichhaltigere Beiträge wünschen.

In Python, asynchrones httpx:

import httpx, os

API_URL = "https://api.apitube.io/v1/news/everything"

async def fetch_news(query: str) -> list[dict]:
    params = {
        "title": query,
        "language.code": "en",
        "per_page": 20,
        "sort.by": "published_at",
        "sort.order": "desc",
    }
    headers = {"X-API-Key": os.environ["APITUBE_KEY"]}
    async with httpx.AsyncClient(timeout=15) as client:
        r = await client.get(API_URL, params=params, headers=headers)
        r.raise_for_status()
        return r.json().get("results", [])

Schritt 4 – Filtern nach Sentiment und Entitäten

Dieser Schritt wandelt einen Datenstrom in einen kuratierten Kanal um. Verwerfen Sie Artikel, die nicht mit der konfigurierten Polarität übereinstimmen, und behalten Sie nur diejenigen, deren Entitäten mindestens einen beobachteten Namen enthalten.

WATCHED_ENTITIES = {"Tesla", "SpaceX", "OpenAI"}
WANTED_POLARITY = {"negative"}  # use {"positive", "negative", "neutral"} to allow all

def passes_filter(article: dict) -> bool:
    polarity = article.get("sentiment", {}).get("overall", {}).get("polarity")
    if polarity not in WANTED_POLARITY:
        return False
    names = {e.get("name") for e in article.get("entities", [])}
    return bool(names & WATCHED_ENTITIES)

Ein 30-Sekunden-Filter, aber er macht den Unterschied zwischen einem Bot, der 200 Artikel pro Tag postet, und einem, der 6 nützliche Artikel postet.

Schritt 5 – Planen Sie Kanalbeiträge mit APScheduler

AsyncIOScheduler läuft innerhalb derselben Ereignisschleife, die aiogram verwendet, sodass der gesamte Bot ein Prozess ist. Doppelte gepostete IDs in einem In-Memory-set; für Persistenz über Neustarts hinweg tauschen Sie Redis oder SQLite ein.

from apscheduler.schedulers.asyncio import AsyncIOScheduler
from aiogram.exceptions import TelegramRetryAfter
import asyncio, html

posted_ids: set[int] = set()

async def post_news(bot, channel_id: int):
    articles = await fetch_news("Tesla OR SpaceX OR OpenAI")
    for art in articles:
        if art["id"] in posted_ids or not passes_filter(art):
            continue
        text = (
            f"<b>{html.escape(art['title'])}</b>\n"
            f"{html.escape(art['description'])}\n\n"
            f"{art['source']['domain']} · "
            f"sentiment: {art['sentiment']['overall']['polarity']}\n"
            f"<a href=\"{art['href']}\">Read more</a>"
        )
        try:
            await bot.send_message(channel_id, text, disable_web_page_preview=False)
            posted_ids.add(art["id"])
        except TelegramRetryAfter as e:
            await asyncio.sleep(e.retry_after)

Der TelegramRetryAfter-Catch ist das, was den Bot am Leben hält, wenn Telegram Sie wegen zu schnellem Posten drosselt — er schläft das exakt angeforderte Intervall, dann versucht der nächste Scheduler-Tick es erneut.

Schritt 6 — Befehle und Hauptschleife

Drei kleine Befehle, damit Abonnenten direkt mit dem Bot interagieren können:

  • /start – Willkommensnachricht
  • /subscribe – erklären, dass der Bot automatisch in den Kanal postet
  • /filter – aktuelle Filterkonfiguration anzeigen

Der Dispatcher verdrahtet sie, und start_polling läuft neben dem Scheduler.

Vollständiger Code (bot.py)

import asyncio, html, logging, os
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.exceptions import TelegramRetryAfter
from aiogram.filters import Command, CommandStart
from aiogram.types import Message
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger
from dotenv import load_dotenv
import httpx

load_dotenv()
TOKEN = os.environ["BOT_TOKEN"]
CHANNEL_ID = int(os.environ["CHANNEL_ID"])
APITUBE_KEY = os.environ["APITUBE_KEY"]
API_URL = "https://api.apitube.io/v1/news/everything"

WATCHED_ENTITIES = {"Tesla", "SpaceX", "OpenAI"}
WANTED_POLARITY = {"negative"}
posted_ids: set[int] = set()

dp = Dispatcher()

async def fetch_news(query: str) -> list[dict]:
    params = {
        "title": query,
        "language.code": "en",
        "per_page": 20,
        "sort.by": "published_at",
        "sort.order": "desc",
    }
    headers = {"X-API-Key": APITUBE_KEY}
    async with httpx.AsyncClient(timeout=15) as client:
        r = await client.get(API_URL, params=params, headers=headers)
        r.raise_for_status()
        return r.json().get("results", [])

def passes_filter(article: dict) -> bool:
    polarity = article.get("sentiment", {}).get("overall", {}).get("polarity")
    if polarity not in WANTED_POLARITY:
        return False
    names = {e.get("name") for e in article.get("entities", [])}
    return bool(names & WATCHED_ENTITIES)

async def post_news(bot: Bot):
    articles = await fetch_news("Tesla OR SpaceX OR OpenAI")
    for art in articles:
        if art["id"] in posted_ids or not passes_filter(art):
            continue
        text = (
            f"<b>{html.escape(art['title'])}</b>\n"
            f"{html.escape(art.get('description') or '')}\n\n"
            f"{art['source']['domain']} · "
            f"sentiment: {art['sentiment']['overall']['polarity']}\n"
            f"<a href=\"{art['href']}\">Read more</a>"
        )
        try:
            await bot.send_message(CHANNEL_ID, text)
            posted_ids.add(art["id"])
            await asyncio.sleep(1)
        except TelegramRetryAfter as e:
            await asyncio.sleep(e.retry_after)
        except Exception:
            logging.exception("send_message failed for %s", art["id"])

@dp.message(CommandStart())
async def cmd_start(m: Message):
    await m.answer("News bot online. Curated negative-sentiment news on Tesla, SpaceX, OpenAI.")

@dp.message(Command("subscribe"))
async def cmd_subscribe(m: Message):
    await m.answer("Posts go to the channel automatically every 15 minutes.")

@dp.message(Command("filter"))
async def cmd_filter(m: Message):
    await m.answer(
        f"Polarity: {sorted(WANTED_POLARITY)}\nEntities: {sorted(WATCHED_ENTITIES)}"
    )

async def main():
    logging.basicConfig(level=logging.INFO)
    bot = Bot(TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    scheduler = AsyncIOScheduler()
    scheduler.add_job(post_news, IntervalTrigger(minutes=15), args=[bot])
    scheduler.start()
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Führen Sie es aus:

python bot.py

Der erste Scheduler-Tick wird 15 Minuten nach dem Start ausgelöst. Um ihn sofort auszulösen, fügen Sie next_run_time=datetime.utcnow() zu add_job hinzu.

Bereitstellen mit Docker

Ein mehrstufiges Python 3.12 Slim-Image hält den finalen Container klein und den Build deterministisch.

Dockerfile:

FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
COPY bot.py .
CMD ["python", "-u", "bot.py"]

requirements.txt:

aiogram==3.27.0
apscheduler==3.10.4
httpx==0.27.0
python-dotenv==1.0.1

docker-compose.yml:

services:
  bot:
    build: .
    env_file: .env
    restart: unless-stopped

Für kostenloses oder fast kostenloses Hosting in 2026: Die Hobby-Stufe von Fly.io bewältigt einen einzelnen Bot-Container problemlos; Railway bietet Ihnen Protokolle und Ein-Klick-Neustarts; oder schnappen Sie sich einen $5/Monat VPS (Hetzner, Vultr, DigitalOcean) und führen Sie docker compose up -d aus. Was auch immer Sie wählen, restart: unless-stopped stellt sicher, dass ein Absturz den Bot nicht über Nacht offline nimmt.

Häufig gestellte Fragen

Wie erstelle ich einen Telegram-Nachrichtenbot in Python?

Registrieren Sie einen Bot bei @BotFather, installieren Sie aiogram 3.27 und einen Nachrichten-Client wie httpx, rufen Sie Artikel von einem Nachrichten-API wie APITube ab, filtern Sie die Antwort und posten Sie jeden Eintrag mit bot.send_message in einen Telegram-Chat oder -Kanal. Wickeln Sie den Abruf- und Post-Schritt in APScheduler ein, um ihn intervallweise auszuführen.

Welche Bibliothek ist besser, aiogram oder python-telegram-bot?

aiogram ist seit v3 nur noch asynchron, was bedeutet, dass es sich sauber mit AsyncIOScheduler für die automatische Kanalveröffentlichung in einer einzigen Ereignisschleife kombinieren lässt. Für Nachrichten-/Kanalbots über ~50 gleichzeitige Benutzer hinaus wählen Sie aiogram 3.27. Für befehlsgesteuerte persönliche Bots, Teams mit synchroner Codebasis oder schrittweise Migrationspfade bleibt python-telegram-bot 21.x eine solide Wahl. Beide werden in 2026 aktiv gepflegt.

Kann ein Telegram-Bot automatisch in einen Kanal posten?

Ja. Fügen Sie den Bot als Administrator zum Kanal hinzu mit der Berechtigung „Nachrichten posten“, holen Sie sich die numerische Chat-ID des Kanals und rufen Sie bot.send_message(chat_id, text) aus einer geplanten Aufgabe auf. APSchedulers AsyncIOScheduler läuft innerhalb der Ereignisschleife des Bots, sodass ein Prozess sowohl das Abfragen als auch das geplante Posten übernimmt.

Wird python-telegram-bot in 2026 noch gepflegt?

Ja – python-telegram-bot wird weiterhin aktiv gepflegt. Version 21.x liefert eine asynchrone API und laufende Korrekturen; das Projekt wird regelmäßig auf GitHub veröffentlicht. Die synchrone API-Version v13 ist veraltet, aber v20 und neuer ist asynchron und aktuell.

Ausprobieren

Klonen Sie die obigen Snippets, legen Sie sie in einen Ordner, füllen Sie .env, docker compose up -d. Die kostenlose Stufe von APITube gibt Stimmung und Entitäten für jeden Artikel zurück – holen Sie sich einen Schlüssel unter apitube.io und ersetzen Sie den Platzhalter in Schritt 3. Wenn Sie nach Kategorie statt nach Entitäten filtern möchten, lesen Sie article["categories"] und gleichen Sie den name jeder Kategorie ab (e.g. Behalten Sie nur Artikel, deren Kategoriename "technology" enthält).

APITube - News API

Verwandte Artikel

10 Nachrichten API Filter-Muster, die Sie kennen sollten (2026)
Developer Guides

10 Nachrichten API Filter-Muster, die Sie kennen sollten (2026)

10 ausführbare Nachrichten API Filter-Muster — Titelsuche, Daten, Entitäten, Stimmungsanalyse, Quellen und zusammengesetzte Abfragen — mit Curl-, Python- und JSON-Beispielen sowie dem Stolperstein, der Ihren ersten Tag verschwendet.

Nachrichten API Schnelleinstieg: Ihre erste Anfrage in 5 Minuten
Developer Guides

Nachrichten API Schnelleinstieg: Ihre erste Anfrage in 5 Minuten

Rufen Sie in 5 Minuten einen echten Nachrichten-API-Endpunkt auf – curl, JavaScript und Python nebeneinander, mit einer kommentierten JSON-Antwort und Korrekturen für die 401/429-Fehler, auf die Sie tatsächlich stoßen werden.

Erstellen Sie ein Django-Nachrichtenportal in 2026: Full-Stack-Tutorial
Developer Guides

Erstellen Sie ein Django-Nachrichtenportal in 2026: Full-Stack-Tutorial

Erstellen Sie ein Django-Nachrichtenportal: Celery-Beat-Ingestion, Redis-Cache, HTMX-Infinite-Scroll, Postgres-Volltextsuche. Echte Nachrichten-API, lauffähiger Django 5-Code.

News API Pagination: Cursor, Offset & the 10k Cap
Developer Guides

News API Pagination: Cursor, Offset & the 10k Cap

Stop losing articles between pages. A consumer-side guide to news API pagination: date-window slicing, 429 retries, async streaming, and dedup.

Wir verwenden Cookies

Durch Klicken auf "Akzeptieren" stimmen Sie der Verwendung von Cookies auf Ihrem Gerät zu, damit die Website funktioniert und für Analysen.