Как автоматизировать Pinterest: полное руководство по Python API

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Разработчики, желающие изучить интеграцию с API Pinterest с помощью Python
  • Маркетологи и специалисты по социальным медиа, стремящиеся автоматизировать свои процессы на Pinterest
  • Студенты и начинающие специалисты в области программирования, интересующиеся применением Python для анализа данных и автоматизации

    Python в сочетании с API Pinterest открывает настоящую сокровищницу возможностей для разработчиков и маркетологов. Миллионы людей используют Pinterest для поиска идей, но лишь единицы знают, как программно управлять этой платформой. Автоматизация создания пинов, управление досками и извлечение аналитических данных – всё это можно реализовать с помощью нескольких строк кода на Python. В этом пошаговом руководстве я расскажу, как превратить рутинные задачи на Pinterest в элегантные автоматизированные процессы, экономящие часы вашего времени. 🐍📌

Хотите овладеть навыками работы с различными API через Python? Программа Обучение Python-разработке от Skypro включает модули по интеграции с веб-сервисами, работе с REST API и созданию автоматизированных решений. Вы не только научитесь работать с Pinterest API, но и сможете создавать многофункциональные веб-приложения и инструменты аналитики для любых платформ. Получите практические навыки, востребованные на рынке прямо сейчас!

Настройка API Pinterest и подготовка среды Python

Перед тем как начать работу с API Pinterest, необходимо правильно настроить окружение и получить доступ к API. Этот процесс включает регистрацию приложения и установку необходимых библиотек Python.

Первым шагом создайте аккаунт разработчика Pinterest, если у вас его еще нет. Посетите developers.pinterest.com и войдите, используя свои учетные данные Pinterest. После авторизации перейдите в раздел "Apps" и создайте новое приложение, указав название, описание и URL для перенаправления.

После создания приложения вы получите Client ID и Client Secret – эти данные необходимы для авторизации вашего приложения. Сохраните их в безопасном месте, они понадобятся для настройки аутентификации.

Теперь подготовим среду Python для работы с API Pinterest. Рекомендую использовать виртуальное окружение для изоляции зависимостей проекта:

Bash
Скопировать код
# Создание виртуального окружения
python -m venv pinterest_env

# Активация окружения
# На Windows:
pinterest_env\Scripts\activate
# На macOS/Linux:
source pinterest_env/bin/activate

Установим необходимые библиотеки для работы с API Pinterest:

Bash
Скопировать код
pip install requests oauthlib requests-oauthlib python-dotenv

Для удобства управления конфиденциальными данными создадим файл .env в корневом каталоге проекта:

Bash
Скопировать код
# Содержимое файла .env
PINTEREST_CLIENT_ID=ваш_client_id
PINTEREST_CLIENT_SECRET=ваш_client_secret
PINTEREST_REDIRECT_URI=ваш_redirect_uri

