Как автоматизировать Pinterest: полное руководство по Python API
Для кого эта статья:
- Разработчики, желающие изучить интеграцию с 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. Рекомендую использовать виртуальное окружение для изоляции зависимостей проекта:
# Создание виртуального окружения
python -m venv pinterest_env
# Активация окружения
# На Windows:
pinterest_env\Scripts\activate
# На macOS/Linux:
source pinterest_env/bin/activate
Установим необходимые библиотеки для работы с API Pinterest:
pip install requests oauthlib requests-oauthlib python-dotenv
Для удобства управления конфиденциальными данными создадим файл .env в корневом каталоге проекта:
# Содержимое файла .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:
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 авторизации:
def get_authorization_url():
authorization_url, state = oauth.authorization_url(AUTH_URL)
print(f"Перейдите по следующей ссылке для авторизации: {authorization_url}")
return authorization_url, state
После того, как пользователь авторизует приложение, Pinterest перенаправит его на указанный redirect_uri с кодом авторизации. Нам нужно этот код перехватить и обменять на токен доступа:
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:
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. Давайте создадим функцию, которая будет использовать этот токен для создания авторизованных запросов:
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. Рассмотрим наиболее востребованные действия: получение информации о досках, создание пинов, управление ими и работу с комментариями. 📊
Начнем с получения списка досок пользователя:
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
Теперь реализуем создание новой доски:
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
Для создания нового пина необходимо загрузить изображение и привязать его к доске:
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
Для получения аналитики по конкретному пину:
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
А теперь реализуем обновление существующего пина:
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
Важно также уметь удалять пины, когда они больше не нужны:
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. Создадим несколько полезных сценариев для автоматического создания и планирования пинов. 🤖
Начнем с функции массовой загрузки пинов из локальной директории:
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
Теперь создадим функцию для планирования публикаций по расписанию:
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-лент) создадим специальный скрипт:
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 вы можете создать более глубокие и персонализированные отчеты. 📈
Начнем с базовой функции для сбора аналитики по аккаунту:
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
Теперь создадим функцию для получения и анализа производительности конкретных досок:
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
Функция для создания визуального отчета о производительности аккаунта:
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:
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
Создадим функцию для анализа эффективности контента и определения лучших пинов:
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.