Dieses Verzeichnis enthält die Bots, die ÖPNV-Meldungen von Twitter/X (per Selenium-Webdriver) und Bluesky-RSS-Feeds abholen und an Telegram sowie mehrere Mastodon-Instanzen ausliefern. Alt-Texte werden automatisch über Google Gemini generiert; Filter/Tagging lassen sich per Control-Bots steuern.
- Keine Snap-Pakete nutzen (Selenium + Snap machen Probleme); Firefox via Flatpak ist nicht getestet, Chrome ist möglich aber instabiler.
- Twitter/X-Listen brauchen in der Regel einen eingeloggten Account. Nutze ein Firefox-Profil (
about:profiles) und setze optionalTWITTER_FIREFOX_PROFILE_PATH. Falls die Zielseite öffentlich ist, kannst du ohne Login arbeiten. - Geckodriver muss verfügbar sein (Default
/usr/local/bin/geckodriver). Bei abweichendem Pfad setzeTWITTER_GECKODRIVER_PATH. - Bestehende JSON-State-Dateien können mit
python -m tools.migrate_telegram_data_json_toolnachconfig/nitter_bot.dbmigriert werden.
bots/: ausführbare Bot-Implementierungen (einheitlich mit*_bot.pybzw.*_control_bot.py)modules/: wiederverwendbare Bot-Module (einheitlich mit_module.py)tools/: CLI-/Wartungs-Skripte (einheitlich mit_tool.py)scripts/: Shell-Hilfsskripte für Betrieb/Automationconfig/: zentrale Runtime-/Default-Konfiguration (z. B.config/default_settings.json,config/nitter_bot.db)
bots/twitter_bot.py: Selenium-Scraper für eine X-Liste. Nutzt ein lokales Firefox-Profil, dedupliziert über die gemeinsame SQLite-DBconfig/nitter_bot.dbund sendet neue Tweets an Telegram und Mastodon.bots/nitter_bot.py: Pollt die lokale Nitter-Instanz (http://localhost:8081/<user>/rss) statt Selenium/X. History und Nutzer-Intervalle liegen inconfig/nitter_bot.dbund sollen den Twitter-Bot langfristig ersetzen.bots/bsky_bot.py: Pollt konfigurierte Bluesky-RSS-Feeds (z. B. VIZ Berlin) und leitet neue Einträge an Telegram/Mastodon weiter.modules/telegram_bot_module.py: Versendet Tweets/Feeds an alle in der DB hinterlegten Chats. Filterwörter pro Chat bestimmen, was zugestellt wird.bots/telegram_control_bot.py: Telegram-Bot zur Verwaltung von Chat-IDs und Filtern (/start,/status,/addfilterrules,/deletefilterrules,/deleteallrules,/list,/about,/datenschutz). Admin-Kommandos erlauben Service-Meldungen an alle Kanäle und Log-Auszüge.modules/mastodon_bot_module.py: Postet Tweets/Feeds aufberlin.social,toot.berlinundmastodon.berlin(Tokens aus ENV). Unterstützt Bilder/Videos, generiert Alt-Texte via Gemini und taggt Nutzer basierend auf DB-Regeln.bots/mastodon_control_bot.py: Mastodon-DM-Bot zum Verwalten der Tagging-Regeln (/start,/add,/list,/overview,/delete,/pause,/resume,/schedule,/stop). Lauscht optional auf Events vom Posting-Bot.modules/gemini_helper_module.py+tools/test_alt_text_tool.py: Modellverwaltung für Gemini (Cache in der DB) und Offline/Online-Test der Alt-Text-Generierung (python -m tools.test_alt_text_tool --image <pfad> [--dummy]).- Daten/Logs: zentrale SQLite-DB
config/nitter_bot.db(Chat-Filter, Mastodon-Regeln, Gemini-Cache, Histories inkl. Mastodon-Posts) und Log unter$BOTS_BASE_DIR/twitter_bot.log(Default: aktueller Repo-Ordner). - Legacy-Telegram-State:
data.jsonist eine lokale Laufzeitdatei (nicht versioniert) und kann bei Bedarf mit dem Migrationstool in die DB übernommen werden.
- Python 3 + virtuelles Environment (empfohlen):
export BOTS_BASE_DIR="$(pwd)" && python3 -m venv "$BOTS_BASE_DIR/venv" && source "$BOTS_BASE_DIR/venv/bin/activate" - Abhängigkeiten installieren (im Ordner
bots/):
pip install -r requirements.txt - Für lokale Checks/Testentwicklung zusätzlich Dev-Tools installieren:
pip install -r requirements-dev.txt - Firefox + Geckodriver (Default-Pfad
/usr/local/bin/geckodriver; optional ENVTWITTER_GECKODRIVER_PATH). Für eingeloggte X-Sessions optionalTWITTER_FIREFOX_PROFILE_PATHsetzen. - Netz- und API-Zugänge per Environment:
- Telegram:
TELEGRAM_TOKEN,TELEGRAM_ADMIN(Legacy-Fallback:telegram_token,telegram_admin) - Mastodon:
opnv_berlin,opnv_toot,opnv_mastodon - Gemini:
GEMINI_API_KEY(optional zusätzlich:GEMINI_API_KEY1bisGEMINI_API_KEY4für Round-Robin) - Twitter/Selenium:
TWITTER_LIST_URL,TWITTER_GECKODRIVER_PATH, optionalTWITTER_FIREFOX_PROFILE_PATH - Optional:
MASTODON_CONTROL_EVENT_ENABLED|HOST|PORT,MASTODON_CONTROL_POLL_INTERVAL - Logging zentral:
BOTS_LOG_LEVEL(FallbackLOG_LEVEL, z. B.DEBUG,INFO,WARNING,ERROR)
- Telegram:
- Zentrale Default-Werte stehen in
config/default_settings.json(z. B.log_level,db_path, Poll-/Retention-Werte). ENV-Variablen überschreiben diese Defaults.
Hinweis: Laufzeitpfade werden zentral über
BOTS_BASE_DIRgesteuert (Default: Repo-Ordner).
Die SQLite-DB kann überNITTER_DB_PATHumgezogen werden (Standard$BOTS_BASE_DIR/config/nitter_bot.db).
-
Twitter/X-Scraper (
bots/twitter_bot.py)- Quell-Liste per
TWITTER_LIST_URLkonfigurieren (Fallback: interner Default). - Firefox-Profil optional über
TWITTER_FIREFOX_PROFILE_PATH, Geckodriver überTWITTER_GECKODRIVER_PATH(Default/usr/local/bin/geckodriver). - Neue Links werden in
config/nitter_bot.dbdedupliziert;var_hrefwird beim Telegram-Versand aufnitter.netumgeschrieben. - Kurz-URLs werden erweitert; Bilder/Videos und externe Links gehen an Mastodon weiter.
- Optional ohne Login:
TWITTER_FIREFOX_PROFILE_PATHnicht setzen.
- Quell-Liste per
-
Nitter-RSS (
bots/nitter_bot.py)- Arbeitet gegen
NITTER_BASE_URL(Standardhttp://localhost:8081) und liest Accounts samt Intervallen/Zeitfenstern aus der DB (Default-Seed wie bisher). - Loop-Fallback-Sleep: 60 s (
NITTER_POLL_INTERVAL), pro Account gelten die in der DB gespeicherten Intervalle (z. B.SBahnBerlinmit 120 s von 05:55–22:05). - Dedupliziert per DB-History und baut die Status-Links zu
x.com/<user>/status/<id>für Telegram/Mastodon. - History-Limit per
NITTER_HISTORY_LIMITeinstellbar;NITTER_POLL_INTERVALsteuert das Loop-Fallback-Sleep (min. 15 s).
- Arbeitet gegen
-
Bluesky-Feeds (
bots/bsky_bot.py)- FEEDS-Liste anpassen (
name,url, optionalmax_entries). History pro Feed wird in der DB gehalten. - Pollt alle 60 s und nutzt dieselben Bot-Module für die Auslieferung.
- FEEDS-Liste anpassen (
-
Telegram
- Chat-IDs und
filter_ruleswerden in der DB gehalten; Verwaltung erfolgt über den Control-Bot. modules/telegram_bot_module.pyverschickt Nachrichten an alle Chat-IDs; Filterwörter pro Chat entscheiden über Zustellung.bots/telegram_control_bot.pybietet Nutzer-Kommandos (Start/Stop/Status/Filter) und Admin-Kommandos (Service-Meldungen, Log-Fehler/Warnungen).- Einmalige Migration einer bestehenden
data.json:
python -m tools.migrate_telegram_data_json_tool --data-file ./data.json
Optional:--dry-run(nur prüfen) oder--force(bestehende Telegram-Daten in DB überschreiben).
- Chat-IDs und
-
Mastodon
- Tokens aus ENV; je Instanz wird Sichtbarkeit anhand bekannter Accounts gewählt.
- Alt-Texte pro Bild/Video via Gemini (Fallback-Text bei Fehlern); Modelle werden gecached und Quoten respektiert.
- Tagging-Regeln liegen in der DB (DM/Tag, Zeitfenster, Block-/Allow-Keywords). Verwaltung erfolgt über den Mastodon-Control-Bot.
- Event-Brücke:
modules/mastodon_bot_module.pykann nach erfolgreichem Post per TCP anMASTODON_CONTROL_EVENT_HOST:PORTsenden, damitbots/mastodon_control_bot.pyStatus-Updates sieht.
-
Virtuelle Umgebung aktivieren:
export BOTS_BASE_DIR="$(pwd)" && source "$BOTS_BASE_DIR/venv/bin/activate" -
Bots starten (je nach Bedarf separate Prozesse/Services):
- X-Scraper:
python bots/twitter_bot.py - Nitter-RSS (ohne Selenium):
python bots/nitter_bot.py - Bluesky-Feeds:
python bots/bsky_bot.py - Telegram-Control:
python bots/telegram_control_bot.py - Mastodon-Control:
python bots/mastodon_control_bot.py
- X-Scraper:
-
Alt-Texte testen (ohne Posten):
python -m tools.test_alt_text_tool --dummy(offline) oderpython -m tools.test_alt_text_tool --image <pfad>mit gesetztemGEMINI_API_KEY(optional plusGEMINI_API_KEY1..4). -
Projekt-Checks lokal ausführen:
./venv/bin/python -m compileall -q -x '(^|/)venv($|/)' ../venv/bin/pytest tests tests-unit./venv/bin/ruff check .
- Vorlagen liegen unter
services/:twitter_bot.service,bsky_bot.service,telegram_control_bot.service,mastodon_control_bot.service,nitter_bot.service. - Alle Einheiten referenzieren ein gemeinsames Env-File (
/etc/twitter_bot.env) mit den nötigen Secrets, z. B.:GEMINI_API_KEY=... GEMINI_API_KEY1=... GEMINI_API_KEY2=... GEMINI_API_KEY3=... GEMINI_API_KEY4=... TELEGRAM_TOKEN=... TELEGRAM_ADMIN=... opnv_berlin=... opnv_toot=... opnv_mastodon=... TWITTER_LIST_URL=https://x.com/i/lists/... TWITTER_GECKODRIVER_PATH=/usr/local/bin/geckodriver TWITTER_FIREFOX_PROFILE_PATH=/home/<user>/.mozilla/firefox/<profile>.Twitter
- Env-File anlegen (für Service und lokale Tests) mit restriktiven Rechten:
sudo install -m 600 /dev/null /etc/twitter_bot.env sudo tee /etc/twitter_bot.env >/dev/null <<'EOF' BOTS_BASE_DIR=/home/<user>/Dokumente/bots GEMINI_API_KEY=DEIN_KEY GEMINI_API_KEY1=OPTIONAL_KEY_1 GEMINI_API_KEY2=OPTIONAL_KEY_2 GEMINI_API_KEY3=OPTIONAL_KEY_3 GEMINI_API_KEY4=OPTIONAL_KEY_4 TELEGRAM_TOKEN=DEIN_TELEGRAM_TOKEN TELEGRAM_ADMIN=123456789 opnv_berlin=TOKEN opnv_toot=TOKEN opnv_mastodon=TOKEN TWITTER_LIST_URL=https://x.com/i/lists/1901917316708778158 TWITTER_GECKODRIVER_PATH=/usr/local/bin/geckodriver TWITTER_FIREFOX_PROFILE_PATH=/home/<user>/.mozilla/firefox/<profile>.Twitter EOF sudo chmod 600 /etc/twitter_bot.env
- Manuell testen ohne Service:
set -a; source /etc/twitter_bot.env; set +a; export BOTS_BASE_DIR="$(pwd)"; python bots/twitter_bot.py
(analog fürbots/bsky_bot.py,bots/telegram_control_bot.py,bots/mastodon_control_bot.py). - Installation (Beispiel
twitter_bot):Weitere Bots analog mit den jeweiligen Dateien aussudo cp services/twitter_bot.service /etc/systemd/system/twitter_bot.service sudo systemctl daemon-reload sudo systemctl enable --now twitter_bot.serviceservices/.
- Zentrales Log:
$BOTS_BASE_DIR/twitter_bot.log(alle Module). Admin-Befehle in Telegram zeigen Auszüge. - Zentrales Logging-Level für alle Bots:
BOTS_LOG_LEVEL(oderLOG_LEVEL). - Historien/Caches landen gesammelt in
config/nitter_bot.db(Buckets u. a. für Twitter/Nitter-History, Bluesky-Feeds, Telegram-Filter, Mastodon-Regeln/-Posts, Gemini-Status). - Für Dauerbetrieb können systemd-Services genutzt werden (ExecStart läuft über
$BOTS_BASE_DIR;BOTS_BASE_DIRwird imEnvironmentFilegesetzt).
Dank an shaikhsajid1111 für die CSS-Selector-Basis zum Extrahieren von Tweets.
Viel Erfolg mit den ÖPNV-Bots!