Алексей Воронин, технический директор продуктовой компании Когда наша команда впервые столкнулась с необходимостью интеграции с Pinterest API, мы потратили почти неделю на настройку среды и отладку авторизации. Главная ошибка заключалась в неправильной конфигурации redirect URI. Мы указали localhost в настройках приложения, но забыли включить порт. В итоге авторизация постоянно проваливалась с загадочными ошибками. После того как мы выставили точный URL с портом (http://localhost:8000/callback/) и такой же использовали в коде, всё заработало мгновенно. Сейчас настройка занимает у нас не больше 15 минут. Совет новичкам: всегда проверяйте точное соответствие redirect URI в настройках приложения и в вашем коде.

Вот сравнение популярных библиотек для работы с Pinterest API:

Библиотека Преимущества Недостатки Рекомендуется для
requests + oauthlib Гибкость, полный контроль Больше кода для базовых операций Опытных разработчиков
python-pinterest Простой синтаксис, готовые методы Ограниченная функциональность для сложных операций Новичков, быстрого прототипирования
pinterest-api-sdk Полный набор функций, документация Может быть избыточной для простых задач Профессиональных проектов
py3pin Объектно-ориентированный подход Может быть несовместима с новейшими изменениями API Средних проектов с типовыми задачами

Для этого руководства мы будем использовать связку requests + oauthlib, так как она обеспечивает максимальную гибкость и контроль над процессом взаимодействия с API. 💻

Пошаговый план для смены профессии

Аутентификация и получение доступа к API Pinterest

Pinterest использует OAuth 2.0 для аутентификации приложений. Этот протокол обеспечивает безопасный делегированный доступ к ресурсам пользователя без передачи пароля вашему приложению. Давайте реализуем процесс аутентификации шаг за шагом.

Сначала создадим базовый файл для конфигурации OAuth:

Python
Скопировать код
import os
from dotenv import load_dotenv
from requests_oauthlib import OAuth2Session
from oauthlib.oauth2 import BackendApplicationClient

load_dotenv()

# Загрузка конфигурации из .env файла
CLIENT_ID = os.getenv('PINTEREST_CLIENT_ID')
CLIENT_SECRET = os.getenv('PINTEREST_CLIENT_SECRET')
REDIRECT_URI = os.getenv('PINTEREST_REDIRECT_URI')

# Определение разрешений (скоупов)
SCOPE = ['boards:read', 'pins:read', 'pins:write', 'user_accounts:read']

# Конфигурация OAuth сессии
oauth = OAuth2Session(
CLIENT_ID,
redirect_uri=REDIRECT_URI,
scope=SCOPE
)

# URL для авторизации и токена
AUTH_URL = 'https://www.pinterest.com/oauth/'
TOKEN_URL = 'https://api.pinterest.com/v5/oauth/token'

Теперь реализуем функцию для получения URL авторизации:

Python
Скопировать код
def get_authorization_url():
authorization_url, state = oauth.authorization_url(AUTH_URL)
print(f"Перейдите по следующей ссылке для авторизации: {authorization_url}")
return authorization_url, state

После того, как пользователь авторизует приложение, Pinterest перенаправит его на указанный redirect_uri с кодом авторизации. Нам нужно этот код перехватить и обменять на токен доступа:

Python
Скопировать код
def get_access_token(redirect_response):
# Полный URL после перенаправления
# Например: http://localhost:8000/callback/?code=123456789&state=abcdef
token = oauth.fetch_token(
TOKEN_URL,
authorization_response=redirect_response,
client_secret=CLIENT_SECRET
)
return token

Для простоты можно создать небольшой веб-сервер, который будет ловить callback:

Python
Скопировать код
from http.server import HTTPServer, BaseHTTPRequestHandler
import webbrowser
from urllib.parse import parse_qs, urlparse
import json

class CallbackHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()

# Получаем callback с кодом
full_callback_url = f"{REDIRECT_URI}{self.path}"
token = get_access_token(full_callback_url)

# Сохраняем токен
with open('token.json', 'w') as f:
json.dump(token, f)

# Отображаем успешное сообщение
self.wfile.write(b"Авторизация успешна! Можете закрыть это окно.")

# Останавливаем сервер
server.shutdown()

def start_auth_flow():
# Получаем URL авторизации
auth_url, _ = get_authorization_url()

# Открываем браузер для авторизации
webbrowser.open(auth_url)

# Запускаем локальный сервер для перехвата callback
global server
server = HTTPServer(('localhost', 8000), CallbackHandler)
print("Ожидаем ответа от Pinterest...")
server.serve_forever()

После успешной авторизации вы получите токен доступа, который нужно использовать для всех последующих запросов к API Pinterest. Давайте создадим функцию, которая будет использовать этот токен для создания авторизованных запросов:

Python
Скопировать код
def create_pinterest_client():
try:
# Пытаемся загрузить существующий токен
with open('token.json', 'r') as f:
token = json.load(f)

client = OAuth2Session(CLIENT_ID, token=token)
return client
except FileNotFoundError:
# Если токена нет, запускаем процесс авторизации
start_auth_flow()
return create_pinterest_client()

Различные типы авторизации и их применение для Pinterest API:

Тип авторизации Описание Применение Срок жизни токена
Authorization Code Стандартный OAuth 2.0 flow с redirect_uri Приложения с бэкендом 60 дней с возможностью обновления
PKCE (Proof Key for Code Exchange) Более безопасный вариант для клиентских приложений Мобильные и SPA приложения 60 дней с возможностью обновления
Refresh Token Используется для обновления истёкшего access_token Долгосрочные интеграции Бессрочный (до отзыва)
Client Credentials Серверная авторизация без участия пользователя Бизнес-аккаунты, собственные данные От нескольких часов до 24 часов

Мария Светлова, руководитель отдела digital-маркетинга Наше агентство обслуживает более 30 клиентов, активно использующих Pinterest для продвижения. Раньше наши SMM-специалисты тратили до 15 часов в неделю на рутинную публикацию пинов и анализ результатов. Когда мы внедрили Python-скрипты для работы с API, первой проблемой стала постоянная необходимость обновления токенов доступа. Пока мы не реализовали автоматическое обновление refresh-токенов, приходилось каждые 30 дней проходить авторизацию заново для каждого аккаунта. Это было настоящей головной болью. Решением стал модуль автоматического обновления токенов и хранение их в зашифрованной базе данных. Теперь наши скрипты работают непрерывно, а специалисты сконцентрировались на стратегии и контенте, что увеличило эффективность команды на 40%. Ключевой совет: сразу продумывайте механизм управления токенами для долгосрочных интеграций.

Основные операции с пинами и досками через Python

После успешной настройки авторизации можно приступать к основным операциям с Pinterest API. Рассмотрим наиболее востребованные действия: получение информации о досках, создание пинов, управление ими и работу с комментариями. 📊

Начнем с получения списка досок пользователя:

Python
Скопировать код
def get_user_boards():
client = create_pinterest_client()
response = client.get('https://api.pinterest.com/v5/boards')

if response.status_code == 200:
return response.json()
else:
print(f"Ошибка при получении досок: {response.status_code}")
print(response.text)
return None

Теперь реализуем создание новой доски:

Python
Скопировать код
def create_board(name, description=''):
client = create_pinterest_client()
data = {
'name': name,
'description': description
}

response = client.post(
'https://api.pinterest.com/v5/boards',
json=data
)

if response.status_code == 201:
return response.json()
else:
print(f"Ошибка при создании доски: {response.status_code}")
print(response.text)
return None

Для создания нового пина необходимо загрузить изображение и привязать его к доске:

Python
Скопировать код
def create_pin(board_id, title, description, image_path, link=None):
client = create_pinterest_client()

# Сначала загрузим изображение
with open(image_path, 'rb') as image_file:
files = {'image': image_file}
data = {
'board_id': board_id,
'title': title,
'description': description
}

if link:
data['link'] = link

response = client.post(
'https://api.pinterest.com/v5/pins',
data=data,
files=files
)

if response.status_code == 201:
return response.json()
else:
print(f"Ошибка при создании пина: {response.status_code}")
print(response.text)
return None

Для получения аналитики по конкретному пину:

Python
Скопировать код
def get_pin_analytics(pin_id, start_date, end_date, metrics=None):
client = create_pinterest_client()

if metrics is None:
metrics = ['IMPRESSION', 'PIN_CLICK', 'SAVE']

params = {
'pin_id': pin_id,
'start_date': start_date,
'end_date': end_date,
'metrics': ','.join(metrics)
}

response = client.get(
'https://api.pinterest.com/v5/pins/analytics',
params=params
)

if response.status_code == 200:
return response.json()
else:
print(f"Ошибка при получении аналитики: {response.status_code}")
print(response.text)
return None

А теперь реализуем обновление существующего пина:

Python
Скопировать код
def update_pin(pin_id, title=None, description=None, board_id=None, link=None):
client = create_pinterest_client()
data = {}

# Добавляем в запрос только те поля, которые нужно обновить
if title is not None:
data['title'] = title
if description is not None:
data['description'] = description
if board_id is not None:
data['board_id'] = board_id
if link is not None:
data['link'] = link

# Если нечего обновлять, выходим
if not data:
return None

response = client.patch(
f'https://api.pinterest.com/v5/pins/{pin_id}',
json=data
)

if response.status_code == 200:
return response.json()
else:
print(f"Ошибка при обновлении пина: {response.status_code}")
print(response.text)
return None

Важно также уметь удалять пины, когда они больше не нужны:

Python
Скопировать код
def delete_pin(pin_id):
client = create_pinterest_client()

response = client.delete(
f'https://api.pinterest.com/v5/pins/{pin_id}'
)

if response.status_code == 204:
return True
else:
print(f"Ошибка при удалении пина: {response.status_code}")
print(response.text)
return False

Вот полезный набор функций для работы с пинами и досками через Python API Pinterest:

  • Получение данных о пользователе – позволяет получить информацию о текущем аутентифицированном пользователе
  • Получение списка досок – возвращает все доски пользователя с подробной информацией
  • Создание доски – позволяет программно создавать новые доски
  • Получение пинов доски – извлекает все пины, прикрепленные к конкретной доске
  • Создание пина – публикует новый пин с изображением и описанием
  • Обновление пина – изменяет существующий пин (заголовок, описание, доску)
  • Удаление пина – удаляет пин из Pinterest
  • Получение аналитики – извлекает статистические данные о взаимодействии с пинами
  • Поиск пинов – находит пины по ключевым словам и фильтрам

Автоматизация публикаций контента на Pinterest

Автоматизация публикаций — одна из самых востребованных задач при работе с Pinterest API. Создадим несколько полезных сценариев для автоматического создания и планирования пинов. 🤖

Начнем с функции массовой загрузки пинов из локальной директории:

Python
Скопировать код
import os
import time
from datetime import datetime

def bulk_upload_pins(board_id, images_dir, title_template, description_template, link_template=None, delay=5):
"""
Загружает все изображения из указанной директории как пины

:param board_id: ID доски для публикации
:param images_dir: Путь к директории с изображениями
:param title_template: Шаблон заголовка (например, "Продукт {index}: {filename}")
:param description_template: Шаблон описания
:param link_template: Шаблон ссылки (если нужен)
:param delay: Задержка между загрузками в секундах
:return: Список созданных пинов
"""
created_pins = []

# Получаем список всех изображений в директории
image_files = [f for f in os.listdir(images_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))]

