misiektoja/spotify_profile_monitor

GitHub: misiektoja/spotify_profile_monitor

一款实时追踪Spotify用户资料、粉丝关系和播放列表变更的Python监控工具,支持邮件通知和数据导出。

Stars: 51 | Forks: 11

# spotify_profile_monitor

GitHub Release PyPI Version GitHub Stars Python Versions License Last Commit Maintenance

强大的 Spotify 工具,用于实时追踪个人资料变更、播放列表更新、粉丝增长、合作者等信息——直接推送到你的终端或收件箱。 ### 🚀 快速安装 ``` pip install spotify_profile_monitor ```

spotify_profile_monitor_screenshot

## 功能特性 ### 👤 个人资料监控 - **实时追踪**:监控 Spotify 用户活动和个人资料变更。 - **社交网络**:检测**关注**和**粉丝**的添加/移除。 - **身份变更**:追踪**头像**和**用户名**的更改。 ### 📜 播放列表追踪 - **内容更新**:监控**播放列表中曲目**的添加/移除。 - **合作者信息**:识别在**协作播放列表**中添加了哪首曲目的合作者。 - **社交证明**:监控播放列表的**点赞数**和**合作者**数量。 - **元数据**:追踪**名称**和**描述**的变更。 ### 📊 高级工具 - **深度洞察**:显示关于用户、粉丝和关注的详细信息。 - **历史数据**:查看**最近播放的艺人**并按名称**搜索用户**。 - **导出能力**:显示并导出任何播放列表中的曲目(包括**点赞的歌曲**)。 - **全局搜索**:指向 **Spotify、YouTube Music、Apple Music、Tidal、歌词**等的即时链接。 ### 🔔 智能交互 - **即时提醒**:针对所有个人资料和播放列表变更的详细**邮件通知**。 - **可视化报告**:将变更后的头像直接作为附件发送到邮件中。 - **终端图形**:直接在你的终端中显示头像(通过 `imgcat`)。 ### ⚙️ 强力功能 - **认证灵活性**:混合支持 `sp_dc` cookie、桌面客户端和 OAuth。 - **CSV 日志**:将所有变更及完整时间戳保存到 CSV 文件。 - **灵活配置**:支持文件、dotenv 和环境变量。 - **信号控制**:通过系统信号(`SIGHUP`、`USR1` 等)管理运行中的脚本。 ✨ 如果你想追踪 Spotify 好友的音乐动态,请查看我开发的另一个工具:[spotify_monitor](https://github.com/misiektoja/spotify_monitor)。 🛠️ 如果你正在寻找调试工具以获取 Spotify Web Player access token 并提取密钥:[点击这里](#debugging-tools) ## 目录 1. [需求](#requirements) 2. [安装](#installation) * [从 PyPI 安装](#install-from-pypi) * [手动安装](#manual-installation) * [升级](#upgrading) 3. [快速入门](#quick-start) 4. [配置](#configuration) * [配置文件](#configuration-file) * [Spotify access token 来源](#spotify-access-token-source) * [Spotify sp_dc Cookie](#spotify-sp_dc-cookie) * [Spotify 桌面客户端](#spotify-desktop-client) * [Spotify OAuth App](#spotify-oauth-app) * [Spotify OAuth User](#spotify-oauth-user) * [如何获取好友的用户 URI ID](#how-to-get-a-friends-user-uri-id) * [Spotify sha256(可选)](#spotify-sha256-optional) * [时区](#time-zone) * [SMTP 设置](#smtp-settings) * [存储密钥](#storing-secrets) 5. [用法](#usage) * [监控模式](#monitoring-mode) * [列表模式](#listing-mode) * [邮件通知](#email-notifications) * [CSV 导出](#csv-export) * [检测变更的头像](#detection-of-changed-profile-pictures) * [在终端中显示图片](#displaying-images-in-your-terminal) * [播放列表黑名单](#playlist-blacklisting) * [受限播放列表 (Spotify API 404)](#restricted-playlists-spotify-api-404) * [检查间隔](#check-intervals) * [信号控制](#signal-controls-macoslinuxunix) * [使用 GRC 为日志输出着色](#coloring-log-output-with-grc) 6. [调试工具](#debugging-tools) * [通过 sp_dc Cookie 和 TOTP 获取 Access Token](#access-token-retrieval-via-sp_dc-cookie-and-totp) * [从 Spotify Web Player 包中提取密钥](#secret-key-extraction-from-spotify-web-player-bundles) 7. [更新日志](#change-log) 8. [维护者](#maintainers) 9. [许可证](#license) ## 需求 * Python 3.6 或更高版本 * 库:`requests`、`python-dateutil`、`urllib3`、`pyotp`、`pytz`、`tzlocal`、`python-dotenv`、[Spotipy](https://github.com/spotipy-dev/spotipy)、`wcwidth` 测试环境: * **macOS**:Ventura、Sonoma、Sequoia、Tahoe * **Linux**:Raspberry Pi OS (Bullseye、Bookworm、Trixie)、Ubuntu 24/25、Rocky Linux 8.x/9.x、Kali Linux 2024/2025 * **Windows**:10、11 它应该也能在 macOS、Linux、Unix 和 Windows 的其他版本上正常工作。 ## 安装 ### 从 PyPI 安装 ``` pip install spotify_profile_monitor ``` ### 手动安装 下载 *[spotify_profile_monitor.py](https://raw.githubusercontent.com/misiektoja/spotify_profile_monitor/refs/heads/main/spotify_profile_monitor.py)* 文件到所需位置。 通过 pip 安装依赖项: ``` pip install requests python-dateutil urllib3 pyotp pytz tzlocal python-dotenv spotipy wcwidth ``` 或者,从下载的 *[requirements.txt](https://raw.githubusercontent.com/misiektoja/spotify_profile_monitor/refs/heads/main/requirements.txt)* 安装: ``` pip install -r requirements.txt ``` ### 升级 当从 PyPI 安装时,升级到最新版本: ``` pip install spotify_profile_monitor -U ``` 如果你是手动安装,请下载最新的 *[spotify_profile_monitor.py](https://raw.githubusercontent.com/misiektoja/spotify_profile_monitor/refs/heads/main/spotify_profile_monitor.py)* 文件以替换现有安装。 ## 快速入门 - 获取你的 [Spotify sp_dc cookie](#spotify-sp_dc-cookie),设置 [OAuth app 凭证](#spotify-oauth-app) 并追踪 `spotify_user_uri_id` 个人资料变更(包括播放列表): ``` spotify_profile_monitor -u "your_sp_dc_cookie_value" -r "your_spotify_app_client_id:your_spotify_app_client_secret" ``` 或者如果你是[手动安装](#manual-installation): ``` python3 spotify_profile_monitor.py -u "your_sp_dc_cookie_value" -r "your_spotify_app_client_id:your_spotify_app_client_secret" ``` 获取所有支持的命令行参数/标志列表: ``` spotify_profile_monitor --help ``` ## 配置 ### 配置文件 大多数设置可以通过命令行参数进行配置。 如果你想持久化存储配置,可以生成一个默认配置模板并将其保存到名为 `spotify_profile_monitor.conf` 的文件中: ``` # 在 macOS、Linux 或 Windows Command Prompt (cmd.exe) 上 spotify_profile_monitor --generate-config > spotify_profile_monitor.conf # 在 Windows PowerShell 上(推荐以避免编码问题) spotify_profile_monitor --generate-config spotify_profile_monitor.conf ``` 编辑 `spotify_profile_monitor.conf` 文件并更改任何所需的配置选项(每项都有详细的注释说明)。 **v3.1 新增:** 该工具现在使用混合认证方式。当使用 `cookie` 或 `client` token 来源方法时,需要 OAuth app 凭证(`SP_APP_CLIENT_ID`、`SP_APP_CLIENT_SECRET`)来检索播放列表和用户信息。有关设置说明,请参阅 [Spotify OAuth App](#spotify-oauth-app) 部分。 **v2.9 新增:** 配置文件包含用于在控制台和邮件输出中启用/禁用音乐服务 URL(Apple Music、YouTube Music、Amazon Music、Deezer、Tidal)和歌词服务 URL(Genius、AZLyrics、Tekstowo.pl、Musixmatch、Lyrics.com)的选项。 ### Spotify access token 来源 该工具支持四种获取 Spotify access token 的方法。 当你决定使用 `cookie` 或 `client` token 来源方法时,该工具使用**混合认证方式**,你还需要配置 **OAuth app 凭证**(`SP_APP_CLIENT_ID`、`SP_APP_CLIENT_SECRET`)用于检索播放列表和用户信息,如 [Spotify OAuth App](#spotify-oauth-app) 中所述。 token 来源方法可以通过 `TOKEN_SOURCE` 配置选项或 `--token-source` 标志进行配置。 **推荐:`cookie`** 使用 `sp_dc` cookie 从 Spotify web 端点检索 token。此方法设置简单,支持除获取拥有 access token 的账户的点赞曲目列表之外的所有功能(由于最近 Spotify token 的范围限制)。 自 3.1 版本起,由于 Spotify 在 2025 年 12 月 22 日引入的限制,除非用户是另一个用户拥有的播放列表上的合作者,否则它不再显示添加到用户个人资料的其他用户的播放列表。 **替代方案:`client`** 使用从 Spotify 桌面客户端捕获的凭证和基于 Protobuf 的登录流程。设置较为复杂,但支持所有功能。此方法适用于希望获得具有最广泛访问权限的长期有效 token 的高级用户。 自 3.1 版本起,由于 Spotify 在 2025 年 12 月 22 日引入的限制,除非用户是另一个用户拥有的播放列表上的合作者,否则它不再显示添加到用户个人资料的其他用户的播放列表。 **安全回退:`oauth_app`** 依赖官方 Spotify Web API(Client Credentials OAuth 流程)。此方法设置简单且使用安全,但有一些限制。以下功能**不**受支持: - 查看粉丝/关注列表 - 访问关注数(仅追踪粉丝数;**2026 年 2 月后**:粉丝数也不可用) - 获取最近播放的艺人列表 - 显示添加到用户个人资料的其他用户的播放列表(除非用户是其他用户拥有的播放列表上的合作者) - 获取拥有 access token 的账户的点赞曲目列表 - 按名称搜索 Spotify 用户 **个人:`oauth_user`** 专门用于通过官方 Spotify Web API(Authorization Code OAuth 流程)追踪经过身份验证的用户自己的账户。我个人使用此模式来监控我自己账户的变更——例如新增或失去的粉丝/关注、我播放列表上的点赞,或合作者添加新歌时。你也可以使用此模式追踪其他用户。 此方法设置简单且使用安全,但有一些限制。 监控**你自己的账户**时,以下功能**不**受支持: - 查看粉丝列表 - 查看完整的关注列表(仅有关注的艺人可用;关注的用户不包括在内) - 按名称搜索 Spotify 用户 - **查看粉丝数(2026 年 2 月后)** **注意**:如果你使用 `oauth_user` 监控自己的账户,该工具将列出你所有的播放列表,包括私有的。 在此模式下监控**其他用户**时,以下功能**不**受支持: - 查看粉丝/关注列表 - 访问关注数(仅追踪粉丝数;**2026 年 2 月后**:粉丝数也不可用) - 获取最近播放的艺人列表 - 显示添加到用户个人资料的其他用户的播放列表(除非用户是其他用户拥有的播放列表上的合作者) - 按名称搜索 Spotify 用户 如果未指定方法,该工具默认使用 `cookie` 方法。 **重要**:如果你通过 `cookie` 或 `client` 方法获取 access token,强烈建议为此工具使用单独的 Spotify 账户。这些方法与内部未记录的端点交互以实现许多功能(如检索粉丝/关注列表、关注数或最近播放的艺人)。如果你更倾向于使用常规 Spotify 账户,请考虑 `oauth_app` 或 `oauth_user` 方法——虽然它们有一些限制,但该工具在它们之上仍能完全正常运行。话虽如此,虽然我从未在自己的账户上遇到过任何问题,但我无法保证 Spotify 将来不会施加限制——特此警告。 #### Spotify sp_dc Cookie 这是用于获取 Spotify access token 的默认方法。 - 在 Web 浏览器中登录 [https://open.spotify.com/](https://open.spotify.com/)。 - 找到并复制 `sp_dc` cookie 的值。 - 使用你的 Web 浏览器开发者控制台或 cgagnier 的 **Cookie-Editor** 轻松提取它:[https://cookie-editor.com/](https://cookie-editor.com/) - 使用以下方法之一提供 `SP_DC_COOKIE` 密钥: - 在运行时使用 `-u` / `--spotify-dc-cookie` 传递 - 将其设置为[环境变量](#storing-secrets)(例如 `export SP_DC_COOKIE=...`) - 将其添加到 [.env 文件](#storing-secrets)(`SP_DC_COOKIE=...`)以持久使用 - 回退:硬编码在代码或配置文件中 如果你的 `sp_dc` cookie 过期,该工具将通过控制台和邮件通知你。在这种情况下,你需要获取新的 `sp_dc` cookie 值。 如果你将 `SP_DC_COOKIE` 存储在 dotenv 文件中,你可以更新其值并发送 `SIGHUP` 信号来重新加载包含新 `sp_dc` cookie 的文件,而无需重启工具。更多信息请参阅 [存储密钥](#storing-secrets) 和 [信号控制](#signal-controls-macoslinuxunix)。 #### Spotify 桌面客户端 这是用于获取 Spotify access token 的替代方法,它使用从真实会话拦截的凭证模拟从真实 Spotify 面应用登录。 - 运行你选择的拦截代理(如 [Proxyman](https://proxyman.com) —— 试用版即足够) - 为 `spotify.com` 域启用 SSL 流量解密 - 在 Proxyman 中:点击 **Tools → SSL Proxying List → + button → Add Domain → 粘贴 `*.spotify.com` → Add** - 启动 Spotify 桌面客户端,然后切换到你的拦截代理(如 Proxyman)并查找发往 `https://login5.spotify.com/v3/login` 的 POST 请求 - 如果你没有看到此请求,请尝试以下步骤(一旦成功即停止): - 重启 Spotify 桌面客户端 - 从 Spotify 桌面客户端注销并重新登录 - 在其设置中直接将 Spotify 指向拦截代理,即在 **Spotify → Settings → Proxy Settings** 中,设置: - **proxy type**:`HTTP` - **host**:`127.0.0.1`(你代理的 IP/FQDN,对于 Proxyman 使用你在顶部栏看到的 IP) - **port**:`9090`(你代理的端口,对于 Proxyman 使用你在顶部栏看到的端口) - 重启应用;由于 QUIC (HTTP/3) 需要原始 UDP 且无法通过 HTTP CONNECT 隧道传输,Spotify 将降级为仅 TCP 的 HTTP/2 或 1.1,拦截代理可以解密 - 使用你选择的防火墙在操作系统级别阻止 Spotify 的 UDP 端口 443 —— 这可以防止 QUIC (HTTP/3),强制 TLS over TCP 并允许拦截代理执行 MITM - 尝试旧版本的 Spotify 桌面客户端 - 将登录请求体(二进制 Protobuf payload)导出到文件(例如 ***login-request-body-file***) - 在 Proxyman 中:**右键点击请求 → Export → Request Body → Save File**。

