吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14388|回复: 269
收起左侧

[Python 原创] 【20220515更新】【JS逆向解密】【异步协程】喜马拉雅有声小说下载程序

    [复制链接]
话痨司机啊 发表于 2022-5-13 23:37
本帖最后由 话痨司机啊 于 2022-11-12 19:01 编辑

【多线程源码程序下载】https://pan.baidu.com/s/1MuC6H_EwnmAxM0_YuEzIFg?pwd=3ikq 提取码: 3ikq
【异步程序下载源码】https://pan.baidu.com/s/1ThCKKGlTJfQBu951soLFIQ?pwd=quzw 提取码: quzw
【演示说明下载】https://pan.baidu.com/s/1RgZ-X8YNk2rGfHRp3fJK6g?pwd=1cbn 提取码: 1cbn
喜马拉雅下载程序成品EXE】链接: https://pan.baidu.com/s/1ZbeHr4FGgunKGPHsbAFsfg?pwd=t5wm 提取码: t5wm 【20221112更新】

【特别说明】


坑1:对于执行源码的朋友,你们得改一下 execjs库的源码,路径是所在库lib/site-packages/execjs/_external_runtime.py 第99行 增加个encoding = 'utf-8',应该属于源码库的bug,如果js代码里没有特殊字符是不会报错的。
坑2:要安装Nodejs  下载地址:https://nodejs.org/zh-cn/download/ ,windows自带的 'JScript'有可能执行不了扣下来的JS代码。(成品运行不了也需要安装这个Nodejs,log日志不报错应该就是这个原因)
1.jpg

特别说明截图:
111.jpg
效果图:

1.jpg

2.jpg

3.jpg


22.jpg

用异步协程写了一个程序,主代码如下(感觉异步写起来简单很多):
[Python] 纯文本查看 复制代码
import asyncio
import logging

import aiofiles
import aiohttp
from rich.console import Console

from contants.contants import NetConstant
from untils.util import *
from untils.ximalaya_execjs import *

logging.basicConfig(level=logging.INFO, 
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='ximalaya.log',
                    filemode='a')
                    
                    
class Ximalaya:
    def __init__(self) -> None:
        # 初始化解密类
        self.exjs = Execjs_Xi_Ma()
        # 专辑api接口
        self.albumId_url = 'https://www.ximalaya.com/revision/album/v1/getTracksList'
        # 音频下载api接口
        self.soundapi_url = 'https://mobile.ximalaya.com/mobile-playpage/track/v3/baseInfo'
        # 初始化常量类
        self.contents = NetConstant()
        # 初始化输出类
        self.console = Console()

    @retry(logger=logging)
    async def get_album_tracks_list(self,session:aiohttp.ClientSession,id:str,pageNum:int) -> list:
        '''
        获取专辑列表
        '''
        params = {'albumId':id,'pageNum':pageNum}

        async with session.get(self.albumId_url,headers=self.contents.headers,params=params) as response:
            album_list = await response.json(content_type='text/plain',encoding='utf-8')
            return album_list['data']["tracks"]

    async def js_from_string(self,session,trackID:str) -> str:
        '''
        解密地址
        '''
        url = f'{self.soundapi_url}/{time.time()}'
        params = {'device':'web','trackId':trackID}
        async with session.get(url,headers=self.contents.headers,params=params) as response:
            _result = await response.json(content_type='application/json',encoding='utf-8')
            result = _result['trackInfo']['playUrlList'][0]['url']
            return self.exjs.js_from_string(result)

    @retry(logger=logging)
    async def tracks_downloads(self,session:aiohttp.ClientSession,url:str,filename:str) -> list:
        '''
        下载并保存音频
        '''

        async with session.get(url,headers=self.contents.headers) as response:
            mkdir(os.path.dirname(filename))
            await self.save_audio(await response.read(),filename)
    
    @retry(logger=logging)
    async def save_audio(self, content:bytes, filename:str) -> None:
        '''
        保存音频
        '''
        async with aiofiles.open(filename, 'wb') as f:
            await f.write(content)
            now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
            self.console.print(f'[yellow]创建时间:{now}\n {filename}  下载完成!')
            self.console.print(f"{'[blue]-'*100}")

    def user_input(self) -> str:
        '''
        获取用户输入
        '''
        _url = self.console.input('请输入专辑网址:')
        # _url = 'https://www.ximalaya.com/album/9723091'
        _file_name = self.console.input('请输入保存的专辑文件夹名称:')
        _file_name = _file_name if _file_name else '合辑'
        file_name = filename_filter(_file_name)
        id_url = _url.split('/')[-1]
        return id_url,file_name

    async def main(self):
        id,file_name = self.user_input()
        pageNum = 1
        async with aiohttp.ClientSession() as session:
                # 异步获取pageNum错误会报超时,未设置pageNum边界,取消timeout
                # async with async_timeout.timeout(10):
                while True:
                    result = await self.get_album_tracks_list(session,id,pageNum)
                    pageNum += 1
                    for item in result:
                        title = item['title']
                        trackId = item['trackId']
                        url = await self.js_from_string(session,trackId)
                        await self.tracks_downloads(session,url,f'{file_name}/{title}.m4a')


if __name__  == "__main__":
    ximalaya = Ximalaya()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(ximalaya.main())

免费评分

