Разбираемся с тем, как сейчас работает API DTF

У меня было немного свободного времени и сил, чтобы починить Трактир. А для этого пришлось немного поковыряться в запросах, которые сейчас формирует DTF. Внутри будет немного примеров, как это всё сейчас работает.

Разбираемся с тем, как сейчас работает API DTF

Начнём с того, что все запросы которые слались на v1.x больше не работают. Актуальные версии v2.31 и v3.0.

Частичная документация для версии 2.31:

Сокеты

Адрес для сокетов остался прежний:

И все стандартные подключения, которые не требуют авторизации, работают как обычно.

НО!

Если вам нужен личный канал пользователя (т.е себя), то вам нужен специальный хэш.

Разбираемся с тем, как сейчас работает API DTF

И вот тут нам уже нужна авторизация.

Происходит она следующим образом:

URL для запроса: https://api.dtf.ru/v3.0/auth/email/login Header: 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' method: POST Параметры: email, password ------- Пример на axios: let formData = new URLSearchParams(); formData.append("email", 'тут ваш емейл'); formData.append("password", 'тут ваш пароль'); axios.request({ url: 'https://api.dtf.ru/v3.0/auth/email/login', method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}, data: formData }) .then((login) => {

В ответ мы получаем несколько параметров, нам нужен accessToken.

Вообще, раньше при авторизации нам сразу давали userHash и mHash, но теперь не дают. Сейчас его можно получить только при дополнительном запросе.

Следовательно, после того как мы получили accessToken, нам нужно отправить следующий запрос:

URL для запроса: https://api.dtf.ru/v2.1/subsite/me Header: 'jwtauthorization': 'Bearer <наш accessToken>' method: GET ------- Пример на axios: var accessToken = login.data.data.accessToken; axios.request({ url: 'https://api.dtf.ru/v2.1/subsite/me', method: 'GET', headers: {'jwtauthorization': 'Bearer ' + accessToken} }).then((response) => { var uhash = response.data.result.userHash;

В ответ на этот запрос мы получим всю информацию о пользователе и внизу будут нужные нам userHash и mHash.

Дальше вы можете эмитить сокет:

socket.emit("subscribe", { "channel": "mobile:" + uhash });

Добавление комментария

URL для запроса: https://api.dtf.ru/v2.1/comment/add Header: 'X-Device-Token': <ваш токен который можно получить в настройках профиля> method: POST Параметры: id - ID поста reply_to (опционально) - ID комментария на который нужно ответить text - Текст комментария attachments (опционально) - JSON объект, который возвращается после загрузки файла (об этом ниже)

Получение комментария

URL для запроса: https://api.dtf.ru/v3.0/comments/:ID_Комментария Header: 'X-Device-Token': <ваш токен который можно получить в настройках профиля> method: GET

Загрузка изображения / видео

URL для запроса: https://api.dtf.ru/v2.1/uploader/upload Header: 'X-Device-Token': <ваш токен который можно получить в настройках профиля> method: POST Параметры: url - ссылка на изображение

Получаем комментарии к посту

URL для запроса: https://api.dtf.ru/v2.4/comments?contentId=:ID_ПОСТА&sorting=date Header: 'X-Device-Token': <ваш токен который можно получить в настройках профиля> method: POST

Создание поста

Вот это будет труднее всего объяснить.

Начнём с того, что там нужно будет опять залогинится через запрос который был самым первым и получить accessToken.

URL для запроса: https://api.dtf.ru/v2.1/editor Header: 'X-Device-Token': <ваш токен который можно получить в настройках профиля> Jwtauthorization: Bearer <accessToken> // Вообще, скорей всего можно использовать что-то одно, но я на всякий случай сразу два поля использую. method: POST Параметры: entry - Все данные о посте. Пример параметра entry: {"user_id":534897,"type":1,"subsite_id":534897,"title":"Трактир открыт","is_published":true,"entry":{"blocks":<блоки>}}

Обратите внимание, если раньше в API мы передавали блоки отдельно, то теперь они внутри entry. Получается entry->entry.

Параметр is_published говорит, что запись нужно опубликовать сразу. Если там выставить false, то пост создастся в черновиках.

По блокам не смогу просто объяснить, как они формируются. Если вы использовали прошлый API, то там такая же структура блоков осталась.

Самым лучшим вариантом будет, если вы отроете консоль когда будете писать пост и посмотрите на запросы которые отправляются.

В общем, всё основное, что может кому-то пригодится, я разобрал. Получение поста описано в документации, не стал дублировать.

Надеюсь пост кому-то пригодится и поможет.

5959
11 комментариев

А Вы можете выложить полный код подключения к сокету? А то по документации нихрена не понятно.

const io = require('socket.io-client');
const socket = io('https://ws-sio.dtf.ru');

socket.emit("subscribe", { "channel": "api" });
socket.on('new_entry_published', (message) => {
console.log(message);
});
socket.io.on("error", (error) => {
console.log(error);
});
socket.on('connect', () => {
console.log('Successfully connected!');
});

Ответить

const io = require('socket.io-client');
let socket = io("https://ws-sio.dtf.ru", {
transports: ["websocket"],
});

socket.emit("subscribe", { "channel": "api" });

socket.on("event", (data) => {
// console.log(data.data);
});

3
Ответить
1
Ответить

Спасибо.
Полезный материал, схоронил в закладочки.

1
Ответить

@mr2zeek мне сказали тегнуть тебя

1
Ответить

Комментарий недоступен

Ответить

Я правильно понимаю что сейчас токен для работы с апи нельзя получить? Не вижу в настройках нужную кнопку

Ответить