Как собрать TikTok DM Webhook Receiver с GitHub Copilot
Если вам нужно принимать TikTok DM в систему поддержки, не просите AI угадать формат payload. Начните с реального контракта: UnifyPort доставляет входящие сообщения TikTok как стандартное событие message.received, подписанное через HMAC-SHA256 по raw request body.
Главное
- В официальной документации TikTok Direct Messages описаны в контексте Data Portability scopes и data types, а не как универсальный live webhook для поддержки клиентов.
- Copilot должен работать с настоящими именами из UnifyPort API reference:
POST /v1/webhook-endpoints,subscribed_events,signing_secret,X-Device-Timestamp,X-Device-Signature. - Подпись проверяется до JSON parsing, по raw body. Повторная сериализация меняет bytes и ломает проверку.
- Сначала сохраните событие, затем маршрутизируйте его в Slack, CRM или AI triage worker.
Если вы еще изучаете сам вопрос TikTok DM API, начните с материала почему нет общего официального endpoint для TikTok DM. Для сравнения live intake и export workflow используйте TikTok Data Portability vs live DMs.
Что получится
Мы строим небольшой Node.js сервис с одним route /webhook. Он принимает события UnifyPort, проверяет X-Device-Timestamp и X-Device-Signature, обрабатывает message.received, сохраняет нужные поля и отвечает 200.
Во время реализации держите открытой страницу webhook delivery and signature verification. Это источник истины для headers, строки подписи, retries и idempotency.
Первый prompt для Copilot
Build a minimal Express service for a UnifyPort webhook receiver.
Use express.raw({ type: 'application/json' }). Verify X-Device-Signature as hex HMAC-SHA256 over X-Device-Timestamp + '.' + raw request body using WEBHOOK_SIGNING_SECRET.
Only process event.type === 'message.received'. Store provider, account_id, conversation.id, sender.id, message.id, message.text, message.direction, and occurred_at.
Return 200 after storing; return 401 on invalid signature.
Основной код должен сохранять raw body:
import crypto from 'crypto';
import express from 'express';
const app = express();
const secret = process.env.WEBHOOK_SIGNING_SECRET;
const queue = [];
function verifySignature(req) {
const timestamp = req.get('X-Device-Timestamp') || '';
const signature = req.get('X-Device-Signature') || '';
const expected = crypto.createHmac('sha256', secret)
.update(timestamp + '.')
.update(req.body)
.digest('hex');
return signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
if (!verifySignature(req)) return res.status(401).end();
const event = JSON.parse(req.body.toString('utf8'));
if (event.type !== 'message.received') return res.status(200).end();
queue.push({
provider: event.provider,
account_id: event.account_id,
conversation_id: event.data.conversation.id,
sender_id: event.data.sender.id,
message_id: event.data.message.id,
text: event.data.message.text || '',
direction: event.data.message.direction,
occurred_at: event.occurred_at,
});
res.status(200).end();
});
Зарегистрируйте webhook endpoint
После HTTPS deployment создайте endpoint через POST /v1/webhook-endpoints. Укажите message.received в subscribed_events; signing_secret включает подпись доставки.
curl -X POST https://api.unifyport.ai/v1/webhook-endpoints \
-H "X-Api-Key: dk_live_example" \
-H "Content-Type: application/json" \
-d '{
"url": "https://inbox.example.com/webhook",
"status": "active",
"subscribed_events": ["message.received"],
"signing_secret": "whsec_6f5b1c9d4e7a2b8c"
}'
Для более широкого примера AI coding workflow посмотрите tutorial про auto-reply bot.
Добавьте надежность
Следующий prompt должен попросить Copilot добавить idempotency через X-Device-Event-Id, сохранить raw event и отправлять в triage queue только data.message.direction === 'inbound'. Потом можно подключить Slack notifications, CRM upsert или AI classification.
Ограничения
Если продукту нужны официальные publishing, login, research tools или data export, используйте официальные API TikTok. Неофициальный интерфейс UnifyPort подходит для live inbound messages из существующего аккаунта и дает проверяемый event stream, а не официальный TikTok product scope.
FAQ
Может ли Copilot собрать весь inbox?
Он может подготовить receiver, tests и queue code. Но проверку подписи, secrets, deployment и storage behavior нужно ревьюить вручную.
Data Portability — это live DM?
Нет. Официальные документы описывают export scopes и data types. Для поддержки обычно нужен live event stream.
Какое событие подписывать?
Для входящих сообщений используйте message.received. ["*"] имеет смысл только для полного event collector.
Sources checked on 2026-08-29
Превратите интеграцию сообщений в стабильный продуктовый pipeline.
Начните с отправки через единый API, затем возвращайте входящие сообщения в бизнес-систему стандартными событиями.