参与人数 36吾爱币 +34 热心值 +32 收起 理由
yjn866y + 1 + 1 热心回复!
大谦世界 + 1 谢谢@Thanks!
simonliu009 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
supersup + 1 谢谢@Thanks!
chiao + 1 + 1 谢谢@Thanks!
likeOk + 1 + 1 我很赞同!
ylym8888 + 1 谢谢@Thanks!
Tony2009 + 1 谢谢@Thanks!
skywall + 1 + 1 谢谢@Thanks!
隔江高唱后庭花 + 1 + 1 谢谢@Thanks!
wanlgh + 1 + 1 谢谢@Thanks!
qkqi01 + 1 + 1 谢谢@Thanks!
laozhangty + 1 + 1 我很赞同!
leonchanit + 1 谢谢@Thanks!
yy710 + 1 + 1 谢谢@Thanks!
人生似修行 + 1 + 1 谢谢@Thanks!
Kukubu + 1 + 1 我很赞同!
杨千嬅 + 1 + 1 我很赞同!
hshcompass + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
轻烟125 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
18696766677 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
a8915171 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
notcher + 1 + 1 谢谢@Thanks!
Flymonkey + 1 + 1 我很赞同!
鸽王小白 + 1 + 1 谢谢@Thanks!
lys76 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
98521199 + 1 我很赞同!
thegodone + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
superdry12 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
xiaoyinggaofei + 1 + 1 谢谢@Thanks!
fanvalen + 2 + 1 我很赞同!
38342175 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
tomyyy2 + 1 谢谢@Thanks!
yyb414 + 1 + 1 热心回复!
sxwa059587 + 1 + 1 我很赞同!
MudMir + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 话痨司机啊 发表于 2022-5-15 10:32
ookk 发表于 2022-5-15 09:13
异步封装喜马拉雅下载程序/ximalaya.py
请输入专辑网址:https://www.ximalaya.com/album/4920505
请输入 ...

1.jpg


报错或者无法运行解决办法安装nodejs,下载地址:https://nodejs.org/zh-cn/download/


感谢回复报错信息!

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
luxingyu329 + 1 + 1 安装了nodejs 还是报缺少标识符
ookk + 1 + 1 谢谢@Thanks!

查看全部评分

头像被屏蔽
wanlinwo 发表于 2022-5-14 08:16
 楼主| 话痨司机啊 发表于 2023-2-22 14:13
qkqi01 发表于 2023-2-22 08:40
它可以积分兑换会员,不能也像喜马一样加cookies吗

https://www.52pojie.cn/thread-1749299-1-1.html

不需要积分或者会员就可全部下载懒人听书的内容
ookk 发表于 2022-5-15 09:13
异步封装喜马拉雅下载程序/ximalaya.py
请输入专辑网址:https://www.ximalaya.com/album/4920505
请输入保存的专辑文件夹名称:gdg
Traceback (most recent call last):
  File "D:/异步封装喜马拉雅下载程序/ximalaya.py", line 107, in <module>
    loop.run_until_complete(ximalaya.main())
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 616, in run_until_complete
    return future.result()
  File "D:/异步封装喜马拉雅下载程序/ximalaya.py", line 100, in main
    url = await self.js_from_string(session,trackId)
  File "D:/异步封装喜马拉雅下载程序/ximalaya.py", line 53, in js_from_string
    return self.exjs.js_from_string(result)
  File "D:\异步封装喜马拉雅下载程序\untils\ximalaya_execjs.py", line 22, in js_from_string
    return self.context.call('x',js_string)
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_abstract_runtime_context.py", line 37, in call
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_external_runtime.py", line 92, in _call
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_external_runtime.py", line 78, in _eval
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_abstract_runtime_context.py", line 18, in exec_
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_external_runtime.py", line 88, in _exec_
  File "C:\Users\Administrator\PycharmProjects\pythonProjectTest1\venv\lib\site-packages\pyexecjs-1.5.1-py3.8.egg\execjs\_external_runtime.py", line 167, in _extract_result
execjs._exceptions.ProgramError: SyntaxError: 缺少标识符
laos 发表于 2022-5-13 23:49
只是AES加密的话都不用调js啊
HUIANG 发表于 2022-5-13 23:52
不懂,演示还是实用的。
amscracker 发表于 2022-5-14 00:50
本帖最后由 amscracker 于 2022-5-14 01:08 编辑

3.7版本好像有问题!输入后挂逼了
3. image.png
amscracker 发表于 2022-5-14 01:01
输入要创建的合集然后就没反应了就抛异了
 楼主| 话痨司机啊 发表于 2022-5-14 01:54
本帖最后由 话痨司机啊 于 2022-5-14 02:05 编辑
amscracker 发表于 2022-5-14 00:50
3.7版本好像有问题!输入后挂逼了
3.

我也进的坑,得改python库的源码,毕竟是外国人写的东西,不适合中国编码,跟版本没关系,我用的3.6编译的exe文件也一样执行了,就是库的设计的问题。
 楼主| 话痨司机啊 发表于 2022-5-14 02:08
laos 发表于 2022-5-13 23:49
只是AES加密的话都不用调js啊

他的key vi pending都是用二进制字符偏移量的生成的,最后解码的时候用了个js函数还原偏移量了,具体的数值我懒得找,直接都扣下来了,对了,还有个base64url也是自定义的字典。
头像被屏蔽
shayu2021 发表于 2022-5-14 07:09
提示: 作者被禁止或删除 内容自动屏蔽
ruoshuisanqian 发表于 2022-5-14 07:37
感谢大佬分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 20:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表