Telegram-боты
Регистрируйте Telegram-визиты и получайте данные посещений и профиль пользователя через внешний API.
Передавайте данные отправителя из обновления Telegram Bot API в Fingprint, чтобы зарегистрировать визит и получить идентификаторы пользователя и посещения. Затем вы сможете запросить данные этого визита или профиль пользователя со статистикой обращений к вашему проекту.
Интеграция работает на сервере бота через внешний API. Браузерный SDK для этих запросов не требуется.
Подготовьте публичный ключ
В разделе API-ключи получите активный публичный ключ проекта. Сохраните его в переменной окружения сервера бота:
FINGPRINT_PUBLIC_KEY=ваш_публичный_ключДля регистрации визита достаточно заголовка X-Public-Key. Приватный ключ и подпись X-Signature не нужны. Приватный ключ из той же пары понадобится позже, чтобы запросить данные визита или профиль пользователя. Храните его только на сервере.
Зарегистрируйте визит из сообщения
В обработчике сообщения возьмите update.message.from и отправьте JSON на POST https://gusyrooms.com/api/v1/visit/telegram. Для другого типа обновления используйте объект from его отправителя, например update.callback_query.from для нажатия кнопки.
Передайте два заголовка:
| Заголовок | Значение |
|---|---|
Content-Type | application/json |
X-Public-Key | Активный публичный ключ проекта. |
Обязательны три поля: id — числовой Telegram ID отправителя, is_bot — логическое значение, first_name — имя. Передавайте их с исходными типами из Telegram. В примерах функция принимает данные from и отправляет эти поля в Fingprint:
const publicKey = process.env.FINGPRINT_PUBLIC_KEY
if (!publicKey) {
throw new Error('Задайте FINGPRINT_PUBLIC_KEY в переменных окружения')
}
async function registerTelegramVisit(from) {
const body = JSON.stringify({
from: {
id: from.id,
is_bot: from.is_bot,
first_name: from.first_name,
},
})
const response = await fetch('https://gusyrooms.com/api/v1/visit/telegram', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Public-Key': publicKey,
},
body,
})
if (!response.ok) {
throw new Error(`Fingprint: HTTP ${response.status} — ${await response.text()}`)
}
return response.json()
}
// Вызов внутри вашего обработчика сообщения Telegram:
const { user, request_id, platform } = await registerTelegramVisit(update.message.from)
console.log({ user, request_id, platform })update — обновление, которое уже получил ваш обработчик Telegram.
Какие поля можно передать
Тело запроса должно содержать объект from со следующими полями:
Поле внутри from | Тип | Обязательно | Что передать |
|---|---|---|---|
id | Число, целое | Да | Telegram ID отправителя от 1 до 4503599627370495. |
is_bot | Логическое значение | Да | Признак бота из Telegram: true или false. |
first_name | Строка | Да | Имя, до 255 символов. |
last_name | Строка | Нет | Фамилия, до 255 символов. |
username | Строка | Нет | Имя пользователя, до 255 символов. |
language_code | Строка | Нет | Код языка, до 35 символов. |
is_premium | Логическое значение | Нет | Признак Telegram Premium: true или false. |
added_to_attachment_menu | Логическое значение | Нет | Признак добавления в меню вложений: true или false. |
Передавайте дополнительные поля, только когда они есть в обновлении. Не передавайте отсутствующие поля как null или пустые строки. Число id и логические значения должны сохранять исходные типы: строки "123456789" и "false" API не примет. Другие поля внутри from API не принимает.
Проверьте результат
При успешной регистрации API вернёт HTTP 200 и три поля:
{
"user": "3c84645edb66cca42aaa99f8fac73a1ea105",
"request_id": "704039fa045cb5823aaa77c23852c5a55aec",
"platform": "tg"
}| Поле | Что означает |
|---|---|
user | Идентификатор Telegram-пользователя. Передавайте его как visitor_fp_hash при запросе профиля. |
request_id | Идентификатор конкретного посещения. Новый вызов регистрации создаёт новое посещение. |
platform | Тип интеграции: tg для Telegram. |
Оба идентификатора имеют общий с web-визитами формат. Сохраните их из ответа и передавайте без изменений. Чтобы проверить записанные данные, запросите визит по request_id, как описано ниже.
Если регистрация вернула ошибку
| HTTP-статус | Что проверить |
|---|---|
400 | На балансе недостаточно визитов. Пополните баланс перед следующим запросом. |
401 | Не передан публичный ключ. Добавьте заголовок X-Public-Key. |
403 | Публичный ключ не найден или отключён. Проверьте значение и статус ключа. |
422 | Некорректный объект from. Проверьте обязательные поля, типы и ограничения из таблицы выше. |
500 | Ошибка обработки на стороне сервера. Сохраните ответ для обращения в поддержку. |
Ответ с ошибкой содержит поле error. При 422 поле errors содержит ошибки по полям, например from.id или from.first_name.
Получите данные визита или профиль
Для этих двух методов используйте публичный ключ, с которым зарегистрировали визит, и приватный ключ из той же пары. Передавайте публичный ключ в X-Public-Key, а подпись тела запроса — в X-Signature. Для каждого запроса заново вычисляйте подпись по правилам авторизации.
Вызывайте отдельные методы с суффиксом /telegram. В них не нужно передавать параметр sdk.
| Задача | Запрос | Что передать |
|---|---|---|
| Получить данные конкретного посещения | GET /api/v1/fingerprint/visit/risk/{request_id}/telegram | Подставьте request_id из ответа регистрации в адрес. Тело запроса не нужно. |
| Получить профиль и статистику пользователя | POST /api/v1/fingerprint/visitor/profile/telegram | JSON {"visitor_fp_hash": "<user из ответа регистрации>"}. |
В GET-запросе подпишите пустую строку. В POST-запросе подпишите отправляемое JSON-тело.
Например, после регистрации визита в примере на Node.js запросите его данные. Сохраните приватный ключ в переменной окружения FINGPRINT_PRIVATE_KEY. Код использует publicKey и request_id из примера выше:
const { createHmac } = await import('node:crypto')
const privateKey = process.env.FINGPRINT_PRIVATE_KEY
if (!privateKey) {
throw new Error('Задайте FINGPRINT_PRIVATE_KEY в переменных окружения')
}
const signature = createHmac('sha256', privateKey).update('').digest('hex')
const response = await fetch(
`https://gusyrooms.com/api/v1/fingerprint/visit/risk/${encodeURIComponent(request_id)}/telegram`,
{
headers: {
'X-Public-Key': publicKey,
'X-Signature': signature,
},
},
)
if (!response.ok) {
throw new Error(`Fingprint: HTTP ${response.status} — ${await response.text()}`)
}
const visit = await response.json()
console.log(visit.current_visit)В ответе метода оценки риска проверьте current_visit.request_id и current_visit.from: они содержат идентификатор посещения и данные отправителя, которые вы передали при регистрации.
Метод /profile возвращает последний визит в latest_visit и статистику в statistics: число посещений visits_count, число разных наборов данных from в data_count, даты первого и последнего визита. Статистика и визиты доступны только для ключа, которым подписан запрос. Если для ключа нет подходящего визита или профиля, API вернёт 404.
Оба метода также возвращают risk.is_bot из переданного from.is_bot и уровень risk.level: high при is_bot: true, иначе no. Эта оценка отражает переданный признак Telegram-бота.