Как перенести канал (группу) из Telegram на сайт WordPress с фото.
Если необходима помощь в переносе канала на сайт, либо полностью готовый сайт (клон вашего канала Telegram) - пишите мне. Раскрыть контакты
1. Для начала нам нужно скачать все посты с канала.
Для этого на ПК ставим сам Telegram Desktop.
Включаем IP какой -нибудь страны* для того, чтобы скачать все посты с Телеграм канала.
И по инструкции формируем HTML файл (по умолчанию указан html (JSON не выбираем)

2. Вторым шагом мы открываем по порядку наши файлы в папке.
(в каждом файле по 1000 постов из Telegram канала вашего)
Пример открытия файла в браузере:

3. Следующим шагом нам нужно сформировать CSV файл.
Где все посты будут разделены по строкам.
А также все данные постов по столбцам:
- Дата
- Время
- Автор
- Заголовок
- Репост
- Текст
- Реакции
- Фото
- Видео (в инструкции нет, но по индивидуальному заказу можно переделать код ниже)
Для этого, прямо на странице файла html открываем консоль F12, вводим код что ниже и жмем Enter.

У нас сразу скачивается автоматически CSV файл с данными.
Чудесный код для формирования файла:
(Который отдельным столбцом умеет сохранять заголовок поста - берет его он по двум правилам - либо до точки, либо до первого переноса <br.
Также он отдельно указывает название и время источника, если мы репостнули.
Видео пока что код не указывает (если необходимо - по индивидуальному заказу могу переделать код ниже).
Текст поста в html. Сохраняет структуру, теги и ссылки.
(function() {
'use strict';
const messages = document.querySelectorAll('.message.default.clearfix');
if (!messages.length) {
console.warn('Не найдено сообщений. Проверьте селекторы или прокрутите чат для загрузки.');
return;
}
function removeEmojis(str) {
if (!str) return '';
return str
.replace(/[\u{1F600}-\u{1F64F}]/gu, '')
.replace(/[\u{1F300}-\u{1F5FF}]/gu, '')
.replace(/[\u{1F680}-\u{1F6FF}]/gu, '')
.replace(/[\u{1F1E0}-\u{1F1FF}]/gu, '')
.replace(/[\u{2600}-\u{26FF}]/gu, '')
.replace(/[\u{2700}-\u{27BF}]/gu, '')
.replace(/[\u{1F900}-\u{1F9FF}]/gu, '')
.replace(/[\u{1FA00}-\u{1FAFF}]/gu, '')
.replace(/[\u{238C}\u{2B50}\u{200D}\u{FE0F}]/gu, '')
.replace(/\s+/g, ' ')
.trim();
}
function extractTitle(textEl) {
if (!textEl) return '';
const plainText = textEl.innerText.trim();
let title = '';
const firstLine = plainText.split(/\n/)[0]?.trim();
if (firstLine && firstLine.length > 0 && firstLine.length < 300) {
title = firstLine;
} else {
const dot = plainText.indexOf('.');
if (dot > 10 && dot < 300) {
title = plainText.substring(0, dot).trim();
} else {
title = plainText.substring(0, 200).trim();
}
}
return removeEmojis(title);
}
function extractForwarded(msg) {
const forwardedEl = msg.querySelector('.forwarded.body');
if (!forwardedEl) return '';
const fromNameEl = forwardedEl.querySelector('.from_name');
if (!fromNameEl) return '';
const fromNameHTML = fromNameEl.innerHTML.trim();
return '<div class="forwarded body"><div class="from_name">' + fromNameHTML + '</div></div>';
}
const rows = Array.from(messages).map(msg => {
const dateEl = msg.querySelector('.date.details');
const fromEl = msg.querySelector('.from_name');
const textEl = msg.querySelector('.text');
const datetime = dateEl?.title || '';
const [date, time] = datetime ? [datetime.split(' ')[0], datetime.split(' ')[1]?.split(' ')[0]] : ['', ''];
const author = fromEl?.innerText.trim() || '';
const title = extractTitle(textEl);
const forwarded = extractForwarded(msg);
const content = textEl ? textEl.innerHTML.trim() : '';
const images = Array.from(msg.querySelectorAll('img'))
.map(img => img.getAttribute('src') || img.getAttribute('data-src') || '')
.filter(src => src)
.join(' | ');
let reactions = '';
const reactEl = msg.querySelector('.reactions');
if (reactEl) {
reactions = Array.from(reactEl.querySelectorAll('.reaction')).map(r => {
const emoji = r.querySelector('.emoji')?.innerText || '';
const count = r.querySelector('.count')?.innerText || '';
return emoji + count;
}).join(' ');
}
return [date, time, author, title, forwarded, content, reactions, images];
});
const withForwarded = rows.filter(r => r[4]).length;
console.log('Найдено сообщений: ' + rows.length);
console.log('С репостами: ' + withForwarded);
console.log('С заголовками: ' + rows.filter(r => r[3]).length);
function escapeCSV(field) {
const str = String(field);
if (/[;"\n]/.test(str)) {
return '"' + str.replace(/"/g, '""') + '"';
}
return str;
}
const csv = '\uFEFF' +
'Дата;Время;Автор;Заголовок;Репост;Текст;Реакции;Фото\n' +
rows.map(r => r.map(escapeCSV).join(';')).join('\n');
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'telegram_export_' + new Date().toISOString().slice(0,10) + '.csv';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
console.log('Файл скачан: ' + a.download);
})();
4. Сформированный файл выглядит следующим образом
К нему вы можете добавлять (собирать) все файлы если у вас более 1000 постов.
А после чего, уже корректировать и готовить к импорту на сайт WordPress.

Посты из телеграма можно грузить на свой сайт через плагин - но если не много постов - плагин сложноват и есть ограничения (можно купить у меня https://zaplata.ru/site/plagin-wordpress-automatic)
Инструкция к нему: https://zaplata.ru/forum/manual/telegram-wordpress-wordpress-automatic-plugin
Если нужно наоборот с сайта в группу Телеграм то вот инструкция:
https://zaplata.ru/forum/manual/avtopublikacziya-statej-iz-wordpress-v-telegram
выходит ошибка
Uncaught SyntaxError: Unexpected token ';'
Обновил код