Pinterest — не просто соцсеть для рецептов и идей. Это мощная визуальная поисковая система, которая может приводить целевой трафик на статьи, если правильно «подружить» её с сайтом. В этом руководстве я покажу, как сделать так, чтобы Pinterest сам находил новые статьи, подхватывал картинки и описания и создавал пины — без ручного копирования.

Что нужно:

  • Сайт на любом движке (можно просто HTML-файлы)

  • Доступ к редактированию кода страниц

  • Node.js на сервере (или локально, чтобы генерировать RSS и заливать на сервер)

  • Бизнес-аккаунт Pinterest

Весь код, который я даю, написан на чистом JavaScript (Node.js).

Шаг 1. Подтверждаем владение сайтом в Pinterest

Pinterest должен знать, что вы хозяин домена. Для этого он выдаёт специальный метатег.

  1. Зайдите в Pinterest Business Hub → «Подтвердить сайт».

  2. Выберите способ «Метатег».

  3. Скопируйте тег вида:

    <meta name="p:domain_verify" content="12ac6ff1eaa70a3386sg439fda58bbb6"/>
  4. Вставьте этот тег в <head> главной страницы вашего сайта.

  5. Нажмите «Подтвердить» в Pinterest.

После этого Pinterest начнёт сканировать ваш сайт в поиске страниц, размеченных для Rich Pins.

Шаг 2. Добавляем метатеги для каждой статьи

Теперь каждую страницу со статьёй нужно «разметить» — указать Pinterest, что это статья, какое у неё описание, картинка и дата.

Вставьте в <head> каждой страницы статьи следующие теги:

<!-- Указываем, что это статья -->
<meta name="is_article" content="true">

<!-- Описание, которое Pinterest покажет под пином (150–200 символов, интригующее) -->
<meta name="pinterest_description" content="Задумывались ли вы, почему одни сайты удерживают внимание с первых секунд, а другие хочется закрыть? Всё дело в первом впечатлении. Узнайте, как выстроить интерфейс, чтобы снизить тревожность и завоевать доверие.">

<!-- Прямая ссылка на картинку для пина (вертикальная, 1000×1500, яркая) -->
<meta name="pinterest_image" content="https://ваш-сайт/images/article-cover.webp">

<!-- Дата публикации в формате ISO 8601 с часовым поясом -->
<meta name="article_published_at" content="2026-04-03T12:00:00+03:00">

Важные моменты:

  • Картинка должна быть доступна по HTTPS и весить не больше 2 МБ.

  • Если не указать pinterest_image, Pinterest возьмёт первое изображение на странице — часто это логотип или иконка.

  • Описание не должно быть слишком длинным (обрежется).

Шаг 3. Генерируем RSS-ленту со статьями

Pinterest умеет читать RSS-ленту. Если вы отдадите ему ссылку на rss.xml, он сам будет периодически проверять её и создавать пины для новых записей.

Я написал скрипт на Node.js, который:

  • обходит все HTML-файлы сайта,

  • находит те, где есть <meta name="is_article">,

  • вытаскивает из них заголовок, описание, картинку и дату,

  • создаёт файл rss.xml.

Скопируйте код ниже и сохраните как generate-rss.js (перед этим замените ВАШ_САЙТ и другие настройки).

(Создайте в корневой папке вашего проекта папку scripts (если её нет) и поместите туда файл generate-rss.js)

import fs from 'node:fs/promises';
import path from 'node:path';
import * as cheerio from 'cheerio';

// ================== НАСТРОЙКИ (ПРОПИШИТЕ СВОИ) ==================

// Базовый URL вашего сайта (без слеша в конце)
const BASE_URL = 'https://ВАШ_САЙТ.ru';

// Папка, где лежат готовые HTML-файлы сайта (обычно dist или public)
// Скрипт запускается из корня проекта, где находится эта папка
const ROOT_DIR = path.resolve(process.cwd(), 'dist');

// Куда сохранять RSS-файл (обычно в ту же папку, чтобы он был доступен по /rss.xml)
const OUTPUT_RSS_PATH = path.join(ROOT_DIR, 'rss.xml');

// Название и описание RSS-канала (видны в Pinterest)
const CHANNEL_TITLE = 'Название вашего блога';
const CHANNEL_DESCRIPTION = 'Описание: статьи о разработке, SEO, дизайне';

// ================== ДАЛЬШЕ КОД НЕ ТРОГАЕМ ==================

function escapeXml(value = '') {
  return value
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&apos;');
}

function getMimeTypeByExt(urlOrPath = '') {
  const ext = urlOrPath.split('.').pop()?.toLowerCase();
  switch (ext) {
    case 'jpg': case 'jpeg': return 'image/jpeg';
    case 'png': return 'image/png';
    case 'webp': return 'image/webp';
    case 'gif': return 'image/gif';
    default: return 'image/*';
  }
}

function buildArticleUrl(filePath) {
  const relativePath = path.relative(ROOT_DIR, filePath).replace(/\\/g, '/');
  return `${BASE_URL}/${relativePath}`;
}

function buildImageUrl(src) {
  if (!src) return '';
  if (/^https?:\/\//i.test(src)) return src;
  if (src.startsWith('/')) return `${BASE_URL}${src}`;
  return `${BASE_URL}/${src}`;
}

async function collectHtmlFiles(dir) {
  const entries = await fs.readdir(dir, { withFileTypes: true });
  const files = [];
  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);
    if (entry.isDirectory()) {
      const nested = await collectHtmlFiles(fullPath);
      files.push(...nested);
    } else if (entry.isFile() && entry.name.endsWith('.html')) {
      files.push(fullPath);
    }
  }
  return files;
}

