Backend
January 26

Как получить ключи Pinterest API v5

Всем, привет! В этой статье расскажу как я получал ключи доступа к Pinterest API, а именно accessToken и refreshToken. Ведь именно accessToken используется во всех эндпоинтах для авторизации и проверки валидности запросов.

Данная статья будет полезна тем, кто хочет автоматизировать свой аккаунт Pinterest и управлять им через API.

Все примеры будут на языке Python, но эти шаги легко повторить на любом другом языке. Так как примеры очень легко читать и понимать.

Регистрация приложения

Сперва Вам необходимо создать бизнес аккаунт и зарегистрировать приложение внутри Pinterest. После создания приложения у Вас будет доступно CLIENT ID и CLIENT SECRET.

Как это сделать написано в инструкции:

https://developers.pinterest.com/docs/getting-started/connect-app

Скажу лишь, что для регистрации у Вас должен быть свой сайт с доменом и обязательно с Политикой конфиденциальности, чтобы пройти проверку.

После создания приложения, у Вас будет отображаться примерно вот так:

Нажимаете на кнопку "Управление" и внутри найдёте нужные данные:

  • "Идентификатор приложения" — CLIENT ID
  • "Секретный ключ приложения" — CLIENT SECRET

Получение ключей (токенов) доступа

Получение ключей происходит в 3 этапа:

  1. Генерация ссылки на авторизацию, где обязательно необходимо передать redirect_uri, куда будет перенаправляться пользователь после успешной авторизации.
  2. Сервер, который будет доступен для redirect_uri. То есть именно здесь будет дальше приниматься запрос с кодом подтверждения
  3. После получения специального кода необходимо сделать последний запрос на получение ключей.

Этап 1

На этой этапе необходимо просто сформировать URL, по которому будет происходить авторизация через Pinterest.

Здесь нам понадобится только CLIENT ID.

Сперва создадим конфиг с нужными данными:

class PinterestConfig:
    def __init__(self):
        load_dotenv()  # Загружаем переменные окружения
        self.client_id = os.getenv('PINTEREST_CLIENT_ID')
        self.client_secret = os.getenv('PINTEREST_CLIENT_SECRET')
        self.redirect_uri = os.getenv('PINTEREST_REDIRECT_URI', 'http://localhost:8000/callback')


config = PinterestConfig()

В моём примере PINTEREST_REDIRECT_URI = 'http://localhost:8000/callback'

Так как я тестирую всё локально.

Сразу скажу, чтобы всё сработало, то внутри своего приложения на сайте Pinterest необходимо этот URI добавить в разрешённые.

Аналогично заходит в Управление своим приложением и ищем пункт "URI перенаправления" и добавляем новый:

Далее формируем URL авторизации:

client_id = config.client_id
redirect_uri = config.redirect_uri

print(f'https://www.pinterest.com/oauth/?response_type=code&client_id={client_id}&redirect_uri={urllib.parse.quote(redirect_uri)}&scope=pins:read,pins:write,boards:read')
  • response_type=code — говорит нам о том, что нам нужен код для авторизации. Это просто будет некоторая рандомная строка, где мы будем подтверждать, что это мы всё запросили.
  • Обратите внимание на scope. Он отвечает за то, на какие права мы рассчитываем. Собираемся мы управлять пинами, или досками, или ещё чем. Здесь надо это всё указать.

Полный список значений для scope можно прочитать по ссылке:

https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#choose-scopes

Этап 2. Сервер для redirect_uri

Ссылка для авторизации у нас есть. Но теперь после авторизации мы будем куда-то перенаправляться. Я для примера написал простой сервер на FastAPI, который будет доступен для принятия данных:

import aiohttp
import base64
import os
import uvicorn

from dotenv import load_dotenv
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware


class PinterestConfig:
    def __init__(self):
        load_dotenv()  # Загружаем переменные окружения
        self.client_id = os.getenv('PINTEREST_CLIENT_ID')
        self.client_secret = os.getenv('PINTEREST_CLIENT_SECRET')
        self.redirect_uri = os.getenv('PINTEREST_REDIRECT_URI', 'http://localhost:8000/callback')
        self.api_version = 'v5'  # Актуальная версия API
        self.base_url = f'https://api.pinterest.com/{self.api_version}/'


config = PinterestConfig()


app = FastAPI()

@app.get("/callback")
async def cb(request: Request):
    code = request.query_params.get('code', None)
	print('Полученный код: ', code)
    return {"status": "ok"}


app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
    expose_headers=["set-cookie"]
)


if __name__ == "__main__":
    try:
        uvicorn.run(app, host="0.0.0.0", port=8000)
    except Exception as err:
        print('Error starting server', err)
        exit(1)

Как видим, наш сервер будет запущен на порту 8000 и у него есть соответствующий /callback роут.

Теперь у нас 2 этапа позади и Вы сможете перейти по ссылке, сгенерированной на шаге 1, запустив предварительно сервер на шаге 2. И в итоге видите присланный код.

Осталось дело за малым. Нам надо получить ключи (токены доступа). Переходим к финальному шагу.

Этап 3. Получение ключей доступа

Основные шаги расписаны в документации:

https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#generate-an-access-token

В зависимости от метода авторизации выбирается один из вариантов. Мы выбрали получение кода авторизации.

Давайте теперь его получим:

@app.get("/callback")
async def cb(request: Request):
    code = request.query_params.get('code', None)
	print('Полученный код: ', code)

    if code:
	    auth_secret = f"{config.client_id}:{config.client_secret}"
	    auth_header = f'Basic {base64.b64encode(auth_secret.encode("utf-8")).decode()}'

        async with aiohttp.ClientSession(headers={'Authorization': auth_header}) as session:
            form_data = aiohttp.FormData()
            form_data.add_field('grant_type', 'authorization_code')
            form_data.add_field('code', code)
            form_data.add_field('redirect_uri', config.redirect_uri)

            async with session.post(f'https://api.pinterest.com/v5/oauth/token', data=form_data) as response:
                try:
                    response.raise_for_status()
                    response_data = await response.json()
                    print('response_data', response_data)
                except Exception as err:
                    print('auth error', err)

    return {"status": "ok"}
  • auth_secret — Сначала формируем специальную строку, состоящую из CLIENT ID и CLIENT SECRET
  • auth_header — потом преобразовываем наш auth_secret в base64 закодированную строку
  • Данные передаём как FormData. Указываем:
    • grant_type — метод авторизации. Мы выбрали получение кода. 'authorization_code'
    • code — полученный код авторизации
    • redirect_uri — URL перенаправления, который мы указывали, когда формировали строку авторизации на этапе 1. Важно его сюда передавать.

В результате Вы получите в ответ вот такой JSON:

{
  'access_token': 'pina_....',
  'refresh_token': 'pinr......',
  'response_type': 'authorization_code',
  'token_type': 'bearer',
  'expires_in': 2592000,
  'refresh_token_expires_in': 31536000,
  'scope': 'boards:read pins:read pins:write'
}

На этом всё :)


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

Основной Telegram-канал со всеми обновлениями

Вам также может быть полезно:

Другие соц. сети: