21.03.2026

Перенос канала из телеграм на сайт полностью с фото? Как скачать все посты с Telegram канала

Как перенести канал (группу) из Telegram на сайт WordPress с фото.

Если необходима помощь в переносе канала на сайт, либо полностью готовый сайт (клон вашего канала Telegram) - пишите мне.

Раскрыть контакты

 

1. Для начала нам нужно скачать все посты с канала.

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

формируем JSON файл
формируем html файл.

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.

игорь
игорь

выходит ошибка
Uncaught SyntaxError: Unexpected token ';'

guest
Закрыть меню