for index, image_file in enumerate(image_files, 1):
image_path = os.path.join(images_dir, image_file)

# Формируем заголовок и описание, заменяя переменные в шаблоне
title = title_template.format(
index=index,
filename=os.path.splitext(image_file)[0],
date=datetime.now().strftime('%Y-%m-%d')
)

description = description_template.format(
index=index,
filename=os.path.splitext(image_file)[0],
date=datetime.now().strftime('%Y-%m-%d')
)

# Формируем ссылку, если задан шаблон
link = None
if link_template:
link = link_template.format(
index=index,
filename=os.path.splitext(image_file)[0],
date=datetime.now().strftime('%Y-%m-%d')
)

# Создаем пин
pin = create_pin(board_id, title, description, image_path, link)

if pin:
created_pins.append(pin)
print(f"Создан пин {index}/{len(image_files)}: {title}")

# Делаем паузу между запросами, чтобы не превысить лимиты API
if index < len(image_files):
print(f"Ожидаем {delay} секунд перед следующей загрузкой...")
time.sleep(delay)

print(f"Загрузка завершена. Создано {len(created_pins)} пинов из {len(image_files)} изображений.")
return created_pins

Теперь создадим функцию для планирования публикаций по расписанию:

Python
Скопировать код
import schedule
import threading
import time
from datetime import datetime, timedelta

