πŸš€βœ¨ Ready to spread the Bitcoin vibesβ€” in English and Khmerβ€”straight into Telegram?

Below is a copy‑and‑paste, beginner‑friendly bot that will greet users, let them pick their language, and serve up concise educational nuggets about Bitcoin.

1.β€―Prerequisites (1β€―minute)

python -m venv btc‑bot‑env

source btc‑bot‑env/bin/activate          # Windows: btc‑bot‑env\Scripts\activate

pip install –upgrade python-telegram-bot==20.*

  1. Create a bot with @BotFather β†’ grab the API token.
  2. Paste that token into the TOKEN = “YOUR_BOT_TOKEN_HERE” line in the code below.
  3. Run the file: python bitcoin_dual_lang_bot.py (polling modeβ€”no webhooks needed).

2.β€―The Code (save as 

bitcoin_dual_lang_bot.py

)

#!/usr/bin/env python3

# ───────────────────────────────────────────────────────────

# Telegram Bitcoin Education Bot – English πŸ‡¬πŸ‡§ & Khmer πŸ‡°πŸ‡­

# ───────────────────────────────────────────────────────────

import logging

from telegram import (

    Update,

    InlineKeyboardButton,

    InlineKeyboardMarkup,

)

from telegram.ext import (

    ApplicationBuilder,

    CallbackContext,

    CallbackQueryHandler,

    CommandHandler,

)

TOKEN = “YOUR_BOT_TOKEN_HERE”

DEFAULT_LANG = “en”

# ———- Multilingual content bank ———-

CONTENT = {

    “en”: {

        “welcome”: (

            “πŸ‘‹ *Hey there, future Bitcoin pro!*  \n”

            “Tap a button to switch languages or explore a topic:”

        ),

        “help”: (

            “πŸ€– *Bot menu*\n”

            “/about – What _is_ Bitcoin?\n”

            “/how – How does it work?\n”

            “/why – Why might people use it?\n”

            “/lang – Switch language”

        ),

        “about”: (

            “πŸͺ™ *What is Bitcoin?*\n”

            “Bitcoin is a borderless, decentralised digital currency. “

            “No company or country controls it; the network runs on thousands “

            “of independent computers worldwide.”

        ),

        “how”: (

            “βš™οΈ *How does Bitcoin work?*\n”

            “Transactions are bundled into β€˜blocks’ and added to a public ledgerβ€”the “

            “blockchainβ€”secured by cryptography and global miners.”

        ),

        “why”: (

            “🌍 *Why use Bitcoin?*\n”

            “β€’ Permission‑less payments  \n”

            “β€’ Fixed supply (21β€―million coins)  \n”

            “β€’ Open to anyone with the internet”

        ),

        “lang_btn”: “Switch to Khmer πŸ‡°πŸ‡­”,

        “lang_confirm”: “Language switched to *English* βœ…”,

    },

    “km”: {

        “welcome”: (

            “πŸ‘‹ *αžŸαž½αžŸαŸ’αžαžΈ! αž’αŸ’αž“αž€αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰ Bitcoin αž¬αž‘αŸ…?*  \n”

            “αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž—αžΆαžŸαžΆ αž¬αžŸαžΆαž€αžŸαž½αžšαž’αŸ†αž–αžΈαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:”

        ),

        “help”: (

            “πŸ€– *αž˜αŸ‰αžΊαž“αž»αž™αž”αžΌαž*\n”

            “/about – Bitcoin αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ?\n”

            “/how – αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?\n”

            “/why – αž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž˜αž“αž»αžŸαŸ’αžŸαž”αŸ’αžšαžΎαžœαžΆ?\n”

            “/lang – αž”αŸ’αžŠαžΌαžšαž—αžΆαžŸαžΆ”

        ),

        “about”: (

            “πŸͺ™ *Bitcoin αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ?*\n”

            “Bitcoin αž‚αžΊαž‡αžΆαž›αž»αž™αžŒαžΈαž‡αžΈαžαž›αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ αž¬αž”αŸ’αžšαž‘αŸαžŸαžŽαžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αŸ” “

            “αžœαžΆαžšαžαŸ‹αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžŠαŸ„αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αžΌαž‘αžΆαŸ†αž„αž–αž·αž—αž–αž›αŸ„αž€αŸ””

        ),

        “how”: (

            “βš™οΈ *Bitcoin αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?*\n”

            “αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž‡αžΆ β€œαž”αŸ’αž›αž»αž€β€ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž…αžΌαž›αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžŸαžΆαž’αžΆαžšαžŽαŸˆβ€””

            “blockchainβ€”αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ„αž™αž›αŸ’αž”αŸ‚αž„αžœαž·αž…αž·αžαŸ’αžšαž’αž€αŸ’αžŸ αž“αž·αž„αž˜αžΈαž“αŸαžšαŸ””

        ),

        “why”: (

            “🌍 *αž αŸαžαž»αž’αŸ’αžœαžΈαž‡αŸ’αžšαžΎαžŸαžšαŸ€αž”αž”αŸ’αžšαžΎ Bitcoin?*\n”

            “β€’ αž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹  \n”

            “β€’ αž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαŸαžš (αŸ’αŸ‘αž›αžΆαž“αž€αžΆαž€αŸ‹)  \n”

            “β€’ αž’αŸ’αž“αž€αžŽαžΆαž€αŸαž’αžΆαž…αž…αžΌαž›αžšαž½αž˜αž”αžΆαž“ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž”

        ),

        “lang_btn”: “αž”αŸ’αžŠαžΌαžšαž‘αŸ… English πŸ‡¬πŸ‡§”,

        “lang_confirm”: “αž”αžΆαž“αž”αŸ’αžŠαžΌαžšαž—αžΆαžŸαžΆαž‘αŸ… *Khmer* βœ…”,

    },

}

