golang访问Spotify WEB API的插件库spotify的使用

Golang访问Spotify WEB API的插件库spotify的使用

简介

这是一个简单的Go语言库,用于访问Spotify Web API。

安装

go get github.com/rapito/go-spotify/spotify

使用方法

GET请求示例

import "fmt"
import "github.com/rapito/go-spotify/spotify"
...

// 初始化Spotify客户端,需要提供clientID和clientSecret
spot := spotify.New(clientID, clientSecret)

// 获取专辑信息
result, _ := spot.Get("albums/%s", nil, "0sNOF9WDwhWunNAHPD3Baj")

// 打印结果
fmt.Println(string(result))

完整示例DEMO

package main

import (
	"fmt"
	"github.com/rapito/go-spotify/spotify"
)

func main() {
	// 替换为你的Spotify应用凭证
	clientID := "your_client_id"
	clientSecret := "your_client_secret"
	
	// 创建Spotify客户端
	spot := spotify.New(clientID, clientSecret)
	
	// 获取特定专辑信息(示例专辑ID)
	albumID := "0sNOF9WDwhWunNAHPD3Baj"
	result, err := spot.Get("albums/%s", nil, albumID)
	
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	
	// 打印专辑JSON数据
	fmt.Println("Album Info:")
	fmt.Println(string(result))
}

限制说明

当前API版本只能成功发出GET请求,因为它只验证应用程序而不验证特定用户。这意味着你只能使用Spotify WEB API的有限端点,如文档所述:

访问令牌允许你向不需要用户授权的Spotify Web API端点发出请求,
例如获取曲目端点...

要查看你可以访问哪些端点,请查看Spotify Web API文档。

贡献

  • 你可以fork这个库并根据需要进行修改
  • 你可以提交pull request,我会很高兴检查并合并它
  • 如果你发现bug,可以创建issue,我会尽力修复它

其他有用的Go库

在我创建这个API的过程中,发现了一些很棒的库/链接,它们让我的工作更轻松:


更多关于golang访问Spotify WEB API的插件库spotify的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang访问Spotify WEB API的插件库spotify的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Golang访问Spotify Web API

Spotify提供了丰富的Web API供开发者使用,而在Golang生态中,github.com/zmb3/spotify是一个优秀的客户端库,可以方便地与Spotify Web API交互。下面我将介绍如何使用这个库。

安装

首先安装spotify库:

go get github.com/zmb3/spotify

基本使用

1. 认证流程

Spotify API使用OAuth2认证,需要先注册应用获取Client ID和Client Secret。

package main

import (
	"context"
	"fmt"
	"log"
	"net/http"

	"github.com/zmb3/spotify/v2"
	"github.com/zmb3/spotify/v2/auth"
	"golang.org/x/oauth2"
)

const (
	redirectURI = "http://localhost:8080/callback"
)

var (
	auth  = spotifyauth.New(
		spotifyauth.WithRedirectURL(redirectURI),
		spotifyauth.WithScopes(
			spotifyauth.ScopeUserReadPrivate,
			spotifyauth.ScopePlaylistModifyPublic,
		),
	)
	ch    = make(chan *spotify.Client)
	state = "abc123"
)

func main() {
	// 第一步:获取认证URL
	url := auth.AuthURL(state)
	fmt.Println("请访问以下URL授权:")
	fmt.Println(url)

	// 启动一个临时web服务器处理回调
	http.HandleFunc("/callback", completeAuth)
	go func() {
		err := http.ListenAndServe(":8080", nil)
		if err != nil {
			log.Fatal(err)
		}
	}()

	// 等待认证完成
	client := <-ch

	// 使用client调用API
	user, err := client.CurrentUser(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("你已登录为:", user.DisplayName)
}

func completeAuth(w http.ResponseWriter, r *http.Request) {
	tok, err := auth.Token(r.Context(), state, r)
	if err != nil {
		http.Error(w, "无法获取token", http.StatusForbidden)
		log.Fatal(err)
	}
	if st := r.FormValue("state"); st != state {
		http.NotFound(w, r)
		log.Fatalf("State mismatch: %s != %s\n", st, state)
	}

	// 使用token创建客户端
	client := spotify.New(auth.Client(r.Context(), tok))
	fmt.Fprintf(w, "登录完成! 你可以关闭此页面。")
	ch <- client
}

2. 常用API操作示例

搜索歌曲

results, err := client.Search(context.Background(), "Red Hot Chili Peppers", spotify.SearchTypeTrack)
if err != nil {
    log.Fatal(err)
}

// 打印搜索结果
if results.Tracks != nil {
    fmt.Println("找到的歌曲:")
    for _, item := range results.Tracks.Tracks {
        fmt.Println("  ", item.Name, "-", item.Artists[0].Name)
    }
}

获取用户播放列表

playlists, err := client.CurrentUsersPlaylists(context.Background())
if err != nil {
    log.Fatal(err)
}

fmt.Println("你的播放列表:")
for _, playlist := range playlists.Playlists {
    fmt.Printf("%s (%d tracks)\n", playlist.Name, playlist.Tracks.Total)
}

创建播放列表

user, err := client.CurrentUser(context.Background())
if err != nil {
    log.Fatal(err)
}

// 创建新播放列表
playlist, err := client.CreatePlaylistForUser(context.Background(), user.ID, 
    "我的Go创建播放列表", 
    "这是一个通过Go程序创建的播放列表", 
    false) // 公开
if err != nil {
    log.Fatal(err)
}

fmt.Printf("创建播放列表: %s\n", playlist.Name)

添加歌曲到播放列表

// 搜索要添加的歌曲
results, err := client.Search(context.Background(), "Bohemian Rhapsody", spotify.SearchTypeTrack)
if err != nil {
    log.Fatal(err)
}

if len(results.Tracks.Tracks) > 0 {
    // 添加第一首搜索结果到播放列表
    _, err = client.AddTracksToPlaylist(context.Background(), playlist.ID, results.Tracks.Tracks[0].ID)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("已添加歌曲到播放列表")
}

高级用法

使用刷新令牌

// 在认证时获取token
tok, err := auth.Token(r.Context(), state, r)
if err != nil {
    log.Fatal(err)
}

// 保存刷新令牌
refreshToken := tok.RefreshToken

// 之后可以使用刷新令牌获取新的访问令牌
newToken, err := auth.TokenSource(context.Background(), &oauth2.Token{
    RefreshToken: refreshToken,
}).Token()
if err != nil {
    log.Fatal(err)
}

// 使用新token创建客户端
client = spotify.New(auth.Client(context.Background(), newToken))

分页处理

许多Spotify API返回分页结果:

// 获取用户保存的歌曲
limit := 50
offset := 0
tracks, err := client.CurrentUsersTracks(context.Background(), 
    spotify.Limit(limit), 
    spotify.Offset(offset))
if err != nil {
    log.Fatal(err)
}

for page := 1; ; page++ {
    fmt.Printf("第%d页 (%d 首歌曲)\n", page, len(tracks.Tracks))
    for _, track := range tracks.Tracks {
        fmt.Println("  ", track.Track.Name)
    }
    
    // 检查是否还有更多结果
    err = client.Next(context.Background(), tracks)
    if err == spotify.ErrNoMorePages {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
}

注意事项

  1. 确保你的应用已在Spotify开发者仪表板注册
  2. 妥善保管Client Secret和刷新令牌
  3. 遵守Spotify API的使用条款和速率限制
  4. 生产环境应使用更安全的state值和回调URL处理

这个库提供了对Spotify Web API的全面覆盖,更多功能可以参考官方文档Spotify Web API文档

回到顶部