{"id":18966415,"url":"https://github.com/fengliufeseliud/pycloudmusic","last_synced_at":"2025-04-19T14:22:02.782Z","repository":{"id":45839381,"uuid":"514484825","full_name":"FengLiuFeseliud/pycloudmusic","owner":"FengLiuFeseliud","description":" 优雅的异步高性能 Python 音乐 API 库 (网易云音乐)","archived":false,"fork":false,"pushed_at":"2023-10-19T11:33:59.000Z","size":5472,"stargazers_count":29,"open_issues_count":6,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T08:32:57.172Z","etag":null,"topics":["api","netease","netease-cloud-music","python","rewrite"],"latest_commit_sha":null,"homepage":"https://fengliufeseliud.github.io/pycloudmusic/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FengLiuFeseliud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-16T05:16:43.000Z","updated_at":"2025-03-06T18:08:04.000Z","dependencies_parsed_at":"2024-11-08T14:38:54.625Z","dependency_job_id":"c05530c1-5aa7-4d41-8aa5-4e7214d5eac0","html_url":"https://github.com/FengLiuFeseliud/pycloudmusic","commit_stats":{"total_commits":59,"total_committers":5,"mean_commits":11.8,"dds":"0.11864406779661019","last_synced_commit":"43078108be2dd7fc635bc2951d31bbed538c251f"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FengLiuFeseliud%2Fpycloudmusic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FengLiuFeseliud%2Fpycloudmusic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FengLiuFeseliud%2Fpycloudmusic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FengLiuFeseliud%2Fpycloudmusic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FengLiuFeseliud","download_url":"https://codeload.github.com/FengLiuFeseliud/pycloudmusic/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249213735,"owners_count":21231096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","netease","netease-cloud-music","python","rewrite"],"created_at":"2024-11-08T14:37:01.922Z","updated_at":"2025-04-16T07:33:09.822Z","avatar_url":"https://github.com/FengLiuFeseliud.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pycloudmusic\n\n![issues](https://img.shields.io/github/issues/FengLiuFeseliud/pycloudmusic)\n![forks](https://img.shields.io/github/forks/FengLiuFeseliud/pycloudmusic)\n![stars](https://img.shields.io/github/stars/FengLiuFeseliud/pycloudmusic)\n![license](https://img.shields.io/github/license/FengLiuFeseliud/pycloudmusic)\n\n**优雅的异步高性能 Python 音乐 API 库**\n\n开箱即用/简单/快速 Python \u003e= 3.9\n\n[基于 NeteaseCloudMusicApi 改写](https://github.com/Binaryify/NeteaseCloudMusicApi)\n\n[项目文档 (移动至 Github Pages): https://fengliufeseliud.github.io/pycloudmusic](https://fengliufeseliud.github.io/pycloudmusic)\n\n# 快速入门\n\n## 安装\n\n使用 pip 即可安装 pycloudmusic\n\n```bash\npip install pycloudmusic\n```\n\n## 输出对象\n\npycloudmusic 下的所有对象被打印时都会格式化输出类所有变量， 方便查看对象数据\n\n```python\nfrom pycloudmusic import Music163Api\nimport asyncio\n\n\nasync def main():\n    musicapi = Music163Api()\n    # 获取歌曲 421531\n    # https://music.163.com/#/song?id=421531\n    music = await musicapi.music(421531)\n    # 打印歌曲信息\n    print(music)\n    print(\"=\" * 50)\n\nasyncio.run(main())\n```\n\n此处数据为打印歌单对象\n\n![printobj.png](https://img.sakuratools.top/docs/pycloudmusic/printobj.png@0x0x0.8x80)\n\n## 可迭代对象\n\npycloudmusic 下的部分对象可以被迭代使用\n\n如下获取歌单 PlayList 对象后可以直接 for in PlayList 对象， 将迭代返回按歌单曲目生成的 Music 对象\n\n```python\nfrom pycloudmusic import Music163Api\nimport asyncio\n\n\nasync def main():\n    musicapi = Music163Api()\n    # 获取歌单 7487291782\n    # https://music.163.com/#/playlist?id=7487291782\n    playlist = await musicapi.playlist(7487291782)\n    # 打印歌单信息\n    print(playlist)\n    print(\"=\" * 50)\n\n    # 打印歌单曲目\n    for music in playlist:\n        print(music.name, music.artist_str, music.id)\n\nasyncio.run(main())\n```\n\n因此可以使用推导式快速生成 task 列表下载歌单曲目\n\n```python\nfrom pycloudmusic import Music163Api\nimport asyncio\n\n\nasync def main():\n    musicapi = Music163Api()\n    # 获取歌单 7487291782\n    # https://music.163.com/#/playlist?id=7487291782\n    playlist = await musicapi.playlist(7487291782)\n    # 创建任务\n    tasks = [asyncio.create_task(music.play()) for music in playlist]\n    # 等待任务\n    await asyncio.wait(tasks)\n\nasyncio.run(main())\n```\n\n## 模拟登录\n\npycloudmusic 支持邮箱登录， 二维码登录， 手机密码登录， 手机验证码登录\n\n这里可以用邮箱登录长期保持 Cookie 有效性，邮箱登录不需要人为操作\n\n```python\nfrom pycloudmusic import LoginMusic163\nimport asyncio\n\n\nasync def main():\n    login = LoginMusic163()\n    # 邮箱登录\n    code, cookie, musicapi = await login.email(\"you login email\", \"you login password\")\n    # 验证登录\n    print(\"=\" * 60)\n    print(code, cookie, musicapi)\n    print(\"=\" * 60)\n    print(await musicapi.my())\n\nasyncio.run(main())\n```\n\n## 评论\n\npycloudmusic 支持网易云的所有评论， 对支持评论的对象使用 Music163Comment 的方法即可\n\n```python\n\"\"\"获取歌曲评论\"\"\"\n\nfrom pycloudmusic import Music163Api, Page\nimport asyncio\n\n\nasync def main():\n    musicapi = Music163Api()\n    # 获取歌曲\n    # https://music.163.com/song?id=1902224491\u0026userid=492346933\n    music = await musicapi.music(1902224491)\n    # 按时间获取评论\n    async for comments in Page(music.comments, hot=False):\n        for comment in comments:\n            print(f\"{comment.user_str}:  {comment.content}\")\n\nasyncio.run(main())\n```\n\n## 错误处理\n\nAPI 返回 200 以外状态码触发 Music163BadCode 错误\n\n错误对象.code 获取 API 状态码，错误对象.data 获取 API 数据\n\n```python\nfrom pycloudmusic import Music163Api, Music163BadCode\nimport asyncio\n\n\nasync def main():\n    musicapi = Music163Api()\n\n    try:\n        playlist = await musicapi.playlist(7487291782)\n    except Music163BadCode as err:\n        print(err, err.code, err.data)\n\nasyncio.run(main())\n```\n\n## 代理设置\n\npycloudmusic 支持 proxy 时出现错误触发回调来更新 proxy\n\n```python\nfrom pycloudmusic import Music163Api, set_proxy, set_proxy_callback\nimport asyncio\n\n# 正常这里是多个 proxy ip\nproxy = [\n    \"http://117.114.149.66:55443\"\n]\n\n# 设置 proxy\nset_proxy(proxy[0])\n\n# proxy 更新回调\ndef proxy_callback(err):\n    # 如果 proxy 时出现错误这里更新\n    # 第一个返回值新的 proxy ip\n    # 第二个返回值 aiohttp.BasicAuth proxy 身份验证, 没有为 None\n    return proxy[0], None\n\n# 设置 proxy 更新回调\nset_proxy_callback(proxy_callback)\n\nasync def main():\n    musicapi = Music163Api()\n    # 获取歌曲 421531\n    # https://music.163.com/#/song?id=421531\n    music = await musicapi.music(421531)\n    await music.play()\n    # 打印歌曲信息\n    print(music)\n    print(\"=\" * 50)\n\nasyncio.run(main())\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffengliufeseliud%2Fpycloudmusic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffengliufeseliud%2Fpycloudmusic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffengliufeseliud%2Fpycloudmusic/lists"}