首先找到 xm-sign 参数的js代码,断点调试,如下:
可见, xm-sign 的值是由函数u.getSign()生成的,直接进入该函数的内部看看
再次断点调试,可以发现,这里的 t 是喜马拉雅的服务器时间戳,由 time 这个包生成的,地址是:https://www.ximalaya.com/revision/time;而 e 就是现在的时间戳;两个小括号是100以内随机整数;花括号{himalaya-1570715660049}
整个被替换成 函数 l(e)
的值,进入该函数的内部:
这里传入函数的参数是himalaya-1570715660049
;返回值未知,直接复制这个返回值到Console运行看看
发现可以运行,而且返回值像md5编码? 此时最直接的想法就是把"himalaya-1570715660049"
这个参数md5试一下
结果是两个值一模一样!到此 xm-sign 的值就出来了
himalaya-服务器时间戳的md5编码
+(100以内随机数)
+服务器时间戳
+(100以内随机数)
+现在时间戳
范例代码:
"""
@ 功能:喜马拉雅有声读物下载
@ 作者:虫之吻
@ 时间:2019-10-10
"""
from queue import Queue
import threading
import requests
import hashlib
import random
import time
import re
import os
class XimaLaya(object):
def __init__(self, page_url):
self.headers = {
'User-Agent': 'Mozilla/5.0', 'Host': 'www.ximalaya.com'}
self.server_time_url = 'https://www.ximalaya.com/revision/time'
self.requests_url = 'https://www.ximalaya.com/revision/play/album'
self.page_url = page_url
self.queue = Queue()
def get_md5(self, str_time):
"""
获取md5字段
"""
return hashlib.md5('himalaya-{}'.format