def schedule_pin_publishing(board_id, image_path, title, description, link=None, publish_time=None):
"""
Планирует публикацию пина на определенное время

:param board_id: ID доски
:param image_path: Путь к изображению
:param title: Заголовок пина
:param description: Описание пина
:param link: Ссылка (опционально)
:param publish_time: Время публикации в формате "HH:MM" (если None, то через 1 час)
:return: None
"""
def publish_job():
pin = create_pin(board_id, title, description, image_path, link)
if pin:
print(f"Пин успешно опубликован в {datetime.now().strftime('%H:%M:%S')}")
print(f"ID пина: {pin.get('id')}")
else:
print(f"Ошибка при публикации пина в {datetime.now().strftime('%H:%M:%S')}")

if publish_time:
# Запланировать на конкретное время
schedule.every().day.at(publish_time).do(publish_job)
print(f"Публикация запланирована на {publish_time}")
else:
# Запланировать через час
future_time = datetime.now() + timedelta(hours=1)
schedule_time = future_time.strftime("%H:%M")
schedule.every().day.at(schedule_time).do(publish_job)
print(f"Публикация запланирована на {schedule_time}")

# Запустить планировщик в отдельном потоке
def run_scheduler():
while True:
schedule.run_pending()
time.sleep(1)

scheduler_thread = threading.Thread(target=run_scheduler)
scheduler_thread.daemon = True
scheduler_thread.start()

Для автоматизации процесса публикации на основе контента из других источников (например, RSS-лент) создадим специальный скрипт:

Python
Скопировать код
import feedparser
import requests
from io import BytesIO
from PIL import Image
import tempfile
import os

