返回首页

用于音乐 UPC 代码的 Telegram bot:10 个平台

Telegram bot 通过链接解析和 API 从 10 个平台提取发行 UPC 和 ISRC 代码。描述了使用 regex、Redis cache、Spotify 重试逻辑的架构。关于处理碎片化 APIs 和未文档化端点的经验教训。

UPC/ISRC 的 Bot:解析 10 个音乐 APIs
Advertisement 728x90

打造Telegram机器人,一键提取音乐平台的UPC与ISRC码

这款Telegram机器人可从10大主流音乐平台中自动提取专辑和单曲的UPC与ISRC编码。支持的平台包括Spotify、Apple Music、Yandex Music、YouTube Music、Deezer、Tidal、SoundCloud、VK Music、Zvuk以及Amazon Music。该功能源于现有分发渠道和平台界面无法直接获取UPC码的痛点。机器人通过解析链接、发行ID或文本查询,仅需1–2秒即可返回精准结果,得益于智能缓存机制。

UPC用于标识发行作品(如专辑或单曲),而ISRC则为每首歌曲提供唯一编号。这两类标识对版权注册、分销商迁移及版税追踪至关重要。

系统架构

系统采用模块化设计:

Google AdInline article slot
  • URL解析器:使用正则表达式识别来源平台。
  • 平台解析器:通过官方或逆向工程API获取元数据。
  • UPC/ISRC匹配器:交叉验证多个数据源的信息。
  • 存储层:Redis用于缓存(有效期24小时),PostgreSQL用于数据分析。

该架构支持高效扩展,同时显著降低对外部API的依赖压力。

import re
from dataclasses import dataclass
from enum import Enum

class Platform(Enum):
    SPOTIFY = "spotify"
    APPLE_MUSIC = "apple_music"
    YANDEX_MUSIC = "yandex_music"
    YOUTUBE_MUSIC = "youtube_music"
    DEEZER = "deezer"
    TIDAL = "tidal"
    SOUNDCLOUD = "soundcloud"
    VK_MUSIC = "vk_music"
    ZVUK = "zvuk"
    AMAZON_MUSIC = "amazon_music"

@dataclass
class ParsedLink:
    platform: Platform
    content_type: str  # "album", "track", "artist"
    content_id: str

PATTERNS = [
    # Spotify
    (r"open\.spotify\.com/(album|track)/([a-zA-Z0-9]+)",
     Platform.SPOTIFY),
    # Apple Music
    (r"music\.apple\.com/.+/(album|song)/.+?/(")",
     Platform.APPLE_MUSIC),
    # 其他平台...
]

处理链接与短网址

解析器内置超过10组正则规则,适配各类URL格式。对于短链接(如spotify.link、youtu.be),系统通过HEAD请求并自动跟随重定向进行解析:

async def resolve_short_url(url: str) -> str:
    async with aiohttp.ClientSession() as session:
        async with session.head(
            url, allow_redirects=True, timeout=5
        ) as resp:
            return str(resp.url)

支持的资源类型涵盖专辑、单曲和艺术家主页。针对单曲,机器人能自动定位其所属专辑。

Google AdInline article slot

与Spotify API协作

Spotify Web API在专辑数据中以external_ids.upc字段返回UPC,在单曲信息中提供ISRC。主要挑战包括:

  • 部分响应缺失UPC——需跨市场(美、英、德、日)重试。
  • 区域限定发行版的UPC搜索不稳定。
  • 接口限流:每分钟最多180次请求。

Redis缓存极大缓解了API压力:

async def get_album_data(album_id: str) -> dict | None:
    cache_key = f"album:{album_id}"
    cached = await redis.get(cache_key)
    if cached:
        return json.loads(cached)
    
    for market in ["US", "GB", "DE", "JP"]:
        album = await spotify.get_album(album_id, market=market)
        upc = album.get("external_ids", {}).get("upc")
        if upc:
            # 保存至缓存
            await redis.set(cache_key, json.dumps(result), ex=86400)
            return result
    return None

未公开接口:Yandex Music与VK

由于缺乏公开API,相关接口通过分析移动端应用流量逆向推导。UPC存在于专辑元数据中,ISRC则藏于曲目层级数据。接口响应格式频繁变动(三个月内两次变更),需持续监控维护。

Google AdInline article slot

发行版本检测

机器人可查找与单一ISRC关联的所有UPC版本——包括单曲、专辑及合集。这对更换分销商时保留流媒体播放记录极为关键。

/full命令将返回:

  • 该发行的所有UPC版本。
  • 每首曲目的ISRC码。
  • 唱片公司、发行日期、流派信息。
  • 曲目BPM(通过Spotify音频特征获取)。

用户输入处理

支持多种输入方式:

  • 直接粘贴链接(自动解析)。
  • 输入12–13位数字(按UPC查询)。
  • 文本搜索(按名称+内联按钮筛选)。

示例:"upc Morozhern"、完整链接、无结构短语等。

经验总结与优化建议

运行3个月的数据统计:

  • 月活跃用户:500人。
  • 平均响应时间:1.5秒(启用缓存后降至0.3秒)。
  • 成功率:89%。

改进建议:

  • 集成MusicBrainz用于数据校验。
  • 引入消息队列应对高峰负载。
  • 增加API可用性健康检查。

架构启示:

  • 至少使用两个数据源确保准确性。
  • 实施激进缓存策略。
  • 依赖未公开接口会积累技术债务。

核心收获:

  • 解析与平台处理分离,便于后期维护。
  • 基于市场的重试机制可修复Spotify不完整响应。
  • 在限流环境下,Redis缓存不可或缺。
  • 一ISRC多UPC是保障艺术家权益的关键。
  • 未公开接口必须每日监控。

— Editorial Team

Advertisement 728x90

继续阅读