( 참고 : “FastCampus, 데이터 엔지니어링 올인원” )

[ Data Engineering ]

Spotify Project - Access Token


1. Basic Setup

Import Packages

import sys
import requests
import base64
import json
import logging
import pymysql
import csv


client_id와 client_secret

client_id = "fa7ada24bea8410a8e98159f09154c76"
client_secret = "1d3d8e0535b042f78665680cc50bd339"


2. Access Token 받아오기

figure2

Endpoint

  • 우선, client id와 client secret을 입력하여 access token을 받아와야한다.

    그러기 위한 endpoint는 아래와 같다.

  • endpoint = "https://accounts.spotify.com/api/token"


Encoding

  • base64를 사용하여, client_id와 client_secret을 인코딩한다

  • encoded = base64.b64encode("{}:{}".format(client_id, client_secret).encode('utf-8')).decode('ascii').


Header

  • 인코딩 한 부분을, header안에 넣어줘야한다.

  • headers = {"Authorization": "Basic {}".format(encoded)}


Body parameter

  • payload = {"grant_type": "client_credentials"}


Method

  • method로는, 위에서 요구한대로 POST를 사용한다

  • r = requests.post(endpoint, data=payload, headers=headers)

    ( 여기서 반환받게되는 r은 access token 및 이와 관련된 정보가 담겨있다 )


Access Token

  • 위의 r은 “dictionary형태로 보이는” string이다.
  • 따라서, 이를 json.loads함수를 사용하여 dictionary 형태로 변환해주고, 여기서 access_token 값을 받아와야 한다.
  • access_token = json.loads(r.text)['access_token']


Final Header

  • 그렇다면, 우리가 받은 access token을 어떠한 식으로 넣어줘야하는가?

    figure2

  • headers = {"Authorization": "Bearer {}".format(access_token)}


3. Code Summary

위의 1. Access Token 받아오기에서 신경써야 할 점이 있다. Access Token은 3600초마다 만료가 되기 때문에, 지속적으로 access token을 발급 받고, 이에 맞는 최종 header를 return하는 과정이 필요하다. 이를 지속적으로 하기 위해 구현한 함수(get_headers()) 는 아래와 같다.

def get_headers(client_id, client_secret):
    endpoint = "https://accounts.spotify.com/api/token"
    encoded = base64.b64encode("{}:{}".format(client_id, client_secret).encode('utf-8')).decode('ascii')
    headers = {
        "Authorization": "Basic {}".format(encoded)
    }
    payload = {
        "grant_type": "client_credentials"
    }

    r = requests.post(endpoint, data=payload, headers=headers)
    access_token = json.loads(r.text)['access_token']
    headers = {
        "Authorization": "Bearer {}".format(access_token)
    }

    return headers