def publish_pins_from_rss(board_id, rss_url, max_pins=5, image_min_width=600):
"""
Создает пины на основе контента из RSS-ленты

:param board_id: ID доски Pinterest
:param rss_url: URL RSS-ленты
:param max_pins: Максимальное количество пинов для публикации
:param image_min_width: Минимальная ширина изображения в пикселях
:return: Список созданных пинов
"""
# Парсим RSS-ленту
feed = feedparser.parse(rss_url)

created_pins = []
count = 0

for entry in feed.entries:
if count >= max_pins:
break

title = entry.title
description = entry.summary if hasattr(entry, 'summary') else ""
link = entry.link

# Ищем изображение в записи
image_url = None

# Проверяем наличие медиа-вложений
if hasattr(entry, 'media_content'):
for media in entry.media_content:
if 'url' in media:
image_url = media['url']
break

# Альтернативный поиск изображения в тексте записи
if not image_url and hasattr(entry, 'content'):
from bs4 import BeautifulSoup
for content in entry.content:
soup = BeautifulSoup(content.value, 'html.parser')
images = soup.find_all('img')
if images:
image_url = images[0].get('src')
break

if not image_url:
print(f"Пропуск записи '{title}': изображение не найдено")
continue

# Скачиваем и проверяем размер изображения
try:
response = requests.get(image_url)
img = Image.open(BytesIO(response.content))

# Проверка размера изображения
if img.width < image_min_width:
print(f"Пропуск записи '{title}': изображение слишком маленькое ({img.width}x{img.height})")
continue

# Сохраняем изображение во временный файл
with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as temp_file:
temp_path = temp_file.name
img.save(temp_path)

# Создаем пин
pin = create_pin(board_id, title, description[:500], temp_path, link)

# Удаляем временный файл
os.unlink(temp_path)

if pin:
created_pins.append(pin)
count += 1
print(f"Создан пин {count}: '{title}'")

except Exception as e:
print(f"Ошибка при обработке записи '{title}': {str(e)}")

print(f"Публикация из RSS завершена. Создано {len(created_pins)} пинов.")
return created_pins

Сравнение методов автоматизации публикаций в Pinterest:

Метод Преимущества Недостатки Лучшее применение
Массовая загрузка из локальной директории Полный контроль над контентом, быстрая настройка Требует предварительной подготовки файлов Каталоги продуктов, фотоальбомы
Планирование по расписанию Оптимальное время публикации, равномерность контента Требует постоянно работающего сервера Контент-планы, регулярные публикации
Автопубликация из RSS/API Полностью автоматический процесс, актуальный контент Зависимость от внешних источников, меньший контроль Новостные сайты, блоги, интеграция с другими платформами
Кросспостинг из других соцсетей Единый контент-план для всех платформ Может не учитывать специфику Pinterest Омниканальный маркетинг, персональные бренды

Анализ данных и создание отчётов с помощью Python API

Одно из ключевых преимуществ использования Python для работы с Pinterest API — возможность создания настраиваемых аналитических отчетов. Pinterest предоставляет много данных о производительности контента, но с помощью Python вы можете создать более глубокие и персонализированные отчеты. 📈

Начнем с базовой функции для сбора аналитики по аккаунту:

Python
Скопировать код
from datetime import datetime, timedelta
import pandas as pd
import matplotlib.pyplot as plt

def get_account_analytics(start_date, end_date, metrics=None):
"""
Получает аналитические данные для аккаунта за указанный период

:param start_date: Начальная дата в формате "YYYY-MM-DD"
:param end_date: Конечная дата в формате "YYYY-MM-DD"
:param metrics: Список метрик для запроса (по умолчанию основные метрики)
:return: Словарь с аналитическими данными
"""
client = create_pinterest_client()

if metrics is None:
metrics = ['IMPRESSION', 'PIN_CLICK', 'OUTBOUND_CLICK', 'SAVE', 'ENGAGEMENT', 'ENGAGEMENT_RATE']

params = {
'start_date': start_date,
'end_date': end_date,
'metrics': ','.join(metrics),
'granularity': 'DAY'
}

response = client.get(
'https://api.pinterest.com/v5/user_account/analytics',
params=params
)

if response.status_code == 200:
return response.json()
else:
print(f"Ошибка при получении аналитики аккаунта: {response.status_code}")
print(response.text)
return None

Теперь создадим функцию для получения и анализа производительности конкретных досок:

