写点什么

Python 蜻蜓 fm 有声书批量下载 支持账号登录 原创源码,斩获 offer

作者:程序媛可鸥
  • 2022 年 3 月 18 日
  • 本文字数:3198 字

    阅读完需:约 10 分钟

可以通过全局搜索试一下是哪个 js 生成的这个 sign 我全局搜索了一下


device_id




mian.一大堆.js?找到了生成 sign 的函数(需要自己分辨一下是一个 device_id: "MOBILESITE"的)


搜索其他关键字应该也是可以顺利找到的



这里的 sign 是 u 这个变量它是由 c 这个变量通过一堆加密处理得到的


我们可以控制台输出一下 u 和 c



所以我们就知道了 sign 实际是加密了请求的其他参数


一开始我误以为是单纯的 MD5 所以卡了好久(还进入函数内部看他具体是怎么实现的看的一头雾水)


其实代码已经告诉用的是


createHmac("md5", "fpMn12&38f_2e")


查了下 Hmac 发现就是一种现成的算法,还有不同的模式 MD5 是其中一种,需要一个秘钥


这里什么都告诉你了,用 Hmac-md5 秘钥是 fpMn12&38f_2e


找个在线加密的网站试了下,果然和刚才控制台输出的一样



python 的话需要 import


hmac 这个库


import hmac


import time


base_url = "https://audio.qingting.fm"


bookid = "294280"


id = "11590788"


access_token = ""


qingting_id =""


timestamp = str(round(time.time()*1000))


data = f"/audiostream/redirect/{bookid}/{id}?access_token={access_token}&device_id=MOBILESITE&qingting_id={qingting_id}&t={timestamp}"


message = data.encode('utf-8')


key = "fpMn12&38f_2e".encode('utf-8')


sign = hmac.new(key, message, digestmod='MD5').hexdigest()


whole_url = base_url+data+"&sign="+sign


print(whole_url)


得到一个音频可以做到了剩下的就是得到一堆了,其实我们得到每个音频的 id 就可以了


我请求的是这个接口


info_api = 'https://i.qingting.fm/capi/channel/{self.bookid}/programs/{self.version}?curpage={str(page)}&pagesize=30&order=asc'


version 在声书主页的源代码中,只要改 curpage 就可以翻页了


完整源码


import requests


import re


import hmac


import time


from tqdm import tqdm


from bs4 import BeautifulSoup


import os


import json


import sys


import urllib3


urllib3.disable_warnings()


class QingTing():


def init(self,user_id,password,bookurl,ifLogin):


self.ifLogin = ifLogin


self.user_id = user_id


self.password = password


self.session = requests.session()


self.session.headers.update({'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'})


self.login_url = "https://u2.qingting.fm/u2/api/v4/user/login"


self.qingting_id = ''


self.access_token = ''


self.bookurl = bookurl

self.bookurl = 'https://www.qingting.fm/channels/257790'

self.bookid = self.bookurl.split('/')[-1]


self.version = ''


self.qingtinghost = 'https://audio.qingting.fm'


self.save_path = ''


self.bookname = ''


def login(self,user_id,password):


data = {


'account_type': '5',


'device_id': 'web',


'user_id': user_id,


'password': password


}


response = self.session.post(self.login_url,data=data,verify=False)


if response.status_code==200:


temp = response.json()


errorno = temp['errorno']


errormsg = temp['errormsg']


if errorno == 0:


print('login successful!','登录成功!')


data = temp['data']


self.qingting_id = data['qingting_id']


self.access_token = data['access_token']


else:


print('Login failed','登录失败')


print(errormsg)


time.sleep(10)


sys.exit(0)


def __get_version(self):


response = self.session.get(url=self.bookurl,verify=False)


if response.status_code==200:


soup = BeautifulSoup(response.text,'lxml')


temp_bookname = soup.select('div.album-info-root > div.top > div.info.right > h1')[0].string


replaced_pattern = '[\/:*?"<>|]'


self.bookname = re.sub(replaced_pattern,' ',temp_bookname,flags=re.M +re.S)


if not os.path.exists(self.bookname):


os.makedirs(self.bookname)


matched = re.search('"version":"(\w+)"',response.text,re.S)


if matched:


version = matched.group(1)


self.version = version

return version

def __get_total_page(self):


self.__get_version()


page = 1


info_api = f'https://i.qingting.fm/capi/channel/{self.bookid}/programs/{self.version}?curpage={str(page)}&pagesize=30&order=asc'


response = self.session.get(info_api,verify=False)


if response.status_code==200:


temp = response.json()


total = temp['data']['total']


total_page = int(int(total)/30)+1


return total,total_page


def get_book_info(self):


total,total_page = self.__get_total_page()


print(self.bookname,'共{}集'.format(total))


for page in range(1,total_page+1):


info_api = f'https://i.qingting.fm/capi/channel/{self.bookid}/programs/{self.version}?curpage={str(page)}&pagesize=30&order=asc'


response = self.session.get(info_api,verify=False)


programs = response.json()['data']['programs']


for program in programs:

print(program['id'],program['title'])

yield program


def get_src(self,id):


bookid = self.bookid


access_token = self.access_token


qingting_id =self.qingting_id


timestamp = str(round(time.time()*1000))


data = f"/audiostream/redirect/{bookid}/{id}?access_token={access_token}&device_id=MOBILESITE&qingting_id={qingting_id}&t={timestamp}"


message = data.encode('utf-8')


key = "fpMn12&38f_2e".encode('utf-8')


sign = hmac.new(key, message, digestmod='MD5').hexdigest()


whole_url = self.qingtinghost+data+"&sign="+sign


return whole_url


def downloadFILE(self,url,name):


resp = self.session.get(url=url,stream=True,verify=False)


if resp.headers['Content-Type'] =='audio/mpeg':


content_size = int(int(resp.headers['Content-Length'])/1024)


with open(name, "wb") as f:


print("Pkg total size is:",content_size,'k,start...')


for data in tqdm(iterable=resp.iter_content(1024),total=content_size,unit='k',desc=name):


f.write(data)


print(name , "download finished!")


else:


errorno = resp.json()['errorno']


errormsg = resp.json()['errormsg']


print('没有权限下载,请登录已购此音频的账号。')


print('errorno:',errorno,errormsg)

最后

Python 崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS 等更加高级的领域。Python 可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python 可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

??Python 所有方向的学习路线??

Python 所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。


??Python 必备开发工具??

工欲善其事必先利其器。学习 Python 常用的开发软件都在这里了,给大家节省了很多时间。


??Python 全套学习视频??

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。


??实战案例??

学 python 就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。


因此在学习 python 的过程中一定要记得多动手写代码,教程只需要看一两遍即可。


??大厂面试真题??

我们学习 Python 必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。



用户头像

Python编程资料加Q群免费领取:419829237 2022.03.14 加入

还未添加个人简介

评论

发布
暂无评论
Python 蜻蜓fm有声书批量下载 支持账号登录 原创源码,斩获offer_Python_程序媛可鸥_InfoQ写作平台