Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Spotify #67

Open
zjgcjy opened this issue Oct 7, 2022 · 8 comments
Open

Support for Spotify #67

zjgcjy opened this issue Oct 7, 2022 · 8 comments

Comments

@zjgcjy
Copy link
Contributor

zjgcjy commented Oct 7, 2022

在写了,先占个坑,两种方式

  1. 通过 Spotify API 获取数据
  2. 通过 Sportify 链接的 Last.fm Scrobbler 获取数据
@yihong0618
Copy link
Owner

感谢~~

@zjgcjy
Copy link
Contributor Author

zjgcjy commented Oct 7, 2022

前提需要一个 Spoitfy 账号,Spotify API 能获取非常多的数据,包括专辑、歌手、单曲、歌单等信息,但是需要通过 APP 来访问,并进行授权认证

  1. 首先打开 Spotify for Developers 开发者网站 在上面创建新的 APP,例如此处创建一个 Poster 的应用,请记住此处的 Client ID 和 Client Secret。
    image
    image
  2. 并对 APP 进行必要的设置,请参考 主要是设置重定向链接 Redirect URIs 例如 http://localhost:8888/callback
    image
  3. 然后开始请求用户认证 User Authorization,访问 https://accounts.spotify.com/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URL}&state=deadbeef&scope=user-read-recently-played&show_dialog=true 其中 CLIENT_ID 和 REDIRECT_URL 是应用中设置的
  4. 使用get请求或直接在浏览器中访问,将弹出一个窗口用来申请数据权限,这里只申请 user-read-recently-played 一个 scope 的权限,不会访问别的数据
    image
  5. 点击同意后,将进行重定向,例如此处的链接为 http://localhost:8888/callback?code=AQAERTVVyC5qyrjUQCUK-GXiUFFM2I9EC-vuGSJxWeftRX3egjhuWyWdt7f1LPqJBUFvkB8.......&state=deadbeef 并保存此时返回的code值
    image
  6. 之后需要使用 post 方式请求 Access Token 参考文档 同时考虑到 access token 会超时,必须使用refresh token 用于后续数据访问,这里提供一个python函数获取 refresh_token
def get_access_token(client_id, client_secret, redirect_uri, code):
    import requests
    from base64 import urlsafe_b64encode
    url = 'https://accounts.spotify.com/api/token'
    form = {'grant_type': 'authorization_code', 'code': code, 'redirect_uri': redirect_uri}
    authorization = f"Basic {urlsafe_b64encode(str.encode(f'{client_id}:{client_secret}')).decode()}"
    r = requests.post(
        url, 
        data = form, 
        json=True, 
        headers = {
            "Authorization": authorization, 
            "Content-Type": 'application/x-www-form-urlencoded'
            }
        )
    try:
        assert(r.status_code == 200)
        return r.json()['refresh_token']
    except AssertionError as e:
        print(r.status_code)
        print(r.content)

refresh_token = get_access_token(client_id, client_secret, redirect_uri, code)
print(refresh_token)
  1. 得到 refresh_token 后可以通过命令行获取听歌列表和听歌次数,但是需要注意 Spotify 没有提供直接获取每日听歌的接口,只能通过遍历链表访问数据,所以默认只获取前一天的听歌数据,然后保存到 IN_FOLDER 目录下 spotify-history.json ,每日定时执行就可以获取听歌量了。
python -m github_poster spotify \
        --spotify_client_id xxx \
        --spotify_client_secret xxx \
        --spotify_refresh_token xxx \

README我就不改了,可以用这里的说明,晚点提pr

@yihong0618
Copy link
Owner

看起来没问题。
README 我之后改。

@zjgcjy zjgcjy mentioned this issue Oct 7, 2022
@zjgcjy
Copy link
Contributor Author

zjgcjy commented Oct 7, 2022

贴一张debug时的效果图,最后可以得到昨天的听歌量。
image

@yihong0618
Copy link
Owner

@zjgcjy 感觉也可以把 song_name 存起来啊

@zjgcjy
Copy link
Contributor Author

zjgcjy commented Oct 8, 2022

@zjgcjy 感觉也可以把 song_name 存起来啊

是可以,但这个咋显示到poster上,要统计每首歌的次数吗,我记得有别的api可以获取一段时间的听歌量Top list
而且和国内那些音乐软件一样也有年度回顾听歌热榜 Wrapped 2020 Wrapped 2021

我自己的话因为用的比较多,后面打算直接用https://github.com/izayl/spotify-box 这个pin在首页好了😊
image


想起来两个问题, 第一是如果开启了 Private listening 应该是没有听歌记录的

image

第二是我不清楚Spotify能保存多久的记录,讲道理遍历链表可以拿到全部的,目前实现是只记录昨天一天,不支持--year 2022这种参数

@yihong0618
Copy link
Owner

yihong0618 commented Oct 8, 2022

--year 2022 最好支持。如果能拿到

@yihong0618
Copy link
Owner

不展示哈哈。(和这个 repo 无关,就是觉得能完整记录自己听的歌挺有意思的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants