Open8

GoでSpotifyAPIを叩く

ぱっぱぱっぱ

一般的なhttp clientを実装してみた。

client := http.Client{
	Timeout: time.Second * 2,
}

url := "https://jsonplaceholder.typicode.com/posts"
req, err := http.NewRequest(
	http.MethodGet,
	url,
	nil,
)
if err != nil {
	panic(err)
}

res, err := client.Do(req)
if err != nil {
	panic(err)
}

defer res.Body.Close()
if res.StatusCode != http.StatusOK {
	panic(fmt.Sprintf("Status code error: %d %s", res.StatusCode, res.Status))
}

fmt.Println(res.Header.Get("Content-Type"))

type Post struct {
	userId int `json:"userId"`
	id int `json:"id"`
	title string `json:"title"`
	body string `json:"body"`
}

var posts []Post
resBody, _ := ioutil.ReadAll(res.Body)

fmt.Printf("%T\n", resBody) // []uint8
fmt.Println(string(resBody))

err = json.Unmarshal(resBody, &posts)
if err != nil {
	panic(err)
}

fmt.Printf("%T\n", posts) // []main.Post
fmt.Printf("%+v\n", posts)
ぱっぱぱっぱ

io.Reader と io.Writer のインタフェースについてあとで調べる

ぱっぱぱっぱ

Sportify APIを叩きたい。
https://dev.classmethod.jp/articles/about-using-of-spotify-api/
上記を参考にする。

Sportify側でAppを作成し、Client IDとClient Secretsを入手。

echo -n {Client Id}:{Client_Secret} | base64
curl -X "POST" -H "Authorization: Basic {上の結果}" \
-d grant_type=client_credentials https://accounts.spotify.com/api/token 
{
  "access_token": "アクセストークン",
  "token_type": "Bearer",
  "expires_in": 3600
}

上記からアクセストークンが返ってくるので、それを使って、

curl -H "Authorization: Bearer {アクセストークン}"  \
GET https://api.spotify.com/v1/artists/1O8CSXsPwEqxcoBE360PPO | jq
ぱっぱぱっぱ

go mod tidy

結論からいうと、モジュール管理していて使わなくなったり必要なくなったパッケージを削除するためのコマンドです。

ぱっぱぱっぱ

https://zenn.dev/shimpo/articles/trying-spotify-api-with-go
を参考にプレイリストを取得するところまで。
ユーザー情報を扱うにはOAuthによる認可をやる

package main

import (
	"context"
	"log"
	"os"

	"fmt"
	spotifyauth "github.com/zmb3/spotify/v2/auth"
	"golang.org/x/oauth2/clientcredentials"

	"github.com/zmb3/spotify/v2"
)

func main() {
	ctx := context.Background()
	config := &clientcredentials.Config{
		ClientID:     os.Getenv("SPOTIFY_CLIENT_ID"),
		ClientSecret: os.Getenv("SPOTIFY_CLIENT_SECRET"),
		TokenURL:     spotifyauth.TokenURL,
	}

	toke, err := config.Token(ctx)
	if err != nil {
		log.Fatal(err)
		return
	}

	httpClient := spotifyauth.New().Client(ctx, toke)
	client := spotify.New(httpClient)

	// Get a playlist
	playlist, err := client.GetPlaylist(ctx, "37i9dQZF1DXcBWIGoYBM5M")
	if err != nil {
		log.Fatal(err)
		return
	}

	fmt.Println(playlist.Name)
}