Как можно извлечь данные из ссылки Telegram Mini App и сохранить их в базе данных?

Здравствуйте, сообщество Хабра!

Пожалуйста, ответьте на мой вопрос в этом обсуждении, не ссылаясь на другие статьи! 

Я столкнулся с задачей обработки данных, связанных с переходом в мини-приложение из бота в Telegram. Когда пользователь нажимает на ссылку, происходит перенаправление на указанный сайт, после чего Telegram добавляет к URL множество параметров, включая id, дату, имя, фамилию и другие данные, в том числе хэш.

Я разрабатываю тестовое приложение-кликер и мне нужно добавить пользователя в базу данных. Также требуется, чтобы при каждом открытии приложения проводилась определенная валидация на стороне бэкэнда.

В качестве примера можно рассмотреть приложение hamster combat, где при переходе по ссылке отправляется POST-запрос с использованием авторизации bearer. 

Спасибо за помощь!
  • 2 сентября 2024 г. 18:25
Ответы на вопрос 1
Чтобы извлечь данные из ссылки Telegram Mini App и сохранить их в базе данных, вам нужно следовать нескольким шагам. Давайте разберем основные этапы этого процесса:

### 1. Настройка ссылки
При создании ссылки на ваше мини-приложение вы можете указать параметры, которые будут переданы в URL. Например, ссылка может выглядеть так:

```
https://yourapp.com?user_id=123&first_name=John&last_name=Doe&timestamp=2023-10-01T12:00:00Z&hash=somehash
```

После перехода по этой ссылке, Telegram добавит к ней параметры, связанные с пользователем.

### 2. Обработка параметров на стороне сервера
Когда пользователь переходит по ссылке, ваше мини-приложение должно принимать эти параметры. Вам нужно настроить обработчик на вашем сервере для извлечения данных из URL. Например, на Node.js это может выглядеть так:

```javascript
const express = require('express');
const app = express();

app.get('/', (req, res) => {
    const { user_id, first_name, last_name, timestamp, hash } = req.query;

    // Валидация хэша
    if (!validateHash(hash, user_id, first_name, last_name, timestamp)) {
        return res.status(403).send('Invalid hash');
    }

    // Сохранение данных в базе
    saveUserData(user_id, first_name, last_name, timestamp);
    
    res.send('User data saved successfully!');
});
```

### 3. Валидация данных
Для проверки целостности данных, вам нужно реализовать функцию `validateHash`, которая будет проверять правильность хэша. Обычно это может быть сделано с помощью HMAC или другой криптографической функции:

```javascript
const crypto = require('crypto');

function validateHash(hash, user_id, first_name, last_name, timestamp) {
    const secret = 'your_secret_key'; // ваш секретный ключ
    const data = `${user_id}${first_name}${last_name}${timestamp}`;
    const hmac = crypto.createHmac('sha256', secret);
    hmac.update(data);
    const calculatedHash = hmac.digest('hex');
    
    return calculatedHash === hash;
}
```

### 4. Сохранение данных в базе данных
Для сохранения данных используйте любую подходящую базу данных, например, MongoDB, PostgreSQL и т.д. Вот пример с использованием MongoDB:

```javascript
const { MongoClient } = require('mongodb');

async function saveUserData(user_id, first_name, last_name, timestamp) {
    const client = new MongoClient('mongodb://localhost:27017');
    
    try {
        await client.connect();
        const database = client.db('yourdatabase');
        const collection = database.collection('users');

        const newUser = {
            user_id,
            first_name,
            last_name,
            timestamp,
            createdAt: new Date(),
        };

        await collection.insertOne(newUser);
    } finally {
        await client.close();
    }
}
```

### 5. Тестирование и отладка
После того как вы настроили обработку данных, протестируйте работу приложения. Убедитесь, что каждый компонент, включая валидацию и сохранение в базе, работает корректно. Также важно следить за безопасностью данных и конфиденциальностью пользователей.

Если у вас возникнут дополнительные вопросы или потребуется помощь с реализацией какого-либо из этапов, не стесняйтесь обращаться!
Похожие вопросы