Skip to main content

Zero-dependency, stdlib-only Telegram bridge for two-way CLI automation. Simple alerts or interactive command-and-control using nothing but the Python standard library.

Project description

tgzero

Lightweight, zero-dependency Telegram C2 bridge.
Bridges server-side processes with a designated Telegram chat — from fire-and-forget alerts to interactive deployment gatekeepers.


Installation

pip install tgzero

Configuration

Create a telegram.env file in your working directory (or export the variables in your shell):

TELEGRAM_TOKEN=1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi
TELEGRAM_CHAT_ID=1234567890

Secure the file:

chmod 600 telegram.env

Commands

tgzero send — Fire-and-forget notification

# Basic alert
tgzero send --msg "✅ Weekly backup uploaded to S3."

# Silent (no sound on phone)
tgzero send -m "Server load is high (85%)" --silent

# Machine-readable output
tgzero send -m "Done" --json
# → {"status": "success", "action": "send", "exit_code": 0, "latency_ms": 312}

tgzero ask — Interactive gatekeeper

Pauses your script until you tap a button in Telegram.

# Simple yes/no gate (default OK button)
tgzero ask --prompt "Ready to restart nginx?"

# Custom buttons — first button = exit 0, any other = exit 1
if tgzero ask --prompt "Deploy to production?" --buttons "Deploy,Abort"; then
    ./deploy.sh
    tgzero send -m "🚀 Deployment successful!"
else
    echo "Aborted."
fi

# With timeout
tgzero ask -p "Approve migration?" -b "Approve,Skip" --timeout 300

# Multi-branch with --json
RESULT=$(tgzero ask -p "Choose environment" -b "Staging,Prod,Dev" --json)
ENV=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['reply_string'])")
echo "Deploying to: $ENV"

Exit codes:

Code Meaning
0 First button clicked (success / go)
1 Any other button clicked — literal label printed to stdout
2 Timeout — no reply within --timeout seconds
3 Network / API failure
4 Queue timeout — another ask is holding the lock
5 Terminated by SIGTERM / SIGINT

tgzero daemon — Persistent remote-control agent

Runs in the background (systemd / Docker) and executes allow-listed commands sent via Telegram.

tgzero daemon --allow-list "status,reboot,clear-logs" --interval 3

From your phone: type status → bot replies with command output.
Unrecognised commands get a ⚠️ Command not permitted reply.

systemd unit example

[Unit]
Description=tgzero Telegram C2 daemon
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/myapp
EnvironmentFile=/opt/myapp/telegram.env
ExecStart=tgzero daemon --allow-list "status,restart-nginx,clear-logs"
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Security Notes

  • All messages are validated against TELEGRAM_CHAT_ID. Messages from any other sender are logged and ignored.
  • The daemon allow-list uses exact string matching — no shell interpolation.
  • HTML special characters are automatically escaped before sending.
  • Messages longer than 4096 characters are cleanly truncated.
  • The .env file permissions are checked on startup; a warning is printed if the file is world-readable.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tgzero-0.1.1.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tgzero-0.1.1-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

File details

Details for the file tgzero-0.1.1.tar.gz.

File metadata

  • Download URL: tgzero-0.1.1.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tgzero-0.1.1.tar.gz
Algorithm Hash digest
SHA256 797c32e861161b486467247683beb80a4b04742f44c3c259cc192bb25ac5ed8b
MD5 b0aa04082ac7ea4e385cece5dd2787fc
BLAKE2b-256 0739293d73ba5fb725c30556a58186be3269e78e3345d467e85e8068985630ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgzero-0.1.1.tar.gz:

Publisher: publish.yml on shipsweights/tgzero

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tgzero-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: tgzero-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 17.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tgzero-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ed140e973ca156d432c749903285c785a314816f72b15f15d465d3feaea3292e
MD5 b07283dbe2bab45c09e178e28138e562
BLAKE2b-256 00c51f08f51f47b4063ffb50d68eac6b32ad116ad2866f001c020876009af5dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for tgzero-0.1.1-py3-none-any.whl:

Publisher: publish.yml on shipsweights/tgzero

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page