Skip to main content

Simple Python framework for working with Telegram API and Mini Apps

Project description

TMA Framework

Advanced Python framework for Telegram user simulation and Mini App testing with full MTProto capabilities.

Features

  • 👤 Full User Simulation - Act as a real Telegram user with MTProto
  • 🤖 Bot Interaction - Send messages to bots and receive responses
  • 📱 Automatic Mini App Discovery - Find and interact with Mini Apps from bots
  • 🎭 Playwright Integration - Automated UI testing with Playwright
  • 🔌 HTTP Client - API testing with httpx
  • ⚙️ Simple Configuration - Environment variables and config objects
  • 🔄 Async Support - Full async/await support
  • 📊 Logging - Built-in logging with loguru
  • 🚀 High Performance - Powered by msgspec for fast serialization and validation

Installation

# Install dependencies
uv add httpx telethon playwright msgspec loguru pyyaml aiofiles cryptography

# Install Playwright browsers
playwright install

Quick Start

Setup Requirements

Before using TMA Framework, you need:

  1. Telegram API Credentials (from my.telegram.org):

    • Go to "API development tools"
    • Create new application
    • Copy api_id and api_hash
  2. Get Session String (one-time setup):

    • Run: python examples/get_session.py
    • Enter your API credentials and phone number
    • Complete authentication (SMS code + 2FA if needed)
    • Copy the generated session string
  3. Environment Variables:

    export TMA_API_ID="your_api_id"
    export TMA_API_HASH="your_api_hash"
    export TMA_SESSION_STRING="your_session_string"
    

Basic Usage

import asyncio
from tma_framework import UserTelegramClient, Config

async def main():
    # Configuration with session string
    config = Config(
        api_id=12345,
        api_hash="your_api_hash",
        session_string="your_session_string"  # From get_session.py
    )

    # Initialize client (no authentication needed)
    async with UserTelegramClient(config) as client:
        user_info = await client.get_me()
        print(f"User: {user_info.first_name} (@{user_info.username})")

        # Interact with any bot
        response = await client.interact_with_bot(
            bot_username="example_bot",
            command="/start",
            wait_for_response=True
        )

        if response:
            print(f"Bot response: {response.text}")

asyncio.run(main())

Mini App API Testing

import asyncio
from tma_framework import UserTelegramClient, MiniAppApi, Config

async def main():
    config = Config(
        api_id=12345,
        api_hash="your_api_hash",
        session_string="your_session_string"
    )

    async with UserTelegramClient(config) as client:
        # Get Mini App from bot
        mini_app = await client.get_mini_app_from_bot("example_bot")

        if mini_app:
            # Test API endpoints
            async with MiniAppApi(mini_app.url, config) as api:
                result = await api.make_request("/api/status", "GET")
                print(f"API Test: {'✅ PASSED' if result.success else '❌ FAILED'}")

                # Validate initData
                is_valid = await api.validate_init_data(init_data, "bot_token")
                print(f"InitData validation: {'✅ VALID' if is_valid else '❌ INVALID'}")

asyncio.run(main())

Mini App UI Testing

import asyncio
from tma_framework import UserTelegramClient, MiniAppUI, Config

async def main():
    config = Config(
        api_id=12345,
        api_hash="your_api_hash",
        session_string="your_session_string"
    )

    async with UserTelegramClient(config) as client:
        # Get Mini App from bot
        mini_app = await client.get_mini_app_from_bot("example_bot")

        if mini_app:
            # Test Mini App UI
            async with MiniAppUI(mini_app.url, config) as ui:
                # Setup browser and navigate
                await ui.setup_browser()
                await ui.page.goto(mini_app.url, wait_until="networkidle")

                # UI interactions
                await ui.fill_input("#username", "test_user")
                await ui.click_element("#submit-button")
                await ui.take_screenshot("test_screenshot.png")

asyncio.run(main())

Configuration

Environment Variables

# Required
export TMA_API_ID="12345"
export TMA_API_HASH="your_api_hash"

# Session (choose one)
export TMA_SESSION_STRING="session_string"   # For saved sessions
export TMA_SESSION_FILE="session.session"    # For file sessions

# Optional
export TMA_MINI_APP_URL="https://your-mini-app.com"
export TMA_MINI_APP_START_PARAM="start_param_value"
export TMA_TIMEOUT="30"
export TMA_RETRY_COUNT="3"
export TMA_RETRY_DELAY="1.0"
export TMA_LOG_LEVEL="INFO"

Config Object

from tma_framework import Config

# Using session string
config = Config(
    api_id=12345,
    api_hash="your_api_hash",
    session_string="your_session_string"
)

# Using session file
config = Config(
    api_id=12345,
    api_hash="your_api_hash",
    session_file="my_session.session"
)

API Reference

UserTelegramClient

Core Methods

  • get_me() - Get current user information
  • get_entity() - Get entity (user/chat) information
  • send_message() - Send message to user/chat
  • get_messages() - Get messages from chat
  • interact_with_bot() - Interact with any bot
  • get_mini_app_from_bot() - Get Mini App from bot
  • add_event_handler() - Add event handler
  • start_listening() - Start listening for messages

MiniAppApi

  • make_request() - Make HTTP request to API endpoint
  • validate_init_data() - Validate Telegram initData with HMAC

MiniAppUI

  • setup_browser() - Setup Playwright browser
  • click_element() - Click element
  • fill_input() - Fill input field
  • wait_for_element() - Wait for element
  • take_screenshot() - Take screenshot
  • get_page_title() - Get page title
  • get_page_url() - Get page URL
  • execute_script() - Execute JavaScript

Examples

See the examples/ directory for more detailed examples:

  • mtproto_usage.py - Complete MTProto user simulation examples
  • get_session.py - Script to generate session string for authentication
  • simple_auth.py - Simple authentication example
  • error_handling.py - Error handling and validation examples
  • advanced_auth.py - Advanced authentication with step-by-step process

Documentation

For detailed information about TMA Framework, see:

Requirements

  • Python 3.12+
  • httpx
  • telethon
  • playwright
  • msgspec
  • loguru
  • pyyaml
  • aiofiles
  • cryptography

Performance

TMA Framework uses msgspec for high-performance data validation and serialization:

  • 2-4x faster JSON serialization compared to Pydantic
  • 2-3x faster data validation
  • 2-3x less memory usage
  • Runtime type checking with zero-cost validation

Run the performance benchmarks:

uv run python tests/test_performance.py

License

MIT License

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

tma_test_framework-1.1.0.tar.gz (154.2 kB view details)

Uploaded Source

Built Distribution

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

tma_test_framework-1.1.0-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

File details

Details for the file tma_test_framework-1.1.0.tar.gz.

File metadata

  • Download URL: tma_test_framework-1.1.0.tar.gz
  • Upload date:
  • Size: 154.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.22

File hashes

Hashes for tma_test_framework-1.1.0.tar.gz
Algorithm Hash digest
SHA256 59b33baeb3602adcb0e24f0eeefb3d93e7991f6a1e90e7b5be99adc857d558f3
MD5 582f526db9c8cb29d41430388667efa9
BLAKE2b-256 ee1fd94f157e3f1620793e980047f180701ac4526b50da4c0d846adc179cd203

See more details on using hashes here.

File details

Details for the file tma_test_framework-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for tma_test_framework-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 64255a0adc7673bc79a7aa3f4b4a7e594460f043b177e7fc9a9b9162eca40fd5
MD5 ce9196f067b90df90eb61176d0e15608
BLAKE2b-256 85a0c5e9296b5972f45a2fb0a2094e041055ce83441382b017655235456aa8f5

See more details on using hashes here.

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