This handbook outlines the process of creating Telegram Mini Apps. It emphasizes accuracy, provides detailed explanations, and includes optional/required tagging for clarity.
1. Understanding Telegram Mini Apps
- Definition: Telegram Mini Apps are web applications that run directly within the Telegram app. They offer a seamless user experience without requiring users to leave the Telegram environment.
- Key Features:
- Native Integration: Deep integration with Telegram features like payments, contacts, and location.
- Cross-Platform: Works on all Telegram platforms (iOS, Android, Desktop).
- Secure: Uses Telegram's secure infrastructure.
- Discoverable: Can be launched from chats, bots, or directly.
2. Prerequisites
- Tool: A web development environment (e.g., VS Code, Sublime Text).
- Skills:
- HTML, CSS, JavaScript/TypeScript: Essential for building the user interface and logic.
- Backend Development (Optional): If your Mini App requires server-side logic, you'll need a backend language (e.g., Node.js, Python, Go).
- Telegram Bot: A Telegram bot is required to host and launch your Mini App. You can create one using the BotFather (see previous handbook).
3. Setting Up Your Development Environment
Choose a Framework (Recommended): While you can build a Mini App with vanilla JavaScript, using a framework like React, Vue, or Svelte can significantly improve development efficiency and maintainability. React is a solid choice due to its component-based architecture and large ecosystem.
-
Create a New Project (React Example):
npx create-react-app my-telegram-miniapp --template typescript cd my-telegram-miniapp
-
Install the Telegram Web App SDK: This SDK provides access to Telegram's Mini App API.
npm install @twa-dev/sdk
-
Install
telegram-web-app
types:
npm install --save-dev @types/telegram-web-app
4. Initializing the Telegram Web App SDK
- Importance: The SDK must be initialized before you can use any of its features.
- Initialize the SDK in your main component (e.g.,
src/App.tsx
):
import React, { useEffect } from 'react';
import './App.css';
import { useTelegram } from './hooks/useTelegram';
function App() {
const { tg, onToggleButton } = useTelegram();
useEffect(() => {
tg.ready();
}, [tg]);
return (
<div className="App">
Content
</div>
);
}
export default App;
// src/hooks/useTelegram.ts
import { useEffect, useState } from 'react';
const tg = window.Telegram.WebApp;
export function useTelegram() {
const onClose = () => {
tg.close()
}
const onToggleButton = () => {
if(tg.MainButton.isVisible) {
tg.MainButton.hide();
} else {
tg.MainButton.show();
}
}
return {
tg,
onClose,
onToggleButton,
user: tg.initDataUnsafe?.user,
queryId: tg.initDataUnsafe?.query_id,
}
}
- Explanation:
* **`window.Telegram.WebApp`:** This global object is provided by Telegram when the Mini App is running within the Telegram environment.
* **`tg.ready()`:** This function signals to Telegram that your Mini App is ready to be displayed. It's crucial to call this early in your app's lifecycle.
* **`useEffect`:** The `useEffect` hook ensures that `tg.ready()` is called only once after the component mounts.
5. Implementing Basic Features
- Objective: Demonstrate core Mini App functionalities.
- Setting the Background Color:
useEffect(() => {
tg.setBackgroundColor("#f0f0f0");
}, [tg]);
- Showing and Hiding the Main Button:
useEffect(() => {
tg.MainButton.setText('Close')
tg.MainButton.onClick(onClose)
}, [tg])
- Accessing User Data:
const { user } = useTelegram();
// ...
{user?.id}
- Explanation:
* **`tg.setBackgroundColor()`:** Sets the background color of the Mini App.
* **`tg.MainButton`:** Provides access to the main button at the bottom of the Mini App. You can customize its text, color, and click handler.
* **`tg.initDataUnsafe.user`:** Contains information about the current user (ID, first name, last name, username). **Important:** This data is *unsafe* because it's not cryptographically verified. For sensitive operations, you should verify the data using the `initData` property (see Security Considerations).
6. Handling Events
- Importance: Mini Apps can respond to various events triggered by the user or Telegram.
-
Listening for the
themeChanged
Event:
useEffect(() => {
tg.onEvent('themeChanged', function(){
document.body.style.backgroundColor = tg.themeParams.bg_color;
})
}, [tg])
- Explanation:
* **`tg.onEvent()`:** Registers a callback function to be executed when a specific event occurs.
* **`themeChanged`:** This event is triggered when the user changes the Telegram theme (e.g., from light to dark mode).
* **`tg.themeParams`:** Provides access to the current theme parameters (e.g., background color, text color).
7. Sending Data Back to the Bot
- Mechanism: Mini Apps can send data back to the bot that launched them.
-
Sending Data Using
tg.sendData()
:
const sendDataToBot = () => {
tg.sendData(JSON.stringify({ message: 'Hello from the Mini App!' }));
};
- Handling the Data in Your Bot (Node.js Example):
bot.on('message', (msg) => {
if (msg.web_app_data) {
const data = JSON.parse(msg.web_app_data.data);
console.log('Received data from Mini App:', data);
bot.sendMessage(msg.chat.id, `You sent: ${data.message}`);
}
});
- Explanation:
* **`tg.sendData()`:** Sends a string of data back to the bot. It's common to serialize the data as JSON.
* **`msg.web_app_data`:** In your bot's message handler, check for the `web_app_data` property. This contains the data sent from the Mini App.
* **`msg.web_app_data.data`:** The actual data string sent by the Mini App.
8. Security Considerations
- Data Verification: Always verify the
initData
using the bot's token to ensure the data hasn't been tampered with. - Input Sanitization: Sanitize user input to prevent cross-site scripting (XSS) attacks.
- HTTPS: Your Mini App must be served over HTTPS.
-
Verifying
initData
(Simplified Example - Node.js):
import crypto from 'crypto';
function verifyTelegramWebAppInitData(initData: string, botToken: string): boolean {
const secretKey = crypto
.createHmac('sha256', 'WebAppData')
.update(botToken)
.digest();
const dataCheckString = new URLSearchParams(initData).sort().toString();
const hmac = crypto
.createHmac('sha256', secretKey)
.update(dataCheckString)
.digest('hex');
const expectedHash = new URLSearchParams(initData).get('hash');
return hmac === expectedHash;
}
9. Launching Your Mini App
Create a Bot Command: Use BotFather to create a command that launches your Mini App (e.g.,
/webapp
).Implement the Command in Your Bot:
bot.onText(/\/webapp/, (msg) => {
const chatId = msg.chat.id;
bot.sendWebApp(chatId, {
url: 'YOUR_MINI_APP_URL',
});
});
- Explanation:
* bot.sendWebApp()
: Sends a message with a button that launches the Mini App.
-
url
: The URL of your deployed Mini App.
- Testing and Debugging
- Telegram Desktop: Use Telegram Desktop for easier debugging. Open the developer tools (usually by pressing F12) to inspect the Mini App's console and network requests.
- Remote Debugging (Android): Use Chrome's remote debugging feature to debug your Mini App running on an Android device.
11. Deployment
- Platforms: Deploy your Mini App to any web hosting platform that supports HTTPS (e.g., Netlify, Vercel, AWS S3, Google Cloud Storage).
- Continuous Integration/Continuous Deployment (CI/CD): Automate the deployment process.
12. Advanced Features and Considerations
- Payments: Integrate Telegram Payments into your Mini App.
- Location: Access the user's location (with their permission).
- Haptic Feedback: Provide haptic feedback to enhance the user experience.
- Theme Customization: Adapt your Mini App to the user's Telegram theme.
- Data Storage: Use
localStorage
orsessionStorage
for client-side data storage.
References
- Telegram Mini Apps Documentation: https://core.telegram.org/bots/webapps
- Telegram Web App SDK:
@twa-dev/sdk
on npm. - React: https://react.dev/
This handbook provides a comprehensive guide to creating Telegram Mini Apps. Remember to consult the official Telegram documentation for the most up-to-date information and advanced features. Good luck!
Top comments (0)