Как получить ключи 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
Скажу лишь, что для регистрации у Вас должен быть свой сайт с доменом и обязательно с Политикой конфиденциальности, чтобы пройти проверку.
После создания приложения, у Вас будет отображаться примерно вот так:
Нажимаете на кнопку "Управление" и внутри найдёте нужные данные:
Получение ключей (токенов) доступа
Получение ключей происходит в 3 этапа:
- Генерация ссылки на авторизацию, где обязательно необходимо передать
redirect_uri
, куда будет перенаправляться пользователь после успешной авторизации. - Сервер, который будет доступен для
redirect_uri
. То есть именно здесь будет дальше приниматься запрос с кодом подтверждения - После получения специального кода необходимо сделать последний запрос на получение ключей.
Этап 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 SECRETauth_header
— потом преобразовываем нашauth_secret
в base64 закодированную строку- Данные передаём как FormData. Указываем:
В результате Вы получите в ответ вот такой 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-канал со всеми обновлениями✨
Вам также может быть полезно:
- Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее
- Введение в Haystack
- Руководство по Pandas Series