Python
Скопировать код
def get_boards_analytics(board_ids, start_date, end_date, metrics=None):
"""
Получает аналитические данные для нескольких досок

:param board_ids: Список ID досок
:param start_date: Начальная дата в формате "YYYY-MM-DD"
:param end_date: Конечная дата в формате "YYYY-MM-DD"
:param metrics: Список метрик для запроса
:return: Словарь с аналитическими данными по доскам
"""
client = create_pinterest_client()

if metrics is None:
metrics = ['IMPRESSION', 'PIN_CLICK', 'SAVE']

all_data = {}

for board_id in board_ids:
params = {
'board_id': board_id,
'start_date': start_date,
'end_date': end_date,
'metrics': ','.join(metrics)
}

response = client.get(
'https://api.pinterest.com/v5/boards/analytics',
params=params
)

if response.status_code == 200:
all_data[board_id] = response.json()
else:
print(f"Ошибка при получении аналитики для доски {board_id}: {response.status_code}")
print(response.text)

return all_data

Функция для создания визуального отчета о производительности аккаунта:

Python
Скопировать код
def create_account_performance_report(start_date, end_date, output_file='pinterest_report.html'):
"""
Создает HTML-отчет о производительности аккаунта Pinterest

:param start_date: Начальная дата в формате "YYYY-MM-DD"
:param end_date: Конечная дата в формате "YYYY-MM-DD"
:param output_file: Путь к выходному HTML-файлу
:return: None
"""
# Получаем аналитические данные
analytics = get_account_analytics(start_date, end_date)

if not analytics:
print("Не удалось получить аналитические данные")
return

# Преобразуем данные в DataFrame
data_rows = []

for item in analytics.get('items', []):
date = item.get('date')
metrics = item.get('metrics', {})

row = {'Дата': date}
for metric_name, metric_value in metrics.items():
row[metric_name] = metric_value

data_rows.append(row)

df = pd.DataFrame(data_rows)

# Преобразуем дату в datetime
df['Дата'] = pd.to_datetime(df['Дата'])
df = df.sort_values('Дата')

# Создаем графики
plt.figure(figsize=(12, 18))

# График просмотров
plt.subplot(3, 1, 1)
plt.plot(df['Дата'], df['IMPRESSION'], marker='o', linestyle='-')
plt.title('Просмотры по дням')
plt.grid(True)
plt.xticks(rotation=45)

# График кликов
plt.subplot(3, 1, 2)
plt.plot(df['Дата'], df['PIN_CLICK'], marker='s', linestyle='-', color='green')
plt.title('Клики по дням')
plt.grid(True)
plt.xticks(rotation=45)

# График сохранений
plt.subplot(3, 1, 3)
plt.plot(df['Дата'], df['SAVE'], marker='^', linestyle='-', color='red')
plt.title('Сохранения по дням')
plt.grid(True)
plt.xticks(rotation=45)

plt.tight_layout()

# Сохраняем график во временный файл
temp_image_path = 'temp_chart.png'
plt.savefig(temp_image_path)

# Создаем HTML-отчет
html_content = f"""
<!DOCTYPE html>
<html>
<head>
<title>Отчет Pinterest: {start_date} – {end_date}</title>
<style>
body {{ font-family: Arial, sans-serif; margin: 20px; }}
h1 {{ color: #E60023; }}
.summary {{ background-color: #f9f9f9; padding: 15px; border-radius: 5px; margin-bottom: 20px; }}
table {{ border-collapse: collapse; width: 100%; margin-top: 20px; }}
th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
th {{ background-color: #E60023; color: white; }}
tr:nth-child(even) {{ background-color: #f2f2f2; }}
.chart {{ width: 100%; margin-top: 30px; }}
</style>
</head>
<body>
<h1>Отчет о производительности Pinterest</h1>
<p>Период: {start_date} – {end_date}</p>

<div class="summary">
<h2>Сводка</h2>
<p>Всего просмотров: {df['IMPRESSION'].sum()}</p>
<p>Всего кликов: {df['PIN_CLICK'].sum()}</p>
<p>Всего сохранений: {df['SAVE'].sum()}</p>
<p>Средний коэффициент вовлеченности: {df['ENGAGEMENT_RATE'].mean():.2f}%</p>
</div>

<div class="chart">
<h2>Динамика показателей</h2>
<img src="data:image/png;base64,{encode_image_to_base64(temp_image_path)}" width="100%">
</div>

<h2>Детальные данные</h2>
{df.to_html(index=False)}
</body>
</html>
"""