async function parseArticle(filePath) {
  const content = await fs.readFile(filePath, 'utf8');
  const $ = cheerio.load(content);

  const isArticle = $('meta[name="is_article"]').length > 0;
  if (!isArticle) return null;

  const title = $('h1').first().text().trim() || 'Без заголовка';
  const pinterestDescription = $('meta[name="pinterest_description"]').attr('content')?.trim() || '';
  const pinterestImg = $('meta[name="pinterest_image"]').attr('content');
  let firstImgSrc = $('img').first().attr('src') || '';
  if (firstImgSrc.endsWith('.svg')) firstImgSrc = '';
  const imageUrl = buildImageUrl(pinterestImg || firstImgSrc);

  let pubDate;
  const articleDateMeta = $('meta[name="article_published_at"]').attr('content');
  if (articleDateMeta) {
    const parsed = new Date(articleDateMeta);
    if (!isNaN(parsed.getTime())) pubDate = parsed;
  }
  if (!pubDate) {
    const stat = await fs.stat(filePath);
    pubDate = stat.mtime;
  }

  return { title, pinterestDescription, url: buildArticleUrl(filePath), imageUrl, pubDate };
}

function buildRssXml(items) {
  const itemsXml = items.map(item => {
    const enclosure = item.imageUrl ? `\n        <enclosure url="${escapeXml(item.imageUrl)}" type="${getMimeTypeByExt(item.imageUrl)}" />` : '';
    return `
    <item>
        <title>${escapeXml(item.title)}</title>
        <link>${escapeXml(item.url)}</link>
        <description><![CDATA[${item.pinterestDescription}]]></description>
        <pubDate>${item.pubDate.toUTCString()}</pubDate>${enclosure}
    </item>`;
  }).join('\n');

  return `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
    <title>${escapeXml(CHANNEL_TITLE)}</title>
    <link>${escapeXml(BASE_URL)}</link>
    <description>${escapeXml(CHANNEL_DESCRIPTION)}</description>${itemsXml}
</channel>
</rss>`;
}

async function main() {
  console.log('🔍 Поиск HTML в:', ROOT_DIR);
  const htmlFiles = await collectHtmlFiles(ROOT_DIR);
  console.log(`📄 Найдено HTML: ${htmlFiles.length}`);

  const articles = [];
  for (const filePath of htmlFiles) {
    const article = await parseArticle(filePath);
    if (article) articles.push(article);
  }
  console.log(`📰 Статей с is_article: ${articles.length}`);

  if (!articles.length) {
    console.warn('⚠️ Нет статей. RSS не создан.');
    return;
  }

  articles.sort((a, b) => b.pubDate - a.pubDate);
  const rssXml = buildRssXml(articles);
  await fs.writeFile(OUTPUT_RSS_PATH, rssXml, 'utf8');
  console.log(`✅ RSS сохранён: ${OUTPUT_RSS_PATH}`);
}

main().catch(err => {
  console.error('❌ Ошибка:', err);
  process.exit(1);
});

Как использовать:

  1. Установите Node.js на сервер (или на свой компьютер, если сможете заливать сгенерированный rss.xml на сервер вручную).

  2. Установите зависимости: npm install cheerio

  3. Замените в коде ВАШ_САЙТROOT_DIR (путь к папке с HTML) и настройки канала.

  4. Запустите скрипт: node generate-rss.js

  5. Убедитесь, что по адресу https://ваш-сайт/rss.xml открывается XML-файл со списком статей.

Если вы не можете запускать Node.js на сервере, сгенерируйте RSS локально и загрузите файл через FTP в корень сайта. Главное, чтобы он был доступен по постоянной ссылке.

Шаг 4. Отдаём RSS Pinterest

Теперь нужно «скормить» Pinterest ссылку на RSS.

  1. В бизнес-аккаунте Pinterest перейдите в раздел «Создать» → «Rich Pins» (или «Каналы» → «Применить»).

  2. Выберите тип «RSS-канал».

  3. Вставьте адрес вашего RSS: https://ваш-сайт/rss.xml

  4. Нажмите «Подтвердить» и «Применить».

Pinterest проверит канал и начнёт его периодически сканировать. Обычно первые пины появляются в течение 24 часов.

Шаг 5. Как это работает в автоматическом режиме

После настройки всё происходит без вашего участия:

  1. Вы публикуете новую статью на сайте (добавляете HTML-файл с метатегами из шага 2).

  2. Запускаете скрипт generate-rss.js — он обновляет rss.xml.

  3. Pinterest через некоторое время (обычно 6–24 часа) считывает обновлённый RSS.

  4. Для каждой новой записи Pinterest создаёт пин:

  • заголовок берётся из <title> статьи или из заголовка RSS,

  • описание — из pinterest_description,

  • картинка — из pinterest_image,

  • ссылка ведёт на статью.

Если вы хотите полную автоматизацию, добавьте вызов скрипта после публикации статьи (например, через хук в CI/CD или cron). Но даже если вы будете запускать его вручную раз в день — это быстрее, чем создавать десятки пинов руками.

Итог

Такая связка (метатеги + RSS + Pinterest) превращает ваш блог в источник автоматического трафика. Вы один раз настраиваете разметку и генератор RSS, а Pinterest сам забирает новые статьи и создаёт пины.

Попробуйте — и вы увидите, как старые статьи получают вторую жизнь.