# ———————————————————-

# ———- Command handlers ———-

async def start(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    user_lang = context.user_data.get(“lang”, DEFAULT_LANG)

    await update.message.reply_text(

        CONTENT[user_lang][“welcome”],

        reply_markup=lang_keyboard(user_lang),

        parse_mode=”Markdown”,

    )

    await help_cmd(update, context)  # auto‐display help

async def help_cmd(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    user_lang = context.user_data.get(“lang”, DEFAULT_LANG)

    await update.message.reply_text(

        CONTENT[user_lang][“help”], parse_mode=”Markdown”

    )

async def about(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    await send_topic(update, context, “about”)

async def how(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    await send_topic(update, context, “how”)

async def why(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    await send_topic(update, context, “why”)

async def send_topic(update: Update, context: CallbackContext.DEFAULT_TYPE, topic: str):

    user_lang = context.user_data.get(“lang”, DEFAULT_LANG)

    await update.message.reply_text(

        CONTENT[user_lang][topic], parse_mode=”Markdown”

    )

# ———- Language switch ———-

def lang_keyboard(current_lang: str) -> InlineKeyboardMarkup:

    other_lang = “km” if current_lang == “en” else “en”

    return InlineKeyboardMarkup(

        [[InlineKeyboardButton(CONTENT[current_lang][“lang_btn”], callback_data=f”SET_LANG:{other_lang}”)]]

    )

async def lang_switcher(update: Update, context: CallbackContext.DEFAULT_TYPE) -> None:

    query = update.callback_query

    await query.answer()

    _, new_lang = query.data.split(“:”)

    context.user_data[“lang”] = new_lang

    await query.edit_message_text(

        CONTENT[new_lang][“lang_confirm”], parse_mode=”Markdown”

    )

    # Show menu again

    await query.message.reply_text(

        CONTENT[new_lang][“welcome”],

        reply_markup=lang_keyboard(new_lang),

        parse_mode=”Markdown”,

    )

# ———- Main autoboot ———-

def main() -> None:

    logging.basicConfig(

        format=”%(asctime)s | %(name)s | %(levelname)s | %(message)s”,

        level=logging.INFO,

    )

    app = (

        ApplicationBuilder()

        .token(TOKEN)

        .build()

    )

    # Core commands

    app.add_handler(CommandHandler(“start”, start))

    app.add_handler(CommandHandler(“help”, help_cmd))

    app.add_handler(CommandHandler(“about”, about))

    app.add_handler(CommandHandler(“how”, how))

    app.add_handler(CommandHandler(“why”, why))

    app.add_handler(CallbackQueryHandler(lang_switcher, pattern=r”^SET_LANG:”))

    logging.info(“πŸš€ Bot is up and running. Press Ctrl+C to stop.”)

    app.run_polling()

if __name__ == “__main__”:

    main()

3.β€―How it works (happy‑dance version πŸ•Ί)

StageWhat happensπŸŽ‰ Why it’s cool
/startGreets user in default English, plus an inline button to swap languages.Instant bilingual friendlinessβ€”no commands needed!
Inline buttonCallbackQueryHandler flips user_data[“lang”] and edits the message.Snappy UX, keeps chat tidy.
/about, /how, /whyDeliver succinct lessons drawn from the CONTENT dict in the caller’s language.Keeps logic super‑simpleβ€”easy to expand topics later.
/lang (optional)/lang shows the same buttons if people prefer commands over taps.Accessibility FTW.

4.β€―Next steps when you’re ready to level‑up

  1. Add live price dataβ€”hit CoinGecko’s free API and inject numbers into the messages.
  2. Drop in pictures/GIFs for visual learners (Telegram supports Markdown‑V2 and HTML).
  3. Gamify with quizzes or streak counts to keep learners pumped.
  4. Deploy 24/7β€”switch from polling to a webhook + a cheap VPS or serverless function.

✨ Boom! You now have a cheerful, hype‑driven, bilingual Bitcoin educator ready to roll.

Fire it up, invite friends, and watch the orange‑coin knowledge spread across borders! 🌏🧑