proxyman_export_protobuf

- 使用 `--token-source client -w ` 运行工具: ``` spotify_profile_monitor --token-source client -w ``` 如果成功,该工具将自动提取必要的字段并开始监控。 你可以通过设置 `LOGIN_REQUEST_BODY_FILE` 配置选项来持久化 Protobuf 登录请求文件路径,而不是每次都使用 `-w` 标志。 `--token-source client` 标志也是如此 —— 你可以通过将 `TOKEN_SOURCE` 配置选项设置为 `client` 来持久化它。 该工具将使用拦截到的 refresh token 自动刷新 access token 和 client token。 如果你的 refresh token 过期,该工具将通过控制台和邮件通知你。在这种情况下,你需要重新导出登录请求体。 如果你将登录请求体重新导出为相同的文件名,你可以发送 `SIGHUP` 信号来重新加载包含新 refresh token 的文件,而无需重启工具。更多信息请参阅 [信号控制](#signal-controls-macoslinuxunix)。 提供了高级选项以供进一步自定义 —— 请参阅配置文件注释。但是,默认设置适用于大多数用户,通常**不**建议修改其他值。 #### Spotify OAuth App 可作为独立模式使用,也可作为 `cookie` 或 `client` token 来源方法的次要模式,用于检索播放列表和用户信息(由于 Spotify 在 2025 年 12 月 22 日引入的限制,这是必需的)。 此方法使用官方 Spotify Web API(Client Credentials OAuth 流程)。 获取凭证: - 登录 [Spotify Developer dashboard](https://developer.spotify.com/dashboard) - 创建新应用 - 对于 **Redirect URL**,使用:`http://127.0.0.1:1234` - URL 必须与显示的完全一致,包括末尾没有 `/` - 右键复制链接时,某些浏览器可能会在 URL 中添加额外的 `/` - 选择 **Web API** 作为预期的 API - 复制 **Client ID** 和 **Client Secret** - 使用以下方法之一提供 `SP_APP_CLIENT_ID` 和 `SP_APP_CLIENT_SECRET` 密钥: - 在运行时使用 `-r` / `--oauth-app-creds` 传递(使用 `SP_APP_CLIENT_ID:SP_APP_CLIENT_SECRET` 格式 —— 注意冒号分隔符) - 将其设置为[环境变量](#storing-secrets)(例如 `export SP_APP_CLIENT_ID=...; export SP_APP_CLIENT_SECRET=...`) - 将其添加到 [.env 文件](#storing-secrets)(`SP_APP_CLIENT_ID=...` 和 `SP_APP_CLIENT_SECRET=...`)以持久使用 - 回退:硬编码在代码或配置文件中 示例: ``` spotify_profile_monitor --token-source oauth_app -r "your_spotify_app_client_id:your_spotify_app_client_secret" ``` 该工具会自动刷新 OAuth app access token,因此它可以无限期保持有效。Token 缓存在 `SP_APP_TOKENS_FILE` 配置选项指定的文件中(默认:`.spotify-profile-monitor-oauth-app.json`)。 如果你将 `SP_APP_CLIENT_ID` 和 `SP_APP_CLIENT_SECRET` 存储在 dotenv 文件中,你可以更新它们的值并发送 `SIGHUP` 信号来重新加载包含新密钥值的文件,而无需重启工具。更多信息请参阅 [存储密钥](#storing-secrets) 和 [信号控制](#signal-controls-macoslinuxunix)。 你也可以通过将 `TOKEN_SOURCE` 设置为 `oauth_app` 来将此方法用作独立的 token 来源(不使用 `cookie` 或 `client`),但这有一些限制,如 [Spotify access token 来源](#spotify-access-token-source) 部分所述。 #### Spotify OAuth User 此方法使用官方 Spotify Web API(Authorization Code OAuth 流程)。 - 登录 Spotify Developer dashboard:https://developer.spotify.com/dashboard - 创建新应用 - 对于 **Redirect URL**,使用:http://127.0.0.1:1234 - URL 必须与显示的完全一致,包括末尾没有 / - 右键复制链接时,某些浏览器可能会在 URL 中添加额外的 / - 选择 **Web API** 作为预期的 API - 复制 **Client ID** 和 **Client Secret**(如果你使用 `PKCE` 模式,则不需要密钥) - 使用以下方法之一提供 `SP_USER_CLIENT_ID` 和 `SP_USER_CLIENT_SECRET` 密钥: - 在运行时使用 `-n` / `--oauth-user-creds` 传递 - 使用 `SP_USER_CLIENT_ID`:`SP_USER_CLIENT_SECRET` 格式 —— 注意冒号分隔符 - 将其设置为[环境变量](#storing-secrets)(例如 `export SP_USER_CLIENT_ID=...; export SP_USER_CLIENT_SECRET=...`) - 将其添加到 [.env 文件](#storing-secrets)(`SP_USER_CLIENT_ID=...` 和 `SP_USER_CLIENT_SECRET=...`)以持久使用 - 回退:硬编码在代码或配置文件中 要使用 `PKCE` 模式,请将 SP_USER_CLIENT_SECRET 设置为空字符串("")。 你可以使用与 [Spotify OAuth App](#spotify-oauth-app) 相同的 client ID 和密钥值。 示例: ``` spotify_profile_monitor --token-source oauth_user -n "your_spotify_user_client_id:your_spotify_user_client_secret" ``` 该工具负责刷新 access token,因此它应该无限期保持有效。 如果你将 `SP_USER_CLIENT_ID` 和 `SP_USER_CLIENT_SECRET` 存储在 dotenv 文件中,你可以更新它们的值并发送 `SIGHUP` 信号来重新加载包含新密钥值的文件,而无需重启工具。更多信息请参阅 [存储密钥](#storing-secrets) 和 [信号控制](#signal-controls-macoslinuxunix)。 ### 如何获取好友的用户 URI ID 最简单的方法是通过 Spotify 桌面或移动客户端: - 进入你好友的个人资料 - 点击**三个点** (•••) 或按 **Share** 按钮 - 复制个人资料链接 你会得到一个像这样的 URL:[https://open.spotify.com/user/spotify_user_uri_id?si=tracking_id](https://open.spotify.com/user/spotify_user_uri_id?si=tracking_id) 提取 `/user/` 和 `?si=` 之间的部分 —— 在这个例子中是:`spotify_user_uri_id` 将其用作用户 URI ID(`spotify_user_uri_id`)在工具中使用。 或者,你可以使用内置功能搜索用户名(`-s` 标志)来获取用户 URI ID: ``` spotify_profile_monitor -s "user name" ``` 它将列出所有具有该名称的用户及其用户 URI ID。 在使用此功能之前,请确保你遵循了[此处](#spotify-sha256-optional)的说明。 ### Spotify sha256(可选) 此步骤是可选的,仅当你想要使用在 Spotify 目录中搜索具有特定名称的用户以获取其 Spotify 用户 URI ID(`-s` 标志)的功能时才需要。为此,你必须拦截 Spotify 客户端的网络流量并提取所需的 `sha256Hash` 值。 - 运行你选择的拦截代理(如 [Proxyman](https://proxyman.com))。 - 启动 Spotify 桌面客户端并搜索某个用户 - 查找带有 `searchUsers` 或 `searchDesktop` 操作名称的请求 - 显示其中一个请求的详细信息并复制 **sha256Hash** 参数值(下面标记为 `XXXXXXXXXX` 的字符串) 示例请求: `https://api-partner.spotify.com/pathfinder/v1/query?operationName=searchUsers&variables={"searchTerm":"spotify_user_uri_id","offset":0,"limit":5,"numberOfTopResults":5,"includeAudiobooks":false}&extensions={"persistedQuery":{"version":1,"sha256Hash":"XXXXXXXXXX"}}` - 使用以下方法之一提供 `SP_SHA256` 密钥: - 将其设置为[环境变量](#storing-secrets)(例如 `export SP_SHA256=...`) - 将其添加到 [.env 文件](#storing-secrets)(`SP_SHA256=...`)以持久使用 - 回退:硬编码在代码或配置文件中 ### 时区 默认情况下,时区使用 `tzlocal` 自动检测。你可以在 `spotify_profile_monitor.conf` 中手动设置: ``` LOCAL_TIMEZONE='Europe/Warsaw' ``` 你可以像这样获取 pytz 支持的所有时区列表: ``` python3 -c "import pytz; print('\n'.join(pytz.all_timezones))" ``` ### SMTP 设置 如果你想使用邮件通知功能,请在 `spotify_profile_monitor.conf` 文件中配置 SMTP 设置。 使用 `--send-test-email` 标志验证你的 SMTP 设置(工具将尝试发送测试邮件通知): ``` spotify_profile_monitor --send-test-email ``` ### 存储密钥 建议将 `SP_DC_COOKIE`、`SP_APP_CLIENT_ID`、`SP_APP_CLIENT_SECRET`、`SP_USER_CLIENT_ID`、`SP_USER_CLIENT_SECRET`、`REFRESH_TOKEN`、`SP_SHA256` 或 `SMTP_PASSWORD` 等密钥存储为环境变量或 dotenv 文件。 在 **Linux/Unix/macOS/WSL** 系统上使用 `export` 设置所需的环境变量: ``` export SP_DC_COOKIE="your_sp_dc_cookie_value" export SP_APP_CLIENT_ID="your_spotify_app_client_id" export SP_APP_CLIENT_SECRET="your_spotify_app_client_secret" export SP_USER_CLIENT_ID="your_spotify_user_client_id" export SP_USER_CLIENT_SECRET="your_spotify_user_client_secret" export REFRESH_TOKEN="your_spotify_app_refresh_token" export SP_SHA256="your_spotify_client_sha256" export SMTP_PASSWORD="your_smtp_password" ``` 在 **Windows Command Prompt** 上使用 `set` 代替 `export`,在 **Windows PowerShell** 上使用 `$env`。 或者将它们持久化存储在 dotenv 文件中(推荐): ``` SP_DC_COOKIE="your_sp_dc_cookie_value" SP_APP_CLIENT_ID="your_spotify_app_client_id" SP_APP_CLIENT_SECRET="your_spotify_app_client_secret" SP_USER_CLIENT_ID="your_spotify_user_client_id" SP_USER_CLIENT_SECRET="your_spotify_user_client_secret" REFRESH_TOKEN="your_spotify_app_refresh_token" SP_SHA256="your_spotify_client_sha256" SMTP_PASSWORD="your_smtp_password" ``` 默认情况下,工具将在当前目录及其上级目录中自动搜索名为 `.env` 的 dotenv 文件。 你可以使用 `DOTENV_FILE` 或 `--env-file` 标志指定自定义文件: ``` spotify_profile_monitor --env-file /path/.env-spotify_profile_monitor ``` 你也可以使用 `DOTENV_FILE = "none"` 或 `--env-file none` 禁用 `.env` 自动搜索: ``` spotify_profile_monitor --env-file none ``` 作为回退,你也可以将密钥存储在配置文件或源代码中。 ## 用法 ### 监控模式 要监控特定用户的所有个人资料变更(包括播放列表),只需键入 [Spotify 用户 URI ID](#how-to-get-a-friends-user-uri-id) 作为命令行参数(下面示例中的 `spotify_user_uri_id`): ``` spotify_profile_monitor ``` 如果你使用默认方法获取 Spotify access token(`cookie`)且尚未设置 `SP_DC_COOKIE` 密钥,可以使用 `-u` 标志: ``` spotify_profile_monitor -u "your_sp_dc_cookie_value" ``` **注意:** 现在需要 OAuth app 凭证来检索播放列表和用户信息。如果你尚未通过环境变量或 `.env` 文件设置 `SP_APP_CLIENT_ID` 和 `SP_APP_CLIENT_SECRET`,可以使用 `-r` 标志: ``` spotify_profile_monitor -u "your_sp_dc_cookie_value" -r "your_spotify_app_client_id:your_spotify_app_client_secret" ``` 有关详细的设置说明,请参阅 [Spotify OAuth App](#spotify-oauth-app)。 默认情况下,工具会在以下位置查找名为 `spotify_profile_monitor.conf` 的配置文件: - 当前目录 - 主目录(`~`) - 脚本目录 如果你按照[配置](#configuration)中的描述生成了配置文件,但以不同的名称保存在不同的目录中,你可以使用 `--config-file` 标志指定其位置: ``` spotify_profile_monitor --config-file /path/spotify_profile_monitor_new.conf ``` 默认情况下,仅获取用户拥有的公开播放列表。要更改此行为: - 将 `GET_ALL_PLAYLISTS` 设置为 `True` - 或使用 `-k` 标志 ``` spotify_profile_monitor -k ``` 这有助于处理由其他用户创建并添加到另一个用户个人资料的播放列表。 某些用户不会在其个人资料中列出他们所有的公开播放列表,但如果你知道播放列表的 URI,你仍然可以监控它。 为此,请向 `ADD_PLAYLISTS_TO_MONITOR` 配置选项添加条目。示例: ``` ADD_PLAYLISTS_TO_MONITOR = [ {'uri': 'spotify:playlist:{playlist_id1}', 'owner_name': '{user_id}', 'owner_uri': 'spotify:user:{user_id}'}, {'uri': 'spotify:playlist:{playlist_id2}', 'owner_name': '{user_id}', 'owner_uri': 'spotify:user:{user_id}'} ] ``` 将 `{playlist_id1}` 和 `{playlist_id2}`替换为你想要监控的播放列表 URI ID,将 `{user_id}` 替换为所有者的 URI ID(`spotify_user_uri_id`)。 如果你想完全禁用检测用户公开播放列表中的变更(如播放列表中添加/移除的曲目、播放列表名称和描述变更、播放列表点赞数): - 将 `DETECT_CHANGES_IN_PLAYLISTS` 设置为 `False` - 或使用 `-q` 标志 ``` spotify_profile_monitor -q ``` 如果你想跳过某些用户的播放列表处理,可以使用 `PLAYLISTS_TO_SKIP_FILE` 或 `-t` 标志(更多信息见[此处](#playlist-blacklisting)) ``` spotify_profile_monitor -t ignored_playlists ``` 该工具运行直到被中断(`Ctrl+C`)。使用 `tmux` 或 `screen` 保持持久运行。 你可以通过运行脚本的多个副本来监控多个 Spotify 用户。 该工具自动将其输出保存到 `spotify_profile_monitor_.log` 文件。日志文件名可以通过 `SP_LOGFILE` 配置选项更改,其后缀可以通过 `FILE_SUFFIX` / `-y` 标志更改。可以通过 `DISABLE_LOGGING` / `-d` 标志完全禁用日志记录。 该工具还将关注、粉丝和播放列表列表保存到这些文件: - `spotify_profile__followings.json` - `spotify_profile__followers.json` - `spotify_profile__playlists.json` 多亏了这一点,我们可以在工具重启后检测变更。 该工具还将用户头像保存到 `spotify_profile_{user_uri_id/file_suffix}_pic*.jpeg` 文件。 ### 列表模式 该工具还有另一种模式,用于显示各种请求的信息。 如果你想显示特定 Spotify 播放列表 URL 的详细信息(即其名称、描述、曲目数、点赞数、总时长、创建和最后更新日期、曲目列表及其添加时间信息),则使用 `-l` 标志: ``` spotify_profile_monitor -l "https://open.spotify.com/playlist/playlist_uri_id" ```

spotify_profile_monitor_playlist

如果你不仅想显示,还想将特定 Spotify 播放列表的曲目列表保存到 CSV 文件,请使用 `-l` 标志和指示 CSV 文件的 `-b`: ``` spotify_profile_monitor -l "https://open.spotify.com/playlist/playlist_uri_id" -b spotify_playlist_tracks.csv ``` 如果你想显示拥有 Spotify access token 的用户的**点赞的歌曲**播放列表的类似信息,请使用 `-x` 标志(也可与 `-b` 一起使用): ``` spotify_profile_monitor -x ``` 如果你想从 `-l` 或 `-x` 导出曲目以便直接导入 [spotify_monitor](https://github.com/misiektoja/spotify_monitor),请使用 `-o` 标志以确保适当的格式(可选择使用 `-b` 指定曲目将导出到的文本文件): ``` spotify_profile_monitor -o -x -b spotify_liked_tracks.txt spotify_profile_monitor -o -l "https://open.spotify.com/playlist/playlist_uri_id" -b spotify_playlist_tracks.txt ``` 如果你想显示特定 Spotify 用户个人资料 URL 的详细信息(即用户 URI ID、粉丝和关注列表及数量、最近播放的艺人、用户播放列表列表及数量及基本统计信息,如创建时间、最后更新、描述、曲目数和点赞数),则使用 `-i` 标志: ``` spotify_profile_monitor -i ```

spotify_profile_monitor_user_details

默认情况下,仅获取用户拥有的公开播放列表。你可以使用 `-k` 标志更改此行为。这有助于处理由其他用户创建并添加到另一个用户个人资料的播放列表: ``` spotify_profile_monitor -i -k ``` 如果你想额外将用户的每个播放列表导出到单独的 .CSV 文件(以播放列表名称命名并经过清理),请使用 `--export-all-playlists` 标志(需要 `pathvalidate` 库): ``` spotify_profile_monitor -i --export-all-playlists ``` 如果你想完全禁用处理用户的公开播放列表,同时显示特定 Spotify 用户个人资料 URL 的详细信息(以加快处理速度),你可以使用 `-q` 标志: ``` spotify_profile_monitor -i -q ``` 如果你只想显示用户的关注和粉丝列表(`-f` 标志): ``` spotify_profile_monitor -f ``` 如果你想显示最近播放的艺人列表(此功能仅在用户在其设置中启用时才有效),请使用 `-a` 标志: ``` spotify_profile_monitor -a ``` 如果你想在 Spotify 目录中搜索具有特定名称的用户以获取其 Spotify 用户 URI ID(`-s` 标志): ``` spotify_profile_monitor -s "user name" ``` ### 邮件通知 要为所有用户个人资料变更(包括播放列表)启用邮件通知: - 将 `PROFILE_NOTIFICATION` 设置为 `True` - 或使用 `-p` 标志 ``` spotify_profile_monitor -p ``` 要禁用发送关于新粉丝/关注的邮件(当启用 `-p` 标志时默认发送这些): - 将 `FOLLOWERS_FOLLOWINGS_NOTIFICATION` 设置为 `False` - 或使用 `-g` 标志 ``` spotify_profile_monitor -p -g ``` 要禁用错误时发送邮件(默认启用): - 将 `ERROR_NOTIFICATION` 设置为 `False` - 或使用 `-e` 标志 ``` spotify_profile_monitor -e ``` 确保你之前已定义 SMTP 设置(见 [SMTP 设置](#smtp-settings))。 示例邮件:

spotify_profile_monitor_email_notifications

### CSV 导出 如果你想将所有个人资料变更(包括播放列表)保存到 CSV 文件,请设置 `CSV_FILE` 或使用 `-b` 标志: ``` spotify_profile_monitor -b spotify_profile_changes_spotify_user.csv ``` 如果文件不存在,将自动创建。 ### 检测变更的头像 该工具可以检测被监控用户何时更改了他们的头像。通知会显示在控制台和(如果启用了 `-p` 标志)邮件中。 此功能默认启用。要禁用它,可以: - 将 `DETECT_CHANGED_PROFILE_PIC` 设置为 `False` - 或使用 `-j` 标志 #### 工作原理 由于 Spotify 会定期更改头像 URL,即使图像相同,该工具也会对 JPEG 文件执行二进制比较以检测实际变更。 首次运行时,它将当前头像保存到 `spotify_profile__pic.jpeg` 在随后的每次检查中,会获取新图像,并将其与保存的图像逐字节比较。 如果检测到变更,旧图片将移动到 `spotify_profile__pic_old.jpeg`,新图片保存到: - `spotify_profile__pic.jpeg`(当前) - `spotify_profile__pic_YYmmdd_HHMM.jpeg`(用于历史记录) ### 在终端中显示图片 如果你安装了 `imgcat`,你可以启用直接在终端中内联显示头像和播放列表封面。 为此,请在 `IMGCAT_PATH` 配置选项中设置 `imgcat` 二进制文件的路径。 如果你只指定二进制名称,它将在你的 PATH 中自动搜索。 将其设置为空以禁用此功能。 ### 播放列表黑名单 默认情况下,所有 Spotify 拥有的播放列表都会跳过处理,即该工具不会获取或报告其变更的曲目和点赞数。这是因为它们通常是动态生成的,在点赞数方面变化量大,有时曲目也是如此。你可以通过将 `IGNORE_SPOTIFY_PLAYLISTS` 设置为 `False` 来更改此行为。 除此之外,你还可以使用 `PLAYLISTS_TO_SKIP_FILE` / `-t` 标志,它允许你指示包含要加入黑名单的额外播放列表的文件。 该文件可以包含引用播放列表 URI 和 URL 以及播放列表所有者名称、URI 和 URL 的行。以下是一个包含可接受条目的 `ignored_playlists` 文件示例: ``` playlist_uri_id spotify:playlist:playlist_uri_id https://open.spotify.com/playlist/playlist_uri_id https://open.spotify.com/playlist/playlist_uri_id?si=1 Some User Name user_uri_id spotify:user:user_uri_id https://open.spotify.com/user/user_uri_id?si=1 ``` 如果需要,你可以用 # 注释掉特定行。 如果某些播放列表被列入黑名单,将有相应的消息。例如: ``` - 'Afternoon Acoustic' [ IGNORED ] [ https://open.spotify.com/playlist/37i9dQZF1DX4E3UdUs7fUx?si=1 ] [ songs: 100, likes: 2164491, collaborators: 0 ] [ owner: Spotify ] [ date: Fri 23 Aug 2024, 17:05:15 - 7 months, 10 hours, 27 minutes ago ] [ update: Fri 23 Aug 2024, 17:05:15 - 7 months, 10 hours, 27 minutes ago ] 'Unwind and let the afternoon unfold.' ``` ### 受限播放列表 (Spotify API 404) 某些播放列表(尤其是 Spotify 策划的)可能出现在个人资料页面上,但在公开的 `/v1/playlists/{id}` 端点上返回 `404`。 在这种情况下,该工具将它们标记为 `[ RESTRICTED ]`,并回退到个人资料视图元数据(`public_playlists`),而不是将其视为一般处理错误。 对于受限播放列表,该工具可以监控: - 从个人资料中添加/移除 - 播放列表名称变更 - 点赞/粉丝数变更(当个人资料视图中可用时) 对于受限播放列表,该工具无法监控: - 曲目级别的变更 - 合作者 - 描述变更 - 从曲目历史派生的创建/最后更新时间戳 ### 检查间隔 如果你想自定义轮询间隔,请使用 `-c` 标志(或 `SPOTIFY_CHECK_INTERVAL` 配置选项): ``` spotify_profile_monitor -c 900 ``` ### 信号控制 该工具实现了几个信号处理程序,允许在无需使用新配置选项/标志重启工具的情况下更改工具的行为。 支持的信号列表: | Signal | 描述 | | ----------- | ----------- | | USR1 | 切换用户个人资料变更的邮件通知 (-p) | | TRAP | 增加个人资料检查计时器(5 分钟) | | ABRT | 减少个人资料检查计时器(5 分钟) | | HUP | 从 .env 文件重新加载密钥,并从 Protobuf 文件重新加载 token 来源凭证 | 使用 `kill` 或 `pkill` 发送信号,例如: ``` pkill -USR1 -f "spotify_profile_monitor " ``` 由于 Windows 支持有限数量的信号,此功能仅在 Linux/Unix/macOS 上可用。 ### 使用 GRC 为日志输出着色 你可以使用 [GRC](https://github.com/garabik/grc) 为日志着色。 添加到你的 GRC 配置(`~/.grc/grc.conf`): ``` # monitoring 日志文件 .*_monitor_.*\.log conf.monitor_logs ``` 现在将 [conf.monitor_logs](https://raw.githubusercontent.com/misiektoja/spotify_profile_monitor/refs/heads/main/grc/conf.monitor_logs) 复制到你的 `~/.grc/`,在使用 `grc` 工具时日志文件应该会有很好的颜色。 示例: ``` grc tail -F -n 100 spotify_profile_monitor_.log ``` ## 调试工具 为了帮助故障排除和开发,相关的 [spotify_monitor](https://github.com/misiektoja/spotify_monitor) 项目的 [debug](https://github.com/misiektoja/spotify_monitor/tree/dev/debug) 目录中提供了两个调试实用程序。 ### 通过 sp_dc Cookie 和 TOTP 获取 Access Token [spotify_monitor_totp_test](https://github.com/misiektoja/spotify_monitor/blob/dev/debug/spotify_monitor_totp_test.py) 工具使用 Web Player `sp_dc` cookie 和 TOTP 参数检索 Spotify access token。 从[这里](https://github.com/misiektoja/spotify_monitor/blob/dev/debug/spotify_monitor_totp_test.py)下载或: ``` wget https://raw.githubusercontent.com/misiektoja/spotify_monitor/refs/heads/dev/debug/spotify_monitor_totp_test.py ``` 安装需求: ``` pip install requests python-dateutil pyotp ``` 运行: ``` python3 spotify_monitor_totp_test.py --sp-dc "your_sp_dc_cookie_value" ``` 你应该获得一个有效的 Spotify access token,示例输出:

spotify_monitor_totp_test

### 从 Spotify Web Player 包中提取密钥 [spotify_monitor_secret_grabber](https://github.com/misiektoja/spotify_monitor/blob/dev/debug/spotify_monitor_secret_grabber.py) 工具自动提取用于 Spotify Web Player JavaScript 包中 TOTP 生成的密钥。 从[这里](https://github.com/misiektoja/spotify_monitor/blob/dev/debug/spotify_monitor_secret_grabber.py)下载或: ``` wget https://raw.githubusercontent.com/misiektoja/spotify_monitor/refs/heads/dev/debug/spotify_monitor_secret_grabber.py ``` 安装需求: ``` pip install playwright playwright install ``` 交互式运行(默认输出模式): ``` python3 spotify_monitor_secret_grabber.py ``` 你应该获得类似于下面的输出:

spotify_monitor_secret_grabber

显示帮助: ``` python3 spotify_monitor_secret_grabber.py -h ``` ### CLI 输出模式 该脚本支持几种针对不同用例的输出模式: | Flag | 描述 | 输出 | |------|--------------|--------| | `--secret` | 打印提取密钥的纯 JSON 数组 | `[{"version": X, "secret": "..."}, ...]` | | `--secretbytes` | 打印带有 ASCII 字节值的 JSON 数组 | `[{"version": X, "secret": [..]}, ...]` | | `--secretdict` | 打印映射版本 → 字节列表的 JSON 对象/dict | `{"X": [..], "Y": [..]}` | | `--all` | 提取密钥并**将所有三个输出**写入本地文件 | `secrets.json`, `secretBytes.json`, `secretDict.json` | 以特定格式打印提取的密钥,例如 Python 友好的密钥字节(JSON 对象/dict)并保存到指示的文件: ``` python3 spotify_monitor_secret_grabber.py --secretdict > secretDict.json ``` 或者,一次生成并将所有密钥格式保存到文件(`secrets.json`, `secretBytes.json`, `secretDict.json`): ``` python3 spotify_monitor_secret_grabber.py --all ``` 默认文件路径和名称可以直接在脚本顶部的 `OUTPUT_FILES` 字典中配置。 ### 🐳 通过 Docker 提取密钥(推荐,最简单的方法) Docker Hub 上提供了预构建的多架构镜像:[`misiektoja/spotify-secrets-grabber`](https://hub.docker.com/r/misiektoja/spotify-secrets-grabber) 此镜像适用于: - macOS(Intel 和 Apple Silicon) - Linux(x86_64 和 ARM64) - Windows(Docker Desktop / WSL2) - Raspberry Pi 4/5(64 位 OS) 交互式运行(默认输出模式): ``` docker run --rm misiektoja/spotify-secrets-grabber ``` 显示帮助: ``` docker run --rm misiektoja/spotify-secrets-grabber -h ``` 以特定格式打印提取的密钥,例如 Python 友好的密钥字节(JSON 对象/d)并保存到指示的文件: ``` docker run --rm misiektoja/spotify-secrets-grabber --secretdict > secretDict.json ``` 或者,一次生成并将所有密钥格式保存到文件(`secrets.json`, `secretBytes.json`, `secretDict.json`): ``` docker run --rm -v .:/work -w /work misiektoja/spotify-secrets-grabber --all ``` *对于 SELinux 主机,使用 `-v .:/work:Z`。* 或者选择使用 Docker Compose(代码库中包含预配置的 [compose.yaml](https://github.com/misiektoja/spotify_monitor/blob/dev/debug/spotify_monitor_secret_grabber_docker/compose.yaml) 文件): ``` docker compose run --rm spotify-secrets-grabber --all ``` 这会将所有文件保存到任何系统上的当前目录。 你现在可以手动或通过引用外部 `secretDict.json` 文件来更新用于 TOTP 生成的密钥(例如 `spotify_monitor_totp_test`、`spotify_monitor` 和 `spotify_profile_monitor` 中的 `SECRET_CIPHER_DICT`),该文件可以托管在另一个代码库中或本地存储。有关详细信息,请参阅这些文件中 `SECRET_CIPHER_DICT_URL` 的描述。 ## 更新日志 详见 [RELEASE_NOTES.md](https://github.com/misiektoja/spotify_profile_monitor/blob/main/RELEASE_NOTES.md)。 ## 维护者 [![Maintainer: misiektoja](https://img.shields.io/badge/maintainer-misiektoja-blue)](https://github.com/misiektoja) [![Maintainer: tomballgithub](https://img.shields.io/badge/maintainer-tomballgithub-blue)](https://github.com/tomballgithub) ## 许可证 根据 GPLv3 授权。见 [LICENSE](https://github.com/misiektoja/spotify_profile_monitor/blob/main/LICENSE)。
标签:API 调用, ESC4, OSINT, Python, Spotify, Unix, 代码示例, 字符串匹配, 实时追踪, 播放列表管理, 数字足迹, 数据分析, 数据泄露, 无后门, 用户画像分析, 用户行为分析, 社交媒体监控, 粉丝统计, 终端工具, 逆向工具