telegram-init-data


Nametelegram-init-data JSON
Version 1.0.1 PyPI version JSON
download
home_pageNone
SummaryPython library for working with Telegram Mini Apps initialization data
upload_time2025-07-13 18:39:18
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords telegram mini-apps init-data validation signature bot
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Telegram Init Data Python

[![PyPI version](https://badge.fury.io/py/telegram-init-data.svg)](https://badge.fury.io/py/telegram-init-data)
[![Python versions](https://img.shields.io/pypi/pyversions/telegram-init-data.svg)](https://pypi.org/project/telegram-init-data)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

A Python library for working with Telegram Mini Apps initialization data. This library provides utilities to parse, validate, and sign init data on the server side, similar to the official [@telegram-apps/init-data-node](https://docs.telegram-mini-apps.com/packages/telegram-apps-init-data-node/2-x) package.

## Features

- 🔐 **Validate init data** - Verify signature and expiration of Telegram Mini App init data
- 📝 **Parse init data** - Convert URL-encoded init data to structured Python objects
- ✍️ **Sign init data** - Create signed init data for testing and development
- 🔍 **Type safety** - Full type hints and validation
- 🚀 **FastAPI integration** - Ready-to-use middleware for FastAPI applications
- 🌐 **3rd party validation** - Support for validating data signed by Telegram directly

## Installation

```bash
pip install telegram-init-data
```

For FastAPI integration:
```bash
pip install telegram-init-data[fastapi]
```

## Quick Start

### Basic Validation

```python
from telegram_init_data import validate, parse

# Your bot token from @BotFather
bot_token = "YOUR_BOT_TOKEN"

# Init data string from Telegram Mini App
init_data = "query_id=AAHdF6IQAAAAAN0XohDhrOrc&user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%7D&auth_date=1662771648&hash=c501b71e775f74ce10e377dea85a7ea24ecd640b223ea86dfe453e0eaed2e2b2"

try:
    # Validate the init data
    validate(init_data, bot_token)
    print("✅ Init data is valid!")
    
    # Parse the init data
    parsed_data = parse(init_data)
    print(f"User: {parsed_data['user']['first_name']}")
    
except Exception as e:
    print(f"❌ Validation failed: {e}")
```

### Using with FastAPI

```python
from fastapi import FastAPI, Depends, HTTPException
from telegram_init_data import validate, parse

app = FastAPI()

def verify_init_data(init_data: str) -> dict:
    """Dependency to verify and parse init data"""
    bot_token = "YOUR_BOT_TOKEN"
    
    try:
        validate(init_data, bot_token)
        return parse(init_data)
    except Exception as e:
        raise HTTPException(status_code=401, detail=str(e))

@app.post("/user/profile")
async def get_profile(init_data: dict = Depends(verify_init_data)):
    user = init_data.get("user")
    if not user:
        raise HTTPException(status_code=400, detail="User data not found")
    
    return {"user_id": user["id"], "name": user["first_name"]}
```

### Advanced Usage

```python
from telegram_init_data import sign, is_valid
from datetime import datetime

# Create test init data
test_data = {
    "query_id": "test_query_id",
    "user": {
        "id": 123456789,
        "first_name": "John",
        "last_name": "Doe",
        "username": "johndoe",
        "language_code": "en"
    },
    "auth_date": datetime.now()
}

# Sign the data
signed_data = sign(test_data, bot_token, datetime.now())
print(f"Signed data: {signed_data}")

# Check if data is valid (returns boolean)
if is_valid(signed_data, bot_token):
    print("✅ Data is valid")
else:
    print("❌ Data is invalid")
```

## API Reference

### Core Functions

#### `validate(value, token, options=None)`

Validates Telegram Mini App init data.

**Parameters:**
- `value` (str | dict): Init data to validate
- `token` (str): Bot token from @BotFather
- `options` (dict, optional): Validation options
  - `expires_in` (int): Expiration time in seconds (default: 86400)

**Raises:**
- `SignatureMissingError`: When hash parameter is missing
- `AuthDateInvalidError`: When auth_date is invalid or missing
- `ExpiredError`: When init data has expired
- `SignatureInvalidError`: When signature verification fails

#### `is_valid(value, token, options=None)`

Checks if init data is valid without raising exceptions.

**Returns:** `bool` - True if valid, False otherwise

#### `parse(value)`

Parses init data string into structured Python object.

**Parameters:**
- `value` (str | dict): Init data to parse

**Returns:** `InitData` - Parsed init data object

#### `sign(data, token, auth_date, options=None)`

Signs init data for testing/development.

**Parameters:**
- `data` (dict): Data to sign
- `token` (str): Bot token
- `auth_date` (datetime): Authentication date
- `options` (dict, optional): Signing options

**Returns:** `str` - Signed init data as URL-encoded string

### Data Types

#### `InitData`

```python
class InitData(TypedDict):
    query_id: Optional[str]
    user: Optional[User]
    receiver: Optional[User]
    chat: Optional[Chat]
    chat_type: Optional[ChatType]
    chat_instance: Optional[str]
    start_param: Optional[str]
    can_send_after: Optional[int]
    auth_date: int
    hash: str
    signature: Optional[str]
```

#### `User`

```python
class User(TypedDict):
    id: int
    first_name: str
    last_name: Optional[str]
    username: Optional[str]
    language_code: Optional[str]
    is_bot: Optional[bool]
    is_premium: Optional[bool]
    added_to_attachment_menu: Optional[bool]
    allows_write_to_pm: Optional[bool]
    photo_url: Optional[str]
```

#### `Chat`

```python
class Chat(TypedDict):
    id: int
    type: ChatType
    title: Optional[str]
    username: Optional[str]
    photo_url: Optional[str]
```

### Exception Classes

- `TelegramInitDataError`: Base exception class
- `AuthDateInvalidError`: Invalid or missing auth_date
- `SignatureInvalidError`: Invalid signature
- `SignatureMissingError`: Missing signature/hash
- `ExpiredError`: Init data has expired

## Configuration Options

### Validation Options

```python
options = {
    "expires_in": 3600,  # 1 hour expiration instead of default 24 hours
}

validate(init_data, bot_token, options)
```

### Disable Expiration Check

```python
options = {
    "expires_in": 0,  # Disable expiration check
}

validate(init_data, bot_token, options)
```

## Testing

Run tests with pytest:

```bash
# Install development dependencies
pip install -e .[dev]

# Run tests
pytest

# Run with coverage
pytest --cov=telegram_init_data --cov-report=html
```

## Examples

### Complete FastAPI Application

```python
from fastapi import FastAPI, Depends, HTTPException, Header
from telegram_init_data import validate, parse, is_valid

app = FastAPI()

def get_init_data(authorization: str = Header(None)):
    """Extract and validate init data from Authorization header"""
    if not authorization:
        raise HTTPException(status_code=401, detail="Authorization header missing")
    
    if not authorization.startswith("tma "):
        raise HTTPException(status_code=401, detail="Invalid authorization format")
    
    init_data = authorization[4:]  # Remove "tma " prefix
    bot_token = "YOUR_BOT_TOKEN"
    
    if not is_valid(init_data, bot_token):
        raise HTTPException(status_code=401, detail="Invalid init data")
    
    return parse(init_data)

@app.get("/me")
async def get_current_user(init_data: dict = Depends(get_init_data)):
    """Get current user info"""
    user = init_data.get("user")
    if not user:
        raise HTTPException(status_code=400, detail="User data not found")
    
    return {
        "id": user["id"],
        "name": user.get("first_name", ""),
        "username": user.get("username"),
        "is_premium": user.get("is_premium", False)
    }

@app.post("/settings")
async def update_settings(
    settings: dict,
    init_data: dict = Depends(get_init_data)
):
    """Update user settings"""
    user = init_data.get("user")
    # Save settings for user["id"]
    return {"status": "success"}
```

## Development

### Setup Development Environment

```bash
# Clone the repository
git clone https://github.com/telegram-init-data/telegram-init-data-python.git
cd telegram-init-data-python

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install in development mode
pip install -e .[dev]

# Run tests
pytest

# Format code
black telegram_init_data tests
isort telegram_init_data tests

# Type checking
mypy telegram_init_data
```

### Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Ensure all tests pass
6. Submit a pull request

## License

MIT License. See [LICENSE](LICENSE) for details.

## Related Projects

- [@telegram-apps/init-data-node](https://docs.telegram-mini-apps.com/packages/telegram-apps-init-data-node/2-x) - Official Node.js implementation
- [Telegram Mini Apps Documentation](https://docs.telegram-mini-apps.com/) - Official documentation

## Changelog

See [CHANGELOG.md](CHANGELOG.md) for details about changes in each version.

## Support

If you have questions or need help:

1. Check the [documentation](https://github.com/iCodeCraft/telegram-init-data/blob/main/README.md)
2. Look at the [examples](examples/)
3. Open an [issue](https://github.com/iCodeCraft/telegram-init-data/issues)

---

Developed with ❤️ by Imran Gadzhiev to support Telegram Mini Apps developers.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "telegram-init-data",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "telegram, mini-apps, init-data, validation, signature, bot",
    "author": null,
    "author_email": "Imran Gadzhiev <i.gadzhiev.m@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/98/47/b56c72cb3b3188e15cf17c1201c38437a0c8869d8381af7a152cf5735d99/telegram_init_data-1.0.1.tar.gz",
    "platform": null,
    "description": "# Telegram Init Data Python\n\n[![PyPI version](https://badge.fury.io/py/telegram-init-data.svg)](https://badge.fury.io/py/telegram-init-data)\n[![Python versions](https://img.shields.io/pypi/pyversions/telegram-init-data.svg)](https://pypi.org/project/telegram-init-data)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA Python library for working with Telegram Mini Apps initialization data. This library provides utilities to parse, validate, and sign init data on the server side, similar to the official [@telegram-apps/init-data-node](https://docs.telegram-mini-apps.com/packages/telegram-apps-init-data-node/2-x) package.\n\n## Features\n\n- \ud83d\udd10 **Validate init data** - Verify signature and expiration of Telegram Mini App init data\n- \ud83d\udcdd **Parse init data** - Convert URL-encoded init data to structured Python objects\n- \u270d\ufe0f **Sign init data** - Create signed init data for testing and development\n- \ud83d\udd0d **Type safety** - Full type hints and validation\n- \ud83d\ude80 **FastAPI integration** - Ready-to-use middleware for FastAPI applications\n- \ud83c\udf10 **3rd party validation** - Support for validating data signed by Telegram directly\n\n## Installation\n\n```bash\npip install telegram-init-data\n```\n\nFor FastAPI integration:\n```bash\npip install telegram-init-data[fastapi]\n```\n\n## Quick Start\n\n### Basic Validation\n\n```python\nfrom telegram_init_data import validate, parse\n\n# Your bot token from @BotFather\nbot_token = \"YOUR_BOT_TOKEN\"\n\n# Init data string from Telegram Mini App\ninit_data = \"query_id=AAHdF6IQAAAAAN0XohDhrOrc&user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%7D&auth_date=1662771648&hash=c501b71e775f74ce10e377dea85a7ea24ecd640b223ea86dfe453e0eaed2e2b2\"\n\ntry:\n    # Validate the init data\n    validate(init_data, bot_token)\n    print(\"\u2705 Init data is valid!\")\n    \n    # Parse the init data\n    parsed_data = parse(init_data)\n    print(f\"User: {parsed_data['user']['first_name']}\")\n    \nexcept Exception as e:\n    print(f\"\u274c Validation failed: {e}\")\n```\n\n### Using with FastAPI\n\n```python\nfrom fastapi import FastAPI, Depends, HTTPException\nfrom telegram_init_data import validate, parse\n\napp = FastAPI()\n\ndef verify_init_data(init_data: str) -> dict:\n    \"\"\"Dependency to verify and parse init data\"\"\"\n    bot_token = \"YOUR_BOT_TOKEN\"\n    \n    try:\n        validate(init_data, bot_token)\n        return parse(init_data)\n    except Exception as e:\n        raise HTTPException(status_code=401, detail=str(e))\n\n@app.post(\"/user/profile\")\nasync def get_profile(init_data: dict = Depends(verify_init_data)):\n    user = init_data.get(\"user\")\n    if not user:\n        raise HTTPException(status_code=400, detail=\"User data not found\")\n    \n    return {\"user_id\": user[\"id\"], \"name\": user[\"first_name\"]}\n```\n\n### Advanced Usage\n\n```python\nfrom telegram_init_data import sign, is_valid\nfrom datetime import datetime\n\n# Create test init data\ntest_data = {\n    \"query_id\": \"test_query_id\",\n    \"user\": {\n        \"id\": 123456789,\n        \"first_name\": \"John\",\n        \"last_name\": \"Doe\",\n        \"username\": \"johndoe\",\n        \"language_code\": \"en\"\n    },\n    \"auth_date\": datetime.now()\n}\n\n# Sign the data\nsigned_data = sign(test_data, bot_token, datetime.now())\nprint(f\"Signed data: {signed_data}\")\n\n# Check if data is valid (returns boolean)\nif is_valid(signed_data, bot_token):\n    print(\"\u2705 Data is valid\")\nelse:\n    print(\"\u274c Data is invalid\")\n```\n\n## API Reference\n\n### Core Functions\n\n#### `validate(value, token, options=None)`\n\nValidates Telegram Mini App init data.\n\n**Parameters:**\n- `value` (str | dict): Init data to validate\n- `token` (str): Bot token from @BotFather\n- `options` (dict, optional): Validation options\n  - `expires_in` (int): Expiration time in seconds (default: 86400)\n\n**Raises:**\n- `SignatureMissingError`: When hash parameter is missing\n- `AuthDateInvalidError`: When auth_date is invalid or missing\n- `ExpiredError`: When init data has expired\n- `SignatureInvalidError`: When signature verification fails\n\n#### `is_valid(value, token, options=None)`\n\nChecks if init data is valid without raising exceptions.\n\n**Returns:** `bool` - True if valid, False otherwise\n\n#### `parse(value)`\n\nParses init data string into structured Python object.\n\n**Parameters:**\n- `value` (str | dict): Init data to parse\n\n**Returns:** `InitData` - Parsed init data object\n\n#### `sign(data, token, auth_date, options=None)`\n\nSigns init data for testing/development.\n\n**Parameters:**\n- `data` (dict): Data to sign\n- `token` (str): Bot token\n- `auth_date` (datetime): Authentication date\n- `options` (dict, optional): Signing options\n\n**Returns:** `str` - Signed init data as URL-encoded string\n\n### Data Types\n\n#### `InitData`\n\n```python\nclass InitData(TypedDict):\n    query_id: Optional[str]\n    user: Optional[User]\n    receiver: Optional[User]\n    chat: Optional[Chat]\n    chat_type: Optional[ChatType]\n    chat_instance: Optional[str]\n    start_param: Optional[str]\n    can_send_after: Optional[int]\n    auth_date: int\n    hash: str\n    signature: Optional[str]\n```\n\n#### `User`\n\n```python\nclass User(TypedDict):\n    id: int\n    first_name: str\n    last_name: Optional[str]\n    username: Optional[str]\n    language_code: Optional[str]\n    is_bot: Optional[bool]\n    is_premium: Optional[bool]\n    added_to_attachment_menu: Optional[bool]\n    allows_write_to_pm: Optional[bool]\n    photo_url: Optional[str]\n```\n\n#### `Chat`\n\n```python\nclass Chat(TypedDict):\n    id: int\n    type: ChatType\n    title: Optional[str]\n    username: Optional[str]\n    photo_url: Optional[str]\n```\n\n### Exception Classes\n\n- `TelegramInitDataError`: Base exception class\n- `AuthDateInvalidError`: Invalid or missing auth_date\n- `SignatureInvalidError`: Invalid signature\n- `SignatureMissingError`: Missing signature/hash\n- `ExpiredError`: Init data has expired\n\n## Configuration Options\n\n### Validation Options\n\n```python\noptions = {\n    \"expires_in\": 3600,  # 1 hour expiration instead of default 24 hours\n}\n\nvalidate(init_data, bot_token, options)\n```\n\n### Disable Expiration Check\n\n```python\noptions = {\n    \"expires_in\": 0,  # Disable expiration check\n}\n\nvalidate(init_data, bot_token, options)\n```\n\n## Testing\n\nRun tests with pytest:\n\n```bash\n# Install development dependencies\npip install -e .[dev]\n\n# Run tests\npytest\n\n# Run with coverage\npytest --cov=telegram_init_data --cov-report=html\n```\n\n## Examples\n\n### Complete FastAPI Application\n\n```python\nfrom fastapi import FastAPI, Depends, HTTPException, Header\nfrom telegram_init_data import validate, parse, is_valid\n\napp = FastAPI()\n\ndef get_init_data(authorization: str = Header(None)):\n    \"\"\"Extract and validate init data from Authorization header\"\"\"\n    if not authorization:\n        raise HTTPException(status_code=401, detail=\"Authorization header missing\")\n    \n    if not authorization.startswith(\"tma \"):\n        raise HTTPException(status_code=401, detail=\"Invalid authorization format\")\n    \n    init_data = authorization[4:]  # Remove \"tma \" prefix\n    bot_token = \"YOUR_BOT_TOKEN\"\n    \n    if not is_valid(init_data, bot_token):\n        raise HTTPException(status_code=401, detail=\"Invalid init data\")\n    \n    return parse(init_data)\n\n@app.get(\"/me\")\nasync def get_current_user(init_data: dict = Depends(get_init_data)):\n    \"\"\"Get current user info\"\"\"\n    user = init_data.get(\"user\")\n    if not user:\n        raise HTTPException(status_code=400, detail=\"User data not found\")\n    \n    return {\n        \"id\": user[\"id\"],\n        \"name\": user.get(\"first_name\", \"\"),\n        \"username\": user.get(\"username\"),\n        \"is_premium\": user.get(\"is_premium\", False)\n    }\n\n@app.post(\"/settings\")\nasync def update_settings(\n    settings: dict,\n    init_data: dict = Depends(get_init_data)\n):\n    \"\"\"Update user settings\"\"\"\n    user = init_data.get(\"user\")\n    # Save settings for user[\"id\"]\n    return {\"status\": \"success\"}\n```\n\n## Development\n\n### Setup Development Environment\n\n```bash\n# Clone the repository\ngit clone https://github.com/telegram-init-data/telegram-init-data-python.git\ncd telegram-init-data-python\n\n# Create virtual environment\npython -m venv venv\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\n\n# Install in development mode\npip install -e .[dev]\n\n# Run tests\npytest\n\n# Format code\nblack telegram_init_data tests\nisort telegram_init_data tests\n\n# Type checking\nmypy telegram_init_data\n```\n\n### Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Ensure all tests pass\n6. Submit a pull request\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for details.\n\n## Related Projects\n\n- [@telegram-apps/init-data-node](https://docs.telegram-mini-apps.com/packages/telegram-apps-init-data-node/2-x) - Official Node.js implementation\n- [Telegram Mini Apps Documentation](https://docs.telegram-mini-apps.com/) - Official documentation\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for details about changes in each version.\n\n## Support\n\nIf you have questions or need help:\n\n1. Check the [documentation](https://github.com/iCodeCraft/telegram-init-data/blob/main/README.md)\n2. Look at the [examples](examples/)\n3. Open an [issue](https://github.com/iCodeCraft/telegram-init-data/issues)\n\n---\n\nDeveloped with \u2764\ufe0f by Imran Gadzhiev to support Telegram Mini Apps developers.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python library for working with Telegram Mini Apps initialization data",
    "version": "1.0.1",
    "project_urls": {
        "Documentation": "https://github.com/telegram-init-data/telegram-init-data-python#readme",
        "Homepage": "https://github.com/telegram-init-data/telegram-init-data-python",
        "Issues": "https://github.com/telegram-init-data/telegram-init-data-python/issues",
        "Repository": "https://github.com/telegram-init-data/telegram-init-data-python"
    },
    "split_keywords": [
        "telegram",
        " mini-apps",
        " init-data",
        " validation",
        " signature",
        " bot"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2423de17c1243d85d346fed7774895e0926e01a50bafa76f952102cafff44fdc",
                "md5": "4bd1585fb1c3f54fc9dab82aeca791d2",
                "sha256": "c530edd74973881ba18c8ac48b2f3c7db41bac6cc073c2828e696a47e3a7ce05"
            },
            "downloads": -1,
            "filename": "telegram_init_data-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4bd1585fb1c3f54fc9dab82aeca791d2",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 18606,
            "upload_time": "2025-07-13T18:39:16",
            "upload_time_iso_8601": "2025-07-13T18:39:16.744572Z",
            "url": "https://files.pythonhosted.org/packages/24/23/de17c1243d85d346fed7774895e0926e01a50bafa76f952102cafff44fdc/telegram_init_data-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9847b56c72cb3b3188e15cf17c1201c38437a0c8869d8381af7a152cf5735d99",
                "md5": "184823613db588b594110b99949fccd1",
                "sha256": "f54aa6e881b9744e4feadc3c191c3a5d896058db9ad184e89cb91e2c9e2e6757"
            },
            "downloads": -1,
            "filename": "telegram_init_data-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "184823613db588b594110b99949fccd1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 19305,
            "upload_time": "2025-07-13T18:39:18",
            "upload_time_iso_8601": "2025-07-13T18:39:18.099313Z",
            "url": "https://files.pythonhosted.org/packages/98/47/b56c72cb3b3188e15cf17c1201c38437a0c8869d8381af7a152cf5735d99/telegram_init_data-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-13 18:39:18",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "telegram-init-data",
    "github_project": "telegram-init-data-python#readme",
    "github_not_found": true,
    "lcname": "telegram-init-data"
}
        
Elapsed time: 0.42967s