diaoxiaozhang / ximalaya-downloader Goto Github PK
View Code? Open in Web Editor NEW喜马拉雅专辑音频一键下载工具
License: GNU Affero General Public License v3.0
喜马拉雅专辑音频一键下载工具
License: GNU Affero General Public License v3.0
作者您好,一个小建议:
def get_encrypted_url(self, sound_id, headers):
方法中,trackQualityLevel
可以设置1-3
,对应的["playUrlList"][0]
为相应音质的url
,指的注意的是,最高画质的音配文件后缀不是.m4a
需要修改一下相应的保存代码。
你好,最近發現有些專輯下載時會發生如標題的錯誤,這是報錯的最後幾行
File "d:\python\魔鏡歌詞\code\Ximalaya_main.py", line 238, in async_get_sound
album_name = self.replace_invalid_chars(album_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\python\魔鏡歌詞\code\Ximalaya_main.py", line 186, in replace_invalid_chars
if char in name:
^^^^^^^^^^^^
TypeError: argument of type 'ClientSession' is not iterable
我下載的是這個網址
https://www.ximalaya.com/album/21824864
我也檢查了代碼,問題是出在replace_invalid_chars方法中,似乎送入了一個ClientSession參數給他導致的錯誤,
但是我查了其他掉用此方法的方法沒有看出問題在哪裡,搞不清楚為啥就送了個ClientSession進去,
我是選下載全部專輯的時候,大概到最後幾集的時候才報錯的,
在請大大看應該如何解決,感謝
选择浏览器登录就直接闪退了,两个浏览器都一样,能否使用默认浏览器或者手动指定浏览器。
你好大大,最近發現下載工具無法解析手機板喜馬拉雅分享的連結,是否可以新增對這種連結的解析,
或是有什麼策略可以轉換手機板連結成電腦版的聯結呢
下面這是網址
https://m.ximalaya.com/selfshare/album/56206086?uid=140986368&shrdv=e8d4322a-2789-374f-983a-ab0054d0ead5&shrh5=android&shrid=18e2c16d427152fd&shrdh=1&shrpid=18e2c16d4277c33&srcType=6&subType=1010&srcId=56206086
最近一週都在研究此項目的code,解析的部分還沒研究,
要是大老有絲路可以先分享函數讓我來測試測試也行,感謝!
可以单独出一个XM文件解密功能吗
请问是什么问题
你好,請問是否可提供更詳細的內容,
例如python之外,還需要安裝那些包,
該如何用指令來下載、該如何登入自己的帳號等,
感謝!
比如懒人ts、蜻蜓、得到、帆书等
大神你好,麻烦把py脚本打包成ubuntu22.04系统用的
二进制文件谢谢!!py脚本 依赖搞不定。
首先,对大佬表示真诚的感谢,这个解密url和解密xm文件的方法很强。
如果您有时间,可以发一篇文章,或者一个视频,说明一下您是如何破解它加密步骤,并进行解密的吗?
小白一枚,感觉这些东西很强大,想学习一下,如果您有解密相关的学习路线,希望您也能分享一下~
万分感谢!
专辑里面有些声音无法下载。单独下载报错。请帮忙看看
请输入声音ID或链接:
https://www.ximalaya.com/sound/47736239
声音名第3集:舌头会跳舞?(1),判断为已购付费声音或vip免费声音,正在开始下载……
ID为47736239的vip声音解析失败!
Traceback (most recent call last):
File "D:\GitHub\Ximalaya-Downloader\console-version.py", line 2, in <module>
main.ConsoleVersion().run()
File "D:\GitHub\Ximalaya-Downloader\main.py", line 555, in run
self.ximalaya.get_vip_sound(sound_name, sound_id, headers)
File "D:\GitHub\Ximalaya-Downloader\main.py", line 343, in get_vip_sound
sound_url = self.decrypt_url(encrypted_url)
File "D:\GitHub\Ximalaya-Downloader\main.py", line 235, in decrypt_url
ciphertext = base64.urlsafe_b64decode(ciphertext + '=' * (4 - len(ciphertext) % 4))
TypeError: object of type 'bool' has no len()
readme里并没有手动获取cookie的方法
你好,聽說喜馬拉雅最近有推出無損格式,但目前只有比較少的專輯才有,
請問是否可以支持下載無損格式的呢?
下面這個是有無損的專輯
https://www.ximalaya.com/album/38160002
謝謝
请选择您想要下载的音质:(直接回车默认为普通音质)
0. 低音质
请输入cookie:(获取方法详见README)
######; 1&remember_me=y; 1&_token=47437######58
cookie设置成功!
成功登录账号听友47####!
请选择要使用的功能:
您好,感谢维护,下载普通音质音频格式都是m4a格式,能否改为mp3格式呢
你好,关于网页下载数量单日只能600个,我在另一个脚本的反馈中看见了这么两条:
1.“关于网页下载限制的问题,通过抓包客户端发现携带的cookie加了1&_device,只要把这个加上就能突破600的限制,和客户端一样无限制。”
2.“我刚才测试了一下,需要在这个网址下添加cookie才可以,https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/1701684976000?device=web&trackId=596490145&trackQualityLevel=2”
我根据提示在对应网址添加后,使用该脚本确实突破了单日下载数600的限制。但该脚本对于只能一页一页的去下载列表,对于音频数有几千条的作品而言,操作过于繁琐。
所以我想到在本软件config.json中的cookie中也同样加入“1&_device”,但是发现加入后,软件依然无法突破数量限制,我想应该是在解密页面加入“1&_device”才有效,但我不知道本软件应该如何去进行修改,所以提出此条建议。
我之前在加密音频解密软件项目里也提过issues,不过大佬你给出的解决方案我比较难做到,因为本人并不懂任何网络技术,抱歉。
还有这篇文章,也是讲注入“1&_device”的,“https://d3ac.xlog.app/she-zhi-cookie-rao-guo-xi-ma-la-ya-xia-zai-xian-zhi”
感谢所有技术大佬的无偿奉献!!!
喜马拉雅 APP 下载的大量文件 怎么 批量重命名
非常感谢做的这个工具!很方便。
另外,对于下载失败的音频,能增加一个重试的功能么?谢谢!
继续试用
您好:
由于部分专辑是带视频的,甚至没视频就无意义
例如:这个,教人做有养体操的
https://www.ximalaya.com/album/51074775
所以建议增加可以选择下载视频的功能
感谢
下载整个vip专辑资源的时候,如果某些文件标记了试听,则会导致该文件不能下载(但是在浏览器端可以通过嗅探工具等手动下载成功)
你好目前有几个问题
1.检测到当前ip不在**大陆,由于喜马拉雅官方限制,必须登录才能继续使用
实际上免费的部份(就是试听的部份)与免费书应该可以在没有cookie的情况下载
至少油猴插件的脚本是可以做的,如果可以的话,这个部份麻烦考虑看看能否施做
https://greasyfork.org/zh-TW/scripts/435495 ← 这是油猴那个脚本
2.能否增加自行设定下载间隔时间,目前程式是直接暴力全数下载,可能有被封号的风险
能否让用户自行设定下载间隔。
例如︰下完一个档案之后间隔30秒才下载下一个档案
最理想的状态是让用户设定一个区间,而程式在这个区间内随机取一个数,倒数完之后才进行下一个档案下载
例如︰用户设定下载间隔为30秒至180秒,那就下完一个档案后随机等待30秒~180秒,再下下一个档案,然后再随机等待此区间秒数
循环往替。
3.希望增加设定proxy的功能
就如同贵程式一开始检测IP是否在**大陆一样,某些书会有非**大陆IP,无法下载的问题,就算有vip也没用
必须要挂上代理转为**大陆IP才能够下载,而在chrome里可以直接对chrome挂代理,而不会影响到全局
目前贵程式如果想要下载此类书籍,我想到的只有改全局去套用代理才能够实现下载
故希望能够提供设定代理功能
4.这个是第三点的补充,是希望而非必要
能够提供批量测试喜玛拉雅站点代理是否能够使用的功能
网路上提供的免费**porxy,很多都显示可以用,但实际上是连不上喜玛拉雅的
如果有个测试工具可以以xxx.xxx.xxx.xxx xxxx (中间空格可为tab或:)
例如将下列proxy丢进程式里,由程式帮忙测试是否能够连接到喜玛拉雅
(就是测试本地IP挂上 proxy IP能否连上目标IP的程式)
14.103.24.20 8000
14.103.26.198 8000
223.215.177.206 8089
47.100.91.57 8080
121.46.201.241 80
121.230.208.226 7788
47.100.254.82 80
120.24.176.185 8080
106.14.255.124 80
60.12.168.114 9002
60.174.1.24 8089
114.231.82.137 8089
当然如果可以指定到页面是最好,直接相当于多出一个由自己所在地去测试
自己是否能够连上代理伺服器,并连接到需要用的网页的测试程式
以上几点,麻烦参考看看,谢谢
在不通过交互界面使用配置文件或者命令参数下载内容
非VIP账号,第一次初始化,第一次配置,第一次打开,能解析专辑名,但不管是下载单个声音,还是整个专辑,都提示已达上线,不管是试听的声音还是免费的声音也是一样,都无法下载。
专辑号34588643无法下载,一直报超时~
下载单个是可以的,下载整个专辑,或者专辑的部分音频 都是下载失败? 4.0 版本
Traceback (most recent call last):
File "/home/tailangjun/Share/AudioDownloader/Ximalaya-Downloader/cli.py", line 183, in
loop.run_until_complete(ximalaya.get_selected_sounds(sounds, album_name, start, end, headers, int(choice), number, path))
File "/opt/anaconda3/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/home/tailangjun/Share/AudioDownloader/Ximalaya-Downloader/main.py", line 249, in get_selected_sounds
sounds_info = await asyncio.gather(*tasks)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tailangjun/Share/AudioDownloader/Ximalaya-Downloader/main.py", line 153, in async_analyze_sound
sound_info[1] = self.decrypt_url(encrypted_url["url"])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/tailangjun/Share/AudioDownloader/Ximalaya-Downloader/main.py", line 285, in decrypt_url
result = context.call("getSoundCryptLink", {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_abstract_runtime_context.py", line 37, in call
return self._call(name, *args)
^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_external_runtime.py", line 92, in _call
return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_external_runtime.py", line 78, in eval
return self.exec(code)
^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/abstract_runtime_context.py", line 18, in exec
return self.exec(source)
^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_external_runtime.py", line 85, in exec
output = self._exec_with_tempfile(source)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_external_runtime.py", line 127, in _exec_with_tempfile
self._fail_on_non_zero_status(ret, stdoutdata, stderrdata)
File "/opt/anaconda3/lib/python3.11/site-packages/execjs/_external_runtime.py", line 134, in _fail_on_non_zero_status
raise ProcessExitedWithNonZeroStatus(status=status, stdout=stdoutdata, stderr=stderrdata)
execjs._exceptions.ProcessExitedWithNonZeroStatus: (101, '', 'Warning: The jjs tool is planned to be removed from a future JDK release\n/tmp/execjsoksz_o52.js:3:0 Expected an operand but found const\nconst r = new Uint8Array([188, 174, 178, 234, 171, 147, 70, 82, 76, 72, 192, 132, 60, 17, 30, 127, 184, 233, 48, 105, 38, 232, 240, 21, 47, 252, 41, 229, 209, 213, 71, 40, 63, 152, 156, 88, 51, 141, 139, 145, 133, 2, 160, 191, 11, 100, 10, 78, 253, 151, 42, 166, 92, 22, 185, 140, 164, 91, 194, 175, 239, 217, 177, 75, 19, 225, 94, 107, 125, 138, 242, 31, 182, 150, 15, 24, 226, 29, 80, 116, 168, 118, 28, 1, 186, 220, 158, 79, 59, 244, 119, 9, 189, 161, 74, 130, 221, 56, 216, 241, 212, 26, 218, 170, 85, 165, 153, 69, 238, 93, 255, 142, 3, 159, 215, 67, 33, 249, 53, 176, 77, 254, 222, 25, 115, 101, 148, 16, 13, 237, 197, 5, 58, 157, 135, 248, 223, 61, 198, 211, 110, 44, 54, 111, 52, 227, 4, 46, 205, 7, 219, 136, 14, 87, 114, 64, 104, 50, 39, 203, 81, 196, 43, 163, 173, 109, 108, 187, 102, 195, 37, 235, 65, 190, 113, 149, 143, 8, 27, 155, 207, 134, 123, 224, 129, 245, 62, 66, 172, 122, 126, 12, 162, 214, 90, 247, 251, 124, 201, 236, 117, 183, 73, 95, 89, 246, 181, 179, 83, 228, 193, 99, 6, 45, 112, 32, 154, 128, 230, 131, 206, 243, 57, 84, 146, 0, 35, 96, 250, 137, 36, 208, 103, 34, 68, 204, 231, 144, 120, 98, 202, 49, 210, 23, 200, 18, 86, 55, 121, 20, 199, 97, 167, 180, 169, 106])\n^\n/tmp/execjsoksz_o52.js:4:4 Expected an operand but found ,\n ,\n ^\n/tmp/execjsoksz_o52.js:16:0 Expected an operand but found const\nconst c = (e => {\n^\n/tmp/execjsoksz_o52.js:17:8 Expected an operand but found let\n let t = {};\n ^\n/tmp/execjsoksz_o52.js:18:33 Expected ) but found =>\n return e.forEach(((e, r) => t[e] = r)),\n ^\n/tmp/execjsoksz_o52.js:27:0 Expected an operand but found const\nconst f = i ? e => atob(e.replace(/[^A-Za-z0-9\\+\\/]/g, "")) : u ? t => e.from(t, "base64").toString("binary") : e => {\n^\n/tmp/execjsoksz_o52.js:32:12 Expected ; but found t\n let t, r, n, o = "";\n ^\n/tmp/execjsoksz_o52.js:33:17 Expected ; but found a\n for (let a = 0; a < e.length;)\n ^\n/tmp/execjsoksz_o52.js:33:37 Expected ; but found )\n for (let a = 0; a < e.length;)\n ^\n/tmp/execjsoksz_o52.js:36:8 Invalid return statement\n return o\n ^\n/tmp/execjsoksz_o52.js:37:4 Expected eof but found }\n }\n ^\n')
作者好,请问为什么我从来都没下载过任何付费音频,但一直有这个错误提示,导致从没成功下载过一个音频。非常感谢您
的付出和帮助!(目前人在国外)
你好,剛剛發現下載部分聲音的功能有bug,
我有一個專輯有一千多級,1-500沒問題,但501-1000下載完成後,發現雖然文件名開頭的數字是隊的,但標題仍然是從第一級開始
另外能否控制文件名是否要有編號? 發現有些專輯自己有編號,有時候可能兩者布疋配,
感謝!
我是有声书的爱好者,刚接触这个仓库,非常感谢作者提供这么好的下载器
有个问题,想要咨询下:
vip的playurl在不登录的状态下是无法显示的,登录的话,则可以。问题是我看到的链接是类似这样的:
'https://audiopay.cos.tx.xmcdn.com/download/1.0.0/storages/3d1d-audiopay/61/36/GKwRIaII1YUAABvQ_QJZR-0a.mp3?sign=3d7dd35f68c19d40ed2f44af34b3956c&buy_key=FM×tamp=1709656534549000&token=5078&duration=455'
看到资源后缀加入了一些参数,看着很像是token之类的东西
就是不清楚,这种预览链接是否有有效期呢?有效期有多久?
我这边下载的专辑大概2000条 初始化就会创建99条 99条并发宽带支撑不住 下载5条成功后直接后面的全部下载失败,再次尝试下载,直接提示下载失败
你好,
我發現當輸入下載部分聲音時,如果輸入的範圍大魚專輯最大聲音時,軟件會直接崩潰,
例如專輯只有1000,而我輸入了999 1001,軟件就會崩潰,
謝謝!
app.log
失败后再次尝试会
Traceback (most recent call last):
File "console-version.py", line 2, in
File "main.py", line 512, in run
File "asyncio\base_events.py", line 647, in run_until_complete
File "main.py", line 276, in get_selected_vip_sounds
File "main.py", line 217, in async_get_encrypted_url
KeyError: 'trackInfo'
[8260] Failed to execute script 'console-version' due to unhandled exception!
breadcrumbs.ts:111
[Player Error] player catch error: Error: innert Error: errorCode: 0; errorMsg: 当前的声音的地址无效
是不是下载太多了,然后当天就封了
[Player Error] player catch error: 今天操作太频繁啦,可以明天再试试哦~
请输入cookie:(获取方法详见README)
######; 1&remember_me=y; 1&_token=47437######58
cookie设置成功!
成功登录账号听友47####!
请选择要使用的功能:
0.3.9.1版本
win10系统
下载地址没法修改,修改下载地址后,无论是否登录,
打开程序,config.json自动被改回原状:{"cookie": "", "path": ""}
只登录,不修改下载地址,没有问题
如题,使用文稿更加方便阅读,麻烦作者考虑下增加文稿下载功能,谢谢。
拷入原来目录,启动认退。请楼主看看。
方向一:配置文件加入多个帐号切换的功能,1000的额度用完了,自动切换帐号,这个感觉限制还是很明显,毕竟很少人会有几个VIP帐号。
方向二(推荐):官方客户端下载好像没有1000个的限制,可以通过客户端下载xm文件,然后进行解密。
这里会涉及一个文件名还原的问题,下载下来的文件名都是转码过的,一个个手动改名恢复会很麻烦。所以解密完之后最好加入文件名还原成软件里看到的文件名的功能。
关于文件名还原,看下这个教程有没有参考价值:https://note.youdao.com/ynoteshare/index.html?id=6b7a9cf902907d4dc4fb97c394a5918e&type=note&_time=1682336799029
你好,這個軟件非常適合我用,但我遇到一些問題,整理如下→
非常感謝作者的辛苦付出!
原来的download目录下面,有些音频大小为0字节,还是提示“……已存在!”,然后“专辑全部选定声音下载完成!”,需要先手工删除下大小为0的音频后再次重试。
除了检查文件名,建议还可以再加个文件大小判断,如果为0字节,则也重新下载。
The below is error output when run.
while I use below link to get specific soud, it has response.
https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/1706705279276?device=web&trackId=64429939&trackQualityLevel=2
Ximalaya-Downloader-main/cli.py:11: DeprecationWarning: There is no current event loop
loop = asyncio.get_event_loop()
欢迎使用喜马拉雅下载器
在config文件中未检测到有效的下载路径,将使用默认下载路径,如果想要修改下载路径,请修改config.json文件中的path字段为你想要的下载路径
未检测到有效喜马拉雅登录信息,请2选择是否要登录:
ID为64429939的声音解析失败!
ID为86721652的声音解析失败!
ID为86721626的声音解析失败!
ID为86721620的声音解析失败!
ID为86721658的声音解析失败!
ID为251110561的声音解析失败!
ID为86721645的声音解析失败!
ID为86721664的声音解析失败!
ID为86721650的声音解析失败!
ID为86721649的声音解析失败!
ID为86721659的声音解析失败!
ID为86721630的声音解析失败!
ID为86721618的声音解析失败!
ID为86721654的声音解析失败!
ID为86721629的声音解析失败!
ID为86721622的声音解析失败!
ID为343611263的声音解析失败!
ID为86721656的声音解析失败!
ID为86721660的声音解析失败!
ID为86721648的声音解析失败!
ID为86721646的声音解析失败!
ID为86721662的声音解析失败!
ID为86721638的声音解析失败!
ID为86721633的声音解析失败!
ID为86721644的声音解析失败!
ID为86721635的声音解析失败!
ID为64429938的声音解析失败!
ID为86721623的声音解析失败!
ID为64439295的声音解析失败!
ID为251110562的声音解析失败!
ID为64439294的声音解析失败!
ID为86721625的声音解析失败!
ID为86721640的声音解析失败!
ID为86721651的声音解析失败!
ID为86721636的声音解析失败!
ID为86721657的声音解析失败!
ID为86721643的声音解析失败!
ID为86721627的声音解析失败!
ID为86721663的声音解析失败!
ID为343608351的声音解析失败!
ID为86721637的声音解析失败!
ID为86721632的声音解析失败!
ID为251110563的声音解析失败!
ID为86721616的声音解析失败!
ID为86721619的声音解析失败!
ID为86721634的声音解析失败!
ID为86721639的声音解析失败!
ID为86721661的声音解析失败!
ID为86721665的声音解析失败!
ID为86721642的声音解析失败!
ID为86721647的声音解析失败!
ID为86721621的声音解析失败!
ID为86721653的声音解析失败!
ID为86721641的声音解析失败!
ID为343612747的声音解析失败!
ID为86721628的声音解析失败!
ID为86721631的声音解析失败!
ID为86721655的声音解析失败!
Traceback (most recent call last):
File "/Users/hob_yu/Backup/PythonScripts/ximalay/github/Ximalaya-Downloader-main/cli.py", line 184, in
loop.run_until_complete(ximalaya.get_selected_sounds(sounds, album_name, start, end, headers, int(choice), number, path))
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
return future.result()
File "/Users/hob_yu/Backup/PythonScripts/ximalay/github/Ximalaya-Downloader-main/main.py", line 256, in get_selected_sounds
await asyncio.wait(tasks)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/tasks.py", line 368, in wait
raise ValueError('Set of coroutines/Futures is empty.')
ValueError: Set of coroutines/Futures is empty.
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x102ef4e20>
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.