# Записываем HTML в файл
with open(output_file, 'w', encoding='utf-8') as f:
f.write(html_content)

# Удаляем временный файл с графиком
os.remove(temp_image_path)

print(f"Отчет сохранен в файле: {output_file}")

Для завершения нам нужна вспомогательная функция для кодирования изображения в base64:

Python
Скопировать код
import base64

def encode_image_to_base64(image_path):
"""
Кодирует изображение в строку base64 для встраивания в HTML

:param image_path: Путь к изображению
:return: Строка base64
"""
with open(image_path, 'rb') as image_file:
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
return encoded_string

Создадим функцию для анализа эффективности контента и определения лучших пинов:

Python
Скопировать код
def analyze_top_performing_pins(board_id=None, limit=10, time_range=30):
"""
Анализирует и выявляет наиболее эффективные пины

:param board_id: ID доски (если None, то для всего аккаунта)
:param limit: Количество пинов для анализа
:param time_range: Временной диапазон в днях
:return: DataFrame с лучшими пинами
"""
client = create_pinterest_client()

# Вычисляем даты
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() – timedelta(days=time_range)).strftime('%Y-%m-%d')

# Получаем список пинов
params = {
'page_size': 100, # Максимальный размер страницы
}

if board_id:
endpoint = f'https://api.pinterest.com/v5/boards/{board_id}/pins'
else:
endpoint = 'https://api.pinterest.com/v5/pins'

response = client.get(endpoint, params=params)

if response.status_code != 200:
print(f"Ошибка при получении пинов: {response.status_code}")
print(response.text)
return None

pins_data = response.json()
pins = pins_data.get('items', [])

# Получаем аналитику для каждого пина
pins_analytics = []

for pin in pins:
pin_id = pin.get('id')
analytics = get_pin_analytics(pin_id, start_date, end_date)

if analytics and 'items' in analytics:
# Суммируем метрики за весь период
total_impressions = sum(item.get('metrics', {}).get('IMPRESSION', 0) for item in analytics['items'])
total_clicks = sum(item.get('metrics', {}).get('PIN_CLICK', 0) for item in analytics['items'])
total_saves = sum(item.get('metrics', {}).get('SAVE', 0) for item in analytics['items'])

# Вычисляем CTR (Click-Through Rate)
ctr = (total_clicks / total_impressions * 100) if total_impressions > 0 else 0

# Вычисляем коэффициент сохранений
save_rate = (total_saves / total_impressions * 100) if total_impressions > 0 else 0

pins_analytics.append({
'pin_id': pin_id,
'title': pin.get('title', ''),
'link': pin.get('link', ''),
'created_at': pin.get('created_at', ''),
'impressions': total_impressions,
'clicks': total_clicks,
'saves': total_saves,
'ctr': ctr,
'save_rate': save_rate,
'engagement': total_clicks + total_saves,
})

# Создаем DataFrame и сортируем по вовлеченности
df = pd.DataFrame(pins_analytics)
df = df.sort_values('engagement', ascending=False).head(limit)

return df

Список наиболее полезных аналитических метрик, доступных через Pinterest API:

  • IMPRESSION – количество показов пина или контента доски
  • PIN_CLICK – клики на пин для просмотра его увеличенной версии
  • OUTBOUND_CLICK – клики, которые ведут с Pinterest на внешний сайт
  • SAVE – количество сохранений пина пользователями
  • VIDEOV50WATCH_TIME – время просмотра видео (для видеопинов)
  • QUARTILE95PERCENT_VIEW – процент видео, которое просмотрели до конца
  • TOTALVIEWTIME – общее время просмотра контента
  • ENGAGEMENT – суммарный показатель вовлеченности
  • ENGAGEMENT_RATE – коэффициент вовлеченности относительно показов

Работа с Pinterest API через Python – мощный инструмент для автоматизации и аналитики ваших маркетинговых усилий. Использование описанных методов позволит вам не только сэкономить время на рутинных операциях, но и получить уникальные инсайты о вашей аудитории. Главное помнить о лимитах API и грамотно организовать работу с токенами авторизации. Начните с простых скриптов, постепенно наращивая функциональность, и скоро вы удивитесь, насколько эффективным может быть управление Pinterest-аккаунтом с помощью Python.

Загрузка...