Tutorial Python: Membuat Bot Telegram Sendiri dari Nol (Lengkap, Sampai Bisa Dipakai)
Bot Telegram itu salah satu proyek Python paling memuaskan buat pemula: hasilnya langsung bisa dipakai, bisa dibuka dari HP, dan bisa disambungkan ke banyak hal — dari bot katalog toko sampai bot pengingat pribadi. Di tutorial ini kita bikin bot Telegram sendiri dari nol, dengan kode lengkap yang bisa langsung kamu copy-paste dan jalan.
Yang kamu butuhkan cuma dua: akun Telegram dan Python 3.10+ di komputermu. Cek versi Python dengan python --version di terminal. Mari mulai.
1. Daftarkan Bot ke BotFather (Dapat Token)
Setiap bot Telegram butuh token — seperti password rahasia botmu. Cara mendapatkannya gratis:
1. Buka Telegram, cari akun @BotFather (yang centang biru).
2. Kirim perintah /newbot.
3. BotFather menanyakan nama tampilan bot, misalnya: Toko Saya Bot.
4. Lalu username bot (harus diakhiri bot), misalnya: tokosaya_helper_bot.
5. Selesai! BotFather membalas dengan token seperti 8123456789:AAHcdefGHIJklmNOPqrsTUVwxyz.
Simpan token itu baik-baik. Siapa pun yang memegangnya bisa mengendalikan botmu. Jangan pernah menaruhnya di kode yang kamu upload ke GitHub publik.
2. Install Library python-telegram-bot
Di komputermu, install library resmi yang dipakai tutorial ini:
pip install python-telegram-bot
Library ini versi 21+ memakai async/await — itu normal, dan kode di bawah sudah disesuaikan.
3. Bot Pertama: Menjawab /start dan Echo
Buat file bernama bot.py di folder kosong, lalu isi dengan kode lengkap berikut. Ganti teks GANTI_DENGAN_TOKENMU dengan token dari BotFather:
import os
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
MessageHandler,
filters,
ContextTypes,
)
# Ambil token dari environment variable (lebih aman daripada ditulis di kode)
TOKEN = os.environ.get("BOT_TOKEN", "GANTI_DENGAN_TOKENMU")
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"Halo! Saya bot toko.\n"
"Ketik /bantu untuk melihat daftar perintah."
)
async def bantu(update: Update, context: ContextTypes.DEFAULT_TYPE):
teks = (
"/start - mulai percakapan\n"
"/bantu - daftar perintah\n"
"/harga <nama> - cek harga barang, contoh: /harga kopi"
)
await update.message.reply_text(teks)
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Kamu bilang: " + update.message.text)
def main():
app = Application.builder().token(TOKEN).connect()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("bantu", bantu))
# Menangkap semua pesan teks biasa (bukan perintah)
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
print("Bot jalan... tekan Ctrl+C untuk berhenti.")
app.run_polling()
if __name__ == "__main__":
main()
Perhatikan baris os.environ.get("BOT_TOKEN", ...): kalau kamu menjalankan dengan environment variable BOT_TOKEN, kode memakai itu; kalau tidak, memakai teks yang kamu tulis. Cara menjalankannya:
# Cara aman (disarankan): BOT_TOKEN=isi_token_botfather_kamu python bot.py # Cara cepat (token ditulis langsung di kode): python bot.py
Kalau token benar, terminal menampilkan Bot jalan.... Sekarang buka Telegram, cari username botmu, tekan Start, dan coba kirim:
/start /bantu Halo bot!
Bot harus membalas sapaan dan — untuk pesan biasa — mengulang teksmu (fitur echo). Kalau tidak ada balasan, cek bagian troubleshooting di bawah.
4. Tambah Perintah /harga untuk Katalog Toko
Bot jadi berguna kalau bisa menjawab pertanyaan. Tambahkan fungsi ini ke bot.py (letakkan di bawah fungsi bantu):
HARGA = {
"kopi": 15000,
"teh": 8000,
"roti": 12000,
"mie": 3500,
}
async def harga(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not context.args:
await update.message.reply_text(
"Cara pakai: /harga <nama barang>\nContoh: /harga kopi"
)
return
nama = context.args[0].lower()
if nama in HARGA:
rupiah = f"Rp{HARGA[nama]:,}".replace(",", ".")
await update.message.reply_text(f"Harga {nama}: {rupiah}")
else:
daftar = ", ".join(sorted(HARGA.keys()))
await update.message.reply_text(
f"Maaf, '{nama}' tidak ada di daftar.\nBarang tersedia: {daftar}"
)
Lalu daftarkan handler-nya di fungsi main(), di bawah handler lain:
app.add_handler(CommandHandler("harga", harga))
Hentikan bot (Ctrl+C) dan jalankan ulang, lalu tes di Telegram:
/harga kopi /harga susu /harga
Respons yang benar:
Harga kopi: Rp15.000 Maaf, 'susu' tidak ada di daftar. Barang tersedia: kopi, mie, roti, teh Cara pakai: /harga <nama barang> Contoh: /harga kopi
context.args otomatis berisi kata-kata setelah perintah, jadi /harga kopi susu memberi ["kopi", "susu"]. Pola ini bisa kamu pakai untuk perintah lain: /stok, /pesan, /jadwal, dan sebagainya. Untuk toko beneran, ganti dictionary HARGA dengan baca dari database atau file.
5. Tambah Tombol Menu (Keyboard) Supaya Mudah Dipakai
Mengetik perintah itu merepotkan buat pelanggan. Tambahkan tombol menu di bawah kolom chat:
from telegram import ReplyKeyboardMarkup
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [
["🛒 Cek Harga", "📦 Lihat Katalog"],
["☎️ Hubungi Admin"],
]
markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)
await update.message.reply_text(
"Halo! Saya bot toko. Pilih menu di bawah:",
reply_markup=markup,
)
Ganti fungsi start yang lama dengan versi ini, dan tambahkan ReplyKeyboardMarkup ke import di atas. Supaya tombolnya berfungsi, tambah handler pesan:
async def menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
teks = update.message.text
if teks == "🛒 Cek Harga":
await update.message.reply_text(
"Ketik /harga <nama barang>, contoh: /harga kopi"
)
elif teks == "📦 Lihat Katalog":
daftar = "\n".join(
f"- {nama}: Rp{harga:,}".replace(",", ".")
for nama, harga in sorted(HARGA.items())
)
await update.message.reply_text("Katalog kami:\n" + daftar)
elif teks == "☎️ Hubungi Admin":
await update.message.reply_text(
"Silakan hubungi admin di @username_admin_kamu"
)
def main():
app = Application.builder().token(TOKEN).connect()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("bantu", bantu))
app.add_handler(CommandHandler("harga", harga))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, menu))
print("Bot jalan... tekan Ctrl+C untuk berhenti.")
app.run_polling()
Perhatikan: handler echo diganti menu. Jalankan ulang bot, kirim /start, dan tombol-tombol akan muncul di bawah kolom ketik. Ketuk 📦 Lihat Katalog untuk melihat daftar barang lengkap.
6. Troubleshooting: Kalau Bot Tidak Merespons
Tiga masalah paling umum dan solusinya:
1. Error "Unauthorized" di terminal. Token salah atau ada spasi berlebih. Salin ulang token dari BotFather dan pastikan tidak ada spasi di depan/belakang.
2. Tidak ada error tapi bot diam saja. Pastikan kamu chat dengan bot yang benar (username yang kamu daftarkan), dan terminal masih menampilkan Bot jalan.... Jangan menjalankan dua salinan bot dengan token yang sama — Telegram hanya mengizinkan satu koneksi polling aktif.
3. Error saat install library. Pastikan pip milik Python 3: coba pip3 install python-telegram-bot atau python -m pip install python-telegram-bot.
7. Menjalankan Bot 24 Jam
Selama ini bot mati begitu terminal ditutup. Untuk bot toko yang harus selalu online, jalankan di server (VPS) memakai screen:
# di VPS: screen -S bot-toko BOT_TOKEN=isi_token_kamu python bot.py # tekan Ctrl+A lalu D untuk keluar dari screen (bot tetap jalan) # untuk kembali: screen -r bot-toko
Alternatif yang lebih rapi di VPS Linux adalah systemd service supaya bot otomatis restart kalau server reboot — tapi screen di atas sudah cukup untuk mulai. Untuk tahap belajar, menjalankan bot dari laptop saat dibutuhkan pun tidak masalah.
Kesimpulan
Dalam tujuh langkah kamu sudah punya bot Telegram sungguhan: terdaftar resmi via BotFather, bisa menjawab perintah /start, /bantu, dan /harga, punya tombol menu, dan tahu cara menjalankannya terus-menerus. Dari sini jalurnya terbuka lebar: sambungkan HARGA ke database tokomu, tambah perintah /pesan yang meneruskan order ke nomor admin, atau bikin bot pengingat pribadi yang mengirim pesan terjadwal. Fondasi polling + handler yang kamu pelajari di sini sama untuk semua itu. Selamat ngoprek!
Komentar
Posting Komentar