Как без усилий пролистать историю диалога до самого начала

Как без усилий пролистать историю диалога до самого начала

Я не айтишник, но немного умею гуглить и делиться полезным. Если у вас в диалоге бесконечная история переписки и рука уже устала скроллить и нажимать кнопку для подгрузки данных вверх — ловите способ, как автоматизировать этот процесс через браузер (у меня гугл хром). Уверен, можно и через телефон сделать, но это уже просите у наших светлых голов :)

Инструкция (для ПК):

  1. Открываем нужный диалог.
  2. Нажимаем F12 (или правой кнопкой мыши в любом месте -> «Просмотреть код»).
  3. Переходим во вкладку Console (Консоль). Изображение
  4. Вставьте код, приведенный ниже (под спойлером), и нажмите Enter.
  5. Если браузер выдает предупреждение и запрещает вставку, просто введите вручную фразуallow pasting и нажмите Enter, и после этого снова вставьте код.

(function() {
let clickCount = 0;
console.log(`Запуск… Нажимаю кнопки подгрузки.`);

const interval = setInterval(function() {
const btn = Array.from(document.querySelectorAll(`button, a, .btn`))
.find(function(el) {
return el.textContent.includes(`Показать предыдущие`) || el.id === `load_more_messages`;
});

if (btn && btn.offsetParent !== null) {
btn.click();
clickCount++;
console.log(`Нажато раз: ${clickCount}`);
} else {
clearInterval(interval);
console.log(`Загрузка завершена. Создаю HTML с цветами.`);
generateStyledHTML();
}
}, 2500);

function generateStyledHTML() {
const selectors = `.message, .msg, .chat-item, [class*='message'], .im_message_body`;
let messages = Array.from(document.querySelectorAll(selectors)).filter(function(el) {
return !el.querySelector(selectors);
});

let html = `<html><head><meta charset='UTF-8'><style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #e5ddd5; padding: 20px; display: flex; flex-direction: column; }
.msg-wrapper { display: flex; flex-direction: column; margin-bottom: 10px; width: 100%; }
.msg-bubble { padding: 10px 15px; border-radius: 15px; max-width: 75%; box-shadow: 0 1px 2px rgba(0,0,0,0.15); word-wrap: break-word; position: relative; }
img { max-width: 100%; border-radius: 8px; margin-top: 8px; display: block; }
.left { align-self: flex-start; border-bottom-left-radius: 2px; }
.right { align-self: flex-end; border-bottom-right-radius: 2px; }
</style></head><body>`;

const uniqueContent = new Set();

messages.forEach(function(el) {
const text = el.innerText.trim();
const imgs = Array.from(el.querySelectorAll(`img`));

if (!text && imgs.length === 0) return;

// Защита от дублей по тексту и количеству картинок
const contentKey = text + imgs.length;
if (uniqueContent.has(contentKey)) return;
uniqueContent.add(contentKey);

// Определяем реальный цвет фона элемента
let style = window.getComputedStyle(el);
let bgColor = style.backgroundColor;
let textColor = style.color;

// Если фон прозрачный, ищем у родителя
let parent = el;
while ((bgColor === `rgba(0, 0, 0, 0)` || bgColor === `transparent`) && parent.parentElement) {
parent = parent.parentElement;
style = window.getComputedStyle(parent);
bgColor = style.backgroundColor;
textColor = style.color;
}

// Логика выравнивания: если фон белый или очень светлый — влево, иначе — вправо
const rgb = bgColor.match(/\d+/g);
let sideClass = `right`;
if (rgb && (parseInt(rgb[0]) + parseInt(rgb[1]) + parseInt(rgb[2]) > 700)) {
sideClass = `left`;
}

let imgsHtml = ``;
imgs.forEach(function(img) {
if (img.src && !img.src.startsWith(`data:image/svg`)) {
imgsHtml += `<img src='${img.src}'>`;
}
});

html += `<div class='msg-wrapper'>
<div class='msg-bubble ${sideClass}' style='background-color: ${bgColor}; color: ${textColor};'>
${text.replace(/\n/g, `<br>`)}
${imgsHtml}
</div>
</div>`;
});

html += `</body></html>`;

const blob = new Blob([html], { type: `text/html` });
const url = URL.createObjectURL(blob);

// Скачивание
const a = document.createElement(`a`);
a.href = url;
a.download = `colorful_chat_history.html`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);

// Открытие
const win = window.open(url, `_blank`);
if (!win) {
console.log(`Файл скачан. Для открытия в новой вкладке разрешите всплывающие окна.`);
}
}
})();

____________________________________________________________________________________

дальше можно не читать

Что сделает этот скрипт:

  1. Будет сам «нажимать» кнопку подгрузки каждые 2.5 секунды, пока не дойдет до самого первого сообщения.
  2. Автоматически уберет все «матрешки» и дубликаты (чтобы сообщения не повторялись).
  3. Сохранит всё в красивый HTML-файл: сообщения будут в цветных «пузырях» (как в диалоге) и с загрузкой картинок.
  4. После завершения файл сразу скачается в папку «Загрузки», и скрипт попытается открыть его в новой вкладке.

Теперь текст перед глазами, и по нему можно легко искать информацию через Ctrl + F. Дальше на ваше усмотрение)

Безопасно ли это?

Многие боятся вставлять сторонний код в консоль, и это правильно! Вот почему этот скрипт не опасен:

  1. Он работает только в вашем браузере: Код не отправляет данные на сторонние серверы. Он просто собирает текст, который и так уже загружен у вас на экране, и упаковывает его в файл.
  2. Никаких паролей: Скрипт не запрашивает доступ к вашему аккаунту, паролям или личным данным. Его задача — только имитировать нажатие кнопки «вверх» и копировать текст сообщений.
  3. Открытость: Любой, кто хоть немного понимает в коде, может прочитать его: там видно только команды поиска кнопок и сохранения текста.
  4. Автономность: Вы можете даже отключить интернет в момент, когда история уже подгружена, — скрипт всё равно сформирует файл, так как работает локально на вашем ПК.

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

Если у кого-то есть идеи, как улучшить код или сделать поиск еще удобнее — пишите!

Было бы отлично, если админ сделал поиск по слову, а пока спасаемся так.

Опрос:

Как часто вам приходится искать что-то в старых переписках?

Листаю до стертых пальцев
Проще спросить собеседника заново
Теперь буду юзать твой лайфхак!
Жду версию для смартфона
Я сам айтишник, могу дополнить код в комментах
Боюсь тыкать
19:10
582
Написать автору
+2
denny30 denny30 2 дня назад #

Появилась улучшенная версия кода

Автоматически отсечет список контактов, ники и аватарки собеседников слева.

Всё так же:
1. Открываем нужный диалог.

2. НажимаемF12(или правой кнопкой мыши в любом месте -> «Просмотреть код»).

3. Переходим во вкладкуConsole.

4. Вставляем код, приведенныйвыше, и нажимаем Enter.

5. Если браузер выдает предупреждение и запрещает вставку, просто введите вручную фразу allow pastingи нажмите Enter, и после этого снова вставьте код.

+1
Isidora Isidora 2 дня назад #

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

0
denny30 denny30 2 дня назад #

Главный эксперт на месте)) Отпишись потом, как тебе результат.

И конечно, если сама идея выгрузки пригодится тебе для плагина, забирай не задумываясь и встраивай к себе))

+2
Isidora Isidora 2 дня назад #

Отпишись потом, как тебе результат.
Все работает)

не задумываясь и встраивай к себе))
Вообще я думаю что это была бы хорошая дополнительная функция.

-1
SUL SUL 2 дня назад #

После неудачной попытки с ЧКГ, ты теперь решил примерить на себя роль Исидоры и God5. Какой упертый… мальчик.

0
denny30 denny30 2 дня назад #

О какой неудаче речь? Как всегда ноль внимательности)

На роль ребят не претендую. Они талантливые, всё тянули сами. Я же просто использовал ИИ и автоматизировал процесс под свои нужды и еще пары человек.

И вообще, все роли уже давно придуманы. За какое дело ни возьмись, окажется, что кто-то это уже делал. В тот момент, когда упертая… девочка захочет что-то реально сделать сама, а не просто критиковать из кустов — я буду рядом))

0
SUL SUL 2 дня назад #

Слишком явно оправдываешься.

0
denny30 denny30 2 дня назад #

А я думал, это угроза 🤔

+1
Isidora Isidora 2 дня назад #

Я не против компании

0
Жизнь.🌴🕌🐘🌴 Жизнь.🌴🕌🐘🌴 2 дня назад #

Главное, чтобы Компания была не против Вас !!

🤣🤣🤣👬...👬...💃...👬...👬🤣🤣🤣

+1
🍅🍅🍅🍅🍅 🍅🍅🍅🍅🍅 1 день назад #

Так и до песенок не далеко

+1
denny30 denny30 1 день назад #
0
Крыса Взорвиса Крыса Взорвиса 1 день назад #

так Денни у Помидора хлеб отберет

+1
🍅🍅🍅🍅🍅 🍅🍅🍅🍅🍅 1 день назад #

Лишь бы не томатный сок

0
111111 111111 1 день назад #

Томатный сок отбираю только я и Мэри.Не всем понять вкус напитка Богов)

0
🍅🍅🍅🍅🍅 🍅🍅🍅🍅🍅 1 день назад #

Не всем понятен смысл слова «отбираю»

0
111111 111111 1 день назад #

В моём случае позаимствованно из оригинала. Вроде бы намного проще чем казалось...

0
კოცნა კოცნა 2 дня назад #

О нет...Denny.. это как же ты так взял и позволил себе опубликовать разработку? что же теперь будет? ты хоть понимаешь, что РОЛЬ разработчиков уже занята? угостите кто-нибудь пузырьком валерьяны меня.

0
denny30 denny30 2 дня назад #

Грешен, не ведал, что творил. Пойду покаюсь перед богами кода))

0
SUL SUL 2 дня назад #

Адвокатов подвезли, разбирайте, пока свежие.

0
denny30 denny30 2 дня назад #

Слишком явно злишься.

0
111111 111111 1 день назад #

Полкило пожалуйста, если свежие/сегодняшние.)

0
SUL SUL 1 день назад #

Вам задок или передок взвешать?

0
111111 111111 1 день назад #

А они по одной цене?)

0
SUL SUL 1 день назад #

Задок дороже!

0
111111 111111 1 день назад #

Поймите одну вещь, под самым красивым павлиньим хвостом скрывается обычная, куриная жопа.
Всё же подумайте над ценой и сделайте правильный выбор)

0
SUL SUL 1 день назад #

Вы когда-нибудь покупали говядину? Знаете принцип ценообразования? Тут примерно тоже самое.

0
111111 111111 1 день назад #

Давайте мы не будем углубляться в азы ценообразования, налогообложения, накладных и 1с.Присутствует такой пункт как «форс-мажорные ситуации», который способен повернуть исход договорённости либо и вовсе свести их на невозможность исполнения.

Либо я приобретаю товар по одной цене и обе стороны в плюсе, либо позовите Вашего начальника)