Скрипт для личных сообщений DTF
1. Скачиваете расширение для браузера TamperMonkey
2. Создаете новый скрипт, вставляете это:
// ==UserScript==
// @name DTF Plus Chat Replacement
// @namespace http://tampermonkey.net/
// @version 1.7
// @description Replace Plus prompt with custom input and send real POST request to DTF API with image support
// @author ME + chatGPT
// @match https://dtf.ru/m/*
// @grant none
// @run-at document-end
// ==/UserScript==
(function () {
'use strict';
// 🔒 Вставьте свой Token ниже
const DEVICE_TOKEN = 'СЮДА_ТОКЕН';
function waitForElement(selector, callback, interval = 300, timeout = 10000) {
const start = Date.now();
const timer = setInterval(() => {
const element = document.querySelector(selector);
if (element) {
clearInterval(timer);
callback(element);
} else if (Date.now() - start > timeout) {
clearInterval(timer);
}
}, interval);
}
waitForElement('div.VGcZ2-ry', (targetDiv) => {
const userIdMatch = window.location.pathname.match(/\/m\/(\d+)/);
const userId = userIdMatch ? userIdMatch[1] : null;
if (!userId) return;
const replacementHTML = `
<div class="ZQKrj9Xg">
<div class="field field--default textarea">
<label class="field__wrapper">
<div class="field__wrapper-body">
<textarea class="textarea__input textarea__input--single-line" rows="1" style="height: 42px;"></textarea>
<input type="file" id="imageUpload" accept="image/*" style="display: none;" />
<svg id="uploadTrigger" class="icon icon--image field__icon field__icon--right field__icon--clickable" width="22" height="22">
<use xlink:href="#image"></use>
</svg>
</div>
</label>
</div>
<button class="button button--size-m button--type-primary button--icon-only button--circle KX-HEa0t" disabled type="button">
<svg class="icon icon--arrow_up" width="20" height="20">
<use xlink:href="#arrow_up"></use>
</svg>
</button>
</div>
`;
targetDiv.innerHTML = replacementHTML;
const textarea = targetDiv.querySelector('textarea');
const button = targetDiv.querySelector('button');
const fileInput = targetDiv.querySelector('#imageUpload');
const uploadTrigger = targetDiv.querySelector('#uploadTrigger');
let uploadedImage = null;
if (uploadTrigger && fileInput) {
uploadTrigger.addEventListener('click', () => fileInput.click());
fileInput.addEventListener('change', () => {
const file = fileInput.files[0];
if (file) {
uploadedImage = file;
button.removeAttribute('disabled');
}
});
}
async function sendMessage() {
const message = textarea.value.trim();
if (!message && !uploadedImage) return;
const formData = new FormData();
formData.append('channelId', userId);
formData.append('text', message);
formData.append('idTmp', Math.floor(Math.random() * 100000));
formData.append('ts', Date.now() / 1000);
if (uploadedImage) {
formData.append('media', uploadedImage);
} else {
formData.append('media', '[]');
}
try {
const response = await fetch('https://api.dtf.ru/v2.1/m/send', {
method: 'POST',
headers: {
'accept': 'application/json',
'X-Device-Token': DEVICE_TOKEN,
'User-Agent': 'dtf-app/2.2.0; release (Pixel 2; Android/9; ru_RU; 1980x1794)'
},
body: formData
});
const result = await response.json();
console.log('Ответ от API:', result);
textarea.value = '';
uploadedImage = null;
fileInput.value = '';
button.setAttribute('disabled', '');
} catch (error) {
console.error('Ошибка при запросе к API:', error);
alert('Ошибка при отправке сообщения. Проверьте токен');
}
}
if (textarea && button) {
textarea.addEventListener('input', () => {
if (textarea.value.trim().length > 0 || uploadedImage) {
button.removeAttribute('disabled');
} else {
button.setAttribute('disabled', '');
}
});
textarea.addEventListener('keydown', (e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
sendMessage();
}
});
button.addEventListener('click', () => sendMessage());
}
});
})();
3. Для работы скрипта нужен токен.
Чтобы его получить:
- Выходите из профиля ДТФ
- Включаете консоль разработчика на F12
- Заходите в вкладку «Сеть»
- Обновляете страницу
С включенной консолью регаетесь на ДТФ. Ищите в вкладке «Сеть» API login
Нажимаете на него. В вкладке «ответы» смотрите data и находите там refreshToken, копируете его и вставляете его в код. Сохраняете.
Отправка картинок не работает. Если плашка о плюсе появляется в сообщениях, обновите страницу. Ничего не тестил, поэтому хрен знает будет ли работать.
9 комментариев