Bot Telegram untuk manajemen pelanggan IP statik / PPPoE di MikroTik: isolir otomatis saat jatuh tempo, restore limit saat pembayaran, semua dari dalam chat Telegram.
Dibuat untuk jalan di Termux (Android) β ringan, tanpa web server, tanpa database server (SQLite), tanpa scheduler MikroTik.
- Fitur
- Cara Kerja
- Persyaratan
- Instalasi
- Konfigurasi
- Persiapan MikroTik
- Persiapan Telegram Bot
- Menjalankan Bot
- Panduan Pemakaian
- Struktur Proyek
- Skema Database
- Desain UI Anti-Spam
- Menjalankan Otomatis (Termux)
- Troubleshooting
- Keamanan
- FAQ
- Lisensi
| Fitur | Keterangan |
|---|---|
| π List & detail pelanggan | Daftar user dengan indikator status π’ aktif / π΄ isolir, paginasi 8 per halaman |
| β Tambah user | Form berbasis tombol, draft tampil live, validasi IP & tanggal |
| βοΈ Edit per field | Ubah nama, IP, tgl bayar, max up, max down, catatan tanpa hapus data |
| π Isolir / unisolir manual | Satu ketukan, langsung mengubah max-limit simple queue di MikroTik |
| β« Perpanjang otomatis | Set tgl bayar baru β hitung tgl isolir β restore limit normal sekaligus |
| π Toggle notifikasi per user | Notifikasi isolir bisa dinyalakan/dimatikan per pelanggan |
| β° Isolir otomatis | Cek tiap 60 detik; user yang lewat tgl isolir otomatis diturunkan ke ISOLIR_LIMIT |
| π Ringkasan | Total user, aktif, isolir, dan yang jatuh tempo β€ 7 hari |
| π§Ή UI satu pesan | Seluruh navigasi mengedit satu pesan β chat tidak pernah menumpuk |
| πΎ Tanpa database server | SQLite single file, mudah dibackup dan dipindah |
| π‘οΈ Single-admin lock | Hanya ADMIN_TG_ID yang bisa memakai bot |
ββββββββββββββββ long polling ββββββββββββββββ
β Telegram β βββββββββββββββββ β β
β (admin HP) β βββββββββββββββββΊ β bot.php β
ββββββββββββββββ tombol/teks β β
β ββββββββββ β
ββββββββββββββββ RouterOS API β β SQLite β β
β MikroTik β βββββββββββββββββ β β app.db β β
β port 8728 β β ββββββββββ β
ββββββββββββββββ ββββββββββββββββ
- Bot memakai long polling (
getUpdates) β tidak butuh IP publik, webhook, atau port forwarding. Cocok untuk HP di belakang NAT. - Setiap 60 detik bot memeriksa user yang
tgl_isolir <= hari inilalu menurunkan limit queue-nya keISOLIR_LIMIT. - Isolir/restore dilakukan dengan mencari simple queue berdasarkan IP pada field
target(bukan nama queue), lalu mengubahmax-limit. - Semua state percakapan disimpan di SQLite (
bot_state,bot_ui,bot_temp), jadi bot aman di-restart kapan saja.
- PHP 8.1+ dengan ekstensi
pdo_sqlite(wajib) dancurl(opsional, disarankan) - MikroTik RouterOS dengan service
apiaktif (port 8728) - Bot Telegram (token dari @BotFather)
- Konektivitas dari perangkat yang menjalankan bot ke router MikroTik (LAN/VPN/WireGuard)
Cek ekstensi:
php -m | grep -E 'pdo_sqlite|curl'# 1. Update & install paket
pkg update -y && pkg upgrade -y
pkg install -y php php-curl
# 2. Izinkan akses storage (untuk ekstrak zip dari folder Download)
termux-setup-storage
# 3. Ekstrak project
cd ~
unzip -o ~/storage/downloads/staticip-bot.zip
cd staticip-bot
# 4. Jalankan
php bot.phpSaran: taruh project di storage internal (
~/staticip-bot), bukan di SD card. Lebih cepat dan tidak kena batasan permission.
sudo apt install -y php-cli php-sqlite3 php-curl unzip
unzip staticip-bot.zip -d ~/staticip-bot
cd ~/staticip-bot
php bot.php# Pastikan php.exe ada di PATH, atau panggil lengkap:
C:\xampp3\php\php.exe bot.phpEdit config.php:
<?php
// --- Database (SQLite) ---
define('DB_FILE', __DIR__ . '/data/app.db');
// --- MikroTik (RouterOS API port 8728) ---
define('MK_HOST', '<IP-ROUTER>'); // IP router MikroTik
define('MK_PORT', 8728); // port API
define('MK_USER', '<USER-MIKROTIK>'); // user MikroTik (policy api,read,write,test)
define('MK_PASS', '<PASSWORD>'); // password MikroTik
// --- Aturan isolir ---
define('ISOLIR_DAYS', 35); // tgl isolir = tgl bayar + N hari
define('ISOLIR_LIMIT', '64k/64k'); // limit saat isolir (up/down)
// --- Telegram ---
define('TG_BOT_TOKEN', '<TOKEN-DARI-BOTFATHER>'); // token dari @BotFather
define('TG_CHAT_ID', '<CHAT-ID-ADMIN>'); // tujuan notifikasi
define('ADMIN_TG_ID', '<CHAT-ID-ADMIN>'); // HANYA ID ini yang boleh pakai bot
date_default_timezone_set('Asia/Jakarta');| Konstanta | Wajib | Keterangan |
|---|---|---|
DB_FILE |
β | Lokasi file SQLite. Folder data/ dibuat otomatis |
MK_HOST / MK_PORT |
β | Alamat & port RouterOS API |
MK_USER / MK_PASS |
β | Kredensial user MikroTik (butuh policy api, read, write) |
ISOLIR_DAYS |
β | Umur langganan dalam hari, dihitung dari tgl bayar |
ISOLIR_LIMIT |
β | Limit saat isolir, format upload/download (mis. 64k/64k, 1M/1M) |
TG_BOT_TOKEN |
β | Token bot Telegram |
TG_CHAT_ID |
β | Chat penerima notifikasi isolir (boleh sama dengan admin) |
ADMIN_TG_ID |
β | Satu-satunya Telegram ID yang diizinkan memakai bot |
Kirim pesan ke @userinfobot atau @RawDataBot, lalu salin angka id.
/ip service enable api
/ip service set api port=8728
Batasi akses dari IP server bot saja:
/ip service set api address=<SUBNET-SERVER-BOT>/24
/user group add name=bot policy=api,read,write,test,winbox
/user add name=<USER-BOT> group=bot password=<PASSWORD-KUAT>
Hindari memakai user
admin/fulluntuk bot. Cukup policyapi,read,write,test.
Bot mencari queue berdasarkan IP pada field target, bukan nama queue. Jadi setiap pelanggan IP statik harus punya simple queue:
/queue simple add name="pelanggan-budi" target=<IP-PELANGGAN>/32 max-limit=5M/5M
Cek daftar queue:
/queue simple print where target~"<prefix-IP-pelanggan>"
Versi bot ini tidak memerlukan /system scheduler di MikroTik. Isolir otomatis dijalankan oleh bot sendiri tiap 60 detik.
- Chat @BotFather β
/newbot - Isi nama & username bot
- Salin token (
123456789:AA...) keTG_BOT_TOKEN - Buka chat bot, tekan Start (wajib, agar bot bisa mengirim pesan ke kamu)
- Salin ID kamu ke
ADMIN_TG_IDdanTG_CHAT_ID
php bot.phpOutput normal:
Bot jalan. Tekan Ctrl+C untuk berhenti.
[2026-10-20 22:41:03] ISOLIR: Budi | NOTIF: 1 user
Bot akan mengirim menu utama ke chat admin. Hentikan dengan Ctrl+C.
π STATIC-IP BOT
Pilih menu di bawah.
[π List User] [β Tambah User]
[π Ringkasan]
Ketuk β Tambah User β form draft muncul:
β TAMBAH USER BARU
Isolir otomatis: 2026-11-24
Nama: Budi
IP: <IP-PELANGGAN>
Tgl Bayar: 2026-10-20
Max Up: 5M
Max Down: 5M
Catatan: β
Ketuk πΎ Simpan untuk menyimpan.
[Nama] [IP] [Tgl Bayar]
[Max Up] [Max Down] [Catatan]
[πΎ Simpan]
[β Batal]
- Ketuk tombol field β kirim nilainya β draft langsung ter-update
- πΎ Simpan baru muncul setelah Nama dan IP valid
- Tgl isolir dihitung otomatis (
tgl_bayar + ISOLIR_DAYS)
Format input:
| Field | Format | Contoh |
|---|---|---|
| Nama | teks bebas | Budi Santoso |
| IP | IPv4 valid, unik | <IP-PELANGGAN> |
| Tgl Bayar | YYYY-MM-DD atau today |
2026-10-20 |
| Max Up / Down | format RouterOS | 5M, 1500k, 1G |
| Catatan | teks atau - untuk kosong |
paket 10Mbps |
π€ Budi Santoso
IP: <IP-PELANGGAN>
Status: π’ AKTIF
Tgl Bayar: 2026-10-20
Tgl Isolir: 2026-11-24
Limit normal: 5M/5M
Notif: ON
Catatan: paket 10Mbps
[π Isolir]
[β« Perpanjang] [π
Edit Isolir]
[π Notif: ON] [βοΈ Edit]
[π Hapus] [β¬
οΈ Kembali]
| Tombol | Fungsi |
|---|---|
| π Isolir / π Unisolir | Ubah max-limit queue ke ISOLIR_LIMIT / kembali normal |
| β« Perpanjang | Input tgl bayar baru β hitung tgl isolir β restore limit |
| π Edit Isolir | Ubah tanggal isolir saja tanpa menyentuh limit |
| π Notif | Toggle notifikasi isolir untuk pelanggan ini |
| βοΈ Edit | Pilih field yang mau diubah |
| π Hapus | Hapus data user (dengan konfirmasi) |
Kapan saja saat diminta mengirim nilai, kirim teks batal atau ketuk β¬
οΈ Batal.
staticip-bot/
βββ bot.php # Entry point + long polling loop + timer isolir otomatis
βββ core.php # State percakapan, penyimpanan pointer pesan UI, render
βββ ui.php # Semua tampilan (menu, list, detail, form tambah/edit)
βββ actions.php # Aksi bisnis: isolir, restore, simpan, hapus, edit
βββ handlers.php # Routing callback tombol & input teks
βββ functions.php # Helper: MikroTik queue, Telegram API, hitung tanggal
βββ RouterosAPI.php # Client RouterOS API port 8728 (login legacy + challenge)
βββ db.php # Koneksi PDO SQLite + skema tabel
βββ config.php # Konfigurasi (token, kredensial, aturan isolir)
βββ data/
βββ app.db # Database SQLite (dibuat otomatis)
| File | Tanggung jawab |
|---|---|
bot.php |
Hanya bootstrap + loop. Tidak ada logika UI |
core.php |
Infrastruktur UI: set_state, store_*, render, ui, notify_ui, temp_purge |
ui.php |
Fungsi murni tampilan: view_menu, view_list, view_user, view_add, dll |
actions.php |
Efek samping: query DB + perintah MikroTik, mengembalikan string status |
handlers.php |
Menerjemahkan update Telegram β panggilan view/action |
Pemisahan ini membuat tampilan bisa diuji tanpa jaringan (lihat bagian Desain UI Anti-Spam).
| Kolom | Tipe | Keterangan |
|---|---|---|
id |
INTEGER PK | Auto increment |
nama |
TEXT | Nama pelanggan |
ip |
TEXT UNIQUE | IP statik pelanggan |
tgl_bayar |
TEXT | Tanggal pembayaran terakhir (YYYY-MM-DD) |
tgl_isolir |
TEXT | Tanggal mulai isolir (tgl_bayar + ISOLIR_DAYS) |
max_upload |
TEXT | Limit normal upload (mis. 5M) |
max_download |
TEXT | Limit normal download (mis. 5M) |
catatan |
TEXT | Catatan bebas |
status |
TEXT | aktif atau isolir |
notif_enabled |
INTEGER | 1 = kirim notifikasi, 0 = diam |
last_notif_sent |
TEXT | Tanggal terakhir notifikasi dikirim (anti dobel per hari) |
created_at |
TEXT | Waktu dibuat |
State percakapan input bertahap per chat (chat_id, state, data).
Pointer ke satu pesan utama yang selalu di-edit (chat_id, message_id, view, data).
Daftar pesan sementara yang harus dihapus (id, chat_id, message_id, created_at).
Masalah umum bot Telegram: setiap aksi mengirim pesan baru, sehingga menu dan tombol tertimbun dan sulit dipakai lagi.
Bot ini memakai prinsip single-message UI:
| Perilaku lama | Perilaku bot ini |
|---|---|
Setiap aksi sendMessage baru |
editMessageText pada pesan yang sama |
| Prompt "Kirim nama..." = pesan baru | Prompt menimpa isi pesan utama |
| Notifikasi isolir = 1 pesan per user | 1 pesan notifikasi yang di-edit ulang |
| Pesan teks admin menumpuk | Dihapus otomatis via deleteMessage |
| Hasil aksi jadi pesan terpisah | Baris status inline di pesan utama |
Implementasi:
bot_uimenyimpanmessage_idpesan utama per chat βrender()selalu mencobaeditMessageTextdulu- Jika pesan lama sudah tidak bisa diedit (dihapus manual / terlalu lama), bot otomatis kirim ulang dan menyimpan id baru
message_idpesan admin yang masuk dicatat lalu dihapus setelah diproses- Notifikasi isolir diagregasi jadi satu pesan, bukan satu pesan per pelanggan
Hasil pengujian: seluruh alur menu β list β ringkasan β form β isi 2 field β simpan hanya memakai 1 pesan.
Agar bot tetap hidup setelah Termux ditutup:
Android Settings β Apps β Termux β Battery β Unrestricted
termux-wake-lockecho 'cd ~/staticip-bot && php bot.php' >> ~/.bashrccat > ~/run-bot.sh <<'EOF'
#!/data/data/com.termux/files/usr/bin/bash
termux-wake-lock
cd ~/staticip-bot
while true; do
php bot.php
echo "Bot berhenti, restart 10 detik..."
sleep 10
done
EOF
chmod +x ~/run-bot.sh
echo '~/run-bot.sh' >> ~/.bashrc# /etc/systemd/system/staticip-bot.service
[Unit]
Description=StaticIP Telegram Bot
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/root/staticip-bot
ExecStart=/usr/bin/php /root/staticip-bot/bot.php
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now staticip-bot
journalctl -u staticip-bot -f| Gejala | Penyebab | Solusi |
|---|---|---|
TG_BOT_TOKEN kosong |
Token belum diisi | Isi config.php, jalankan ulang |
| Bot diam, tidak ada respon | Belum tekan Start di chat bot | Buka bot, tekan Start |
getUpdates error: 409 Conflict |
Bot yang sama jalan di 2 tempat | Hentikan instance lain (cek Termux + XAMPP) |
Koneksi MikroTik gagal |
Service api mati / IP salah / firewall |
/ip service enable api, cek MK_HOST |
Login gagal / !trap |
User tidak punya policy api/write |
Buat user dengan group bot (lihat Persiapan MikroTik) |
Queue untuk IP ... tidak ditemukan |
Simple queue tidak ada / target beda | Buat queue dengan target=<IP>/32 |
| Limit tidak berubah | Queue dicocokkan via nama, bukan target | Pastikan target= berisi IP pelanggan |
| Pesan "not modified" berulang | Isi pesan sama persis | Normal, bot mengabaikan |
| Tombol lama tidak merespon | Pesan utama sudah dihapus manual | Kirim /start untuk membuat pesan baru |
could not find driver |
Ekstensi pdo_sqlite hilang |
pkg install php (Termux) / apt install php-sqlite3 |
| Notifikasi tidak masuk | notif_enabled OFF atau TG_CHAT_ID salah |
Aktifkan lewat tombol π, cek TG_CHAT_ID |
| Jam tidak sesuai | Timezone | Set date_default_timezone_set('Asia/Jakarta') |
Bot menulis log ke stdout. Untuk melihat error PHP secara detail:
php -d display_errors=1 -d error_reporting=E_ALL bot.phpCek queue langsung di router:
/queue simple print where target~"<IP-PELANGGAN>"
Apakah butuh IP publik atau port forwarding? Tidak. Bot memakai long polling (koneksi keluar), jadi aman di balik NAT/4G.
Apakah butuh scheduler MikroTik? Tidak. Bot memeriksa sendiri tiap 60 detik.
Bisa untuk pelanggan PPPoE, bukan IP statik?
Bisa, selama ada simple queue dengan target= berisi IP pelanggan. Bot mencocokkan berdasarkan target, bukan nama queue.
Datanya hilang kalau bot di-restart?
Tidak. Semua data di data/app.db (SQLite). State percakapan juga tersimpan di DB.
Bisa multi-admin?
Versi ini single-admin (ADMIN_TG_ID). Untuk multi-admin perlu perubahan pada pengecekan ID dan bot_ui/bot_state per chat.
Bisa ganti ISOLIR_LIMIT tanpa mengubah data user?
Ya, ubah di config.php. Berlaku untuk isolir berikutnya; user yang sedang terisolir perlu unisolir β isolir ulang agar nilai baru dipakai.
Bagaimana backup?
Cukup salin data/app.db (hentikan bot dulu, atau copy beserta file -wal).
Kenapa hanya 5 file di zip awal tapi sekarang 9? Versi awal masih satu file besar. Versi ini dipecah per tanggung jawab agar mudah dirawat dan diuji.
MIT License β bebas dipakai, diubah, dan didistribusikan dengan tetap mencantumkan atribusi.
Copyright (c) 2026
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Dibuat untuk ISP kecil yang ingin isolir otomatis tanpa ribet.
β Kalau berguna, kasih bintang.