Python JS逆向之Ku狗,实现搜索下载功能(附源码)

news2024/10/6 2:24:44

今天用Python来实现一下酷狗JS逆向,实现搜索下载功能

1、环境使用

  • Python 3.8
  • Pycharm

2、模块使用

import hashlib  --> pip install hashlib
import prettytable as pt --> pip install prettytable
import requests --> pip install requests
import time
import re
import json

3、实现思路

数据来源分析

1. 明确需求
    - 明确采集网站以及数据内容:
        网址: ku狗音乐网站
        数据: 音频链接 / 音频名称

2. 抓包分析
    - 通过开发者工具进行抓包分析
    I. 打开开发者工具: F12 / 右键点击检查选择network <网络>
    II. 刷新网页: 让数据内容重新加载一遍
    III. 找音频链接地址: 点击媒体 <media>
        音频链接: 
    IV. 分析音频链接地址, 是从哪里来的: 通过关键字搜索找到对应数据包位置
        <数据包接口, 存储音频相关数据信息>

代码实现步骤

1. 发送请求, 模拟浏览器对于url地址发送请求
    url地址: 分析得到数据包链接
2. 获取数据, 获取服务器返回响应数据
    开发者工具: response <响应>
3. 解析数据, 提取我们需要的数据内容
    数据: 音频链接 / 歌名
4. 保存数据, 保存音频内容
    对于音频链接发送请求, 获取二进制数据内容 <音频内容>

4、源码展示

接来下看看源码

# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
# 导入json
import json
# 导入制表模块
import prettytable as pt
import hashlib
import time
 
def md5_hash(date, word):
    text = [
    'NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt',
    'appid=1014',
    'bitrate=0',
    'callback=callback123',
    f'clienttime={date}',
    'clientver=1000',
    'dfid=2UHYNz3g5BlC1P5mfH2586l5',
    'filter=10',
    'inputtype=0',
    'iscorrection=1',
    'isfuzzy=0',
    f'keyword={word}',
    'mid=6cff5eec372eb97a1152cedd1d7c9fd5',
    'page=1',
    'pagesize=30',
    'platform=WebFilter',
    'privilege_filter=0',
    'srcappid=2919',
    'token=84444db71f298ea679c54e933acfdbe5065b7e0dd17b6bd7c2384cccde1f45c0',
    'userid=458167322',
    'uuid=6cff5eec372eb97a1152cedd1d7c9fd5',
    'NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'
        ]
    string = ''.join(text)
    md5 = hashlib.md5()
    md5.update(string.encode('utf-8'))
    signature = md5.hexdigest()
    print(signature)
    return signature
 
 
date = int(time.time() * 1000)
key_word = input('请输入你要下载的歌曲/歌手:')
signature = md5_hash(date=date, word=key_word)
# 1. 发送请求
link = 'https://complexsearch.***.com/v2/search/song'
# 模拟浏览器: headers 请求头 字典数据类型, 构建完整键值对
headers = {
    'Referer': 'https://www.***.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
}
# 请求参数
link_data = {
    'callback': 'callback123',
    'srcappid': '2919',
    'clientver': '1000',
    'clienttime': date,
    'mid': '6cff5eec372eb97a1152cedd1d7c9fd5',
    'uuid': '6cff5eec372eb97a1152cedd1d7c9fd5',
    'dfid': '2UHYNz3g5BlC1P5mfH2586l5',
    'keyword': key_word,
    'page': '1',
    'pagesize': '30',
    'bitrate': '0',
    'isfuzzy': '0',
    'inputtype': '0',
    'platform': 'WebFilter',
    'userid': '458167322',
    'iscorrection': '1',
    'privilege_filter': '0',
    'filter': '10',
    'token': '84444db71f298ea679c54e933acfdbe5065b7e0dd17b6bd7c2384cccde1f45c0',
    'appid': '1014',
    'signature': signature,
}
# 发送请求
response = requests.get(url=link, params=link_data, headers=headers)
"""
2. 获取数据
3. 解析数据
"""
html_data = re.findall('callback123\((.*)', response.text)[0].replace(')', '')
# 把json字符串, 转成字典数据
json_data = json.loads(html_data)
tb = pt.PrettyTable()
tb.field_names = ['序号', '歌名', '歌手', '专辑', 'ID']
lis = []
num = 1
# for循环遍历
for index in json_data['data']['lists']:
    dit = {
        '歌名': index['SongName'],
        '歌手': index['SingerName'],
        '专辑': index['AlbumName'],
        'ID': index['EMixSongID'],
    }
    lis.append(dit)
    tb.add_row([str(num), index['SongName'], index['SingerName'], index['AlbumName'], index['EMixSongID']])
    num += 1
 
print(tb)
 
 
def save(music_id):

    # 请求链接, 数据包链接地址
    url = 'https://wwwapi.***.com/yy/index.php'
    # 请求参数 -> 使用data字典接收请求参数
    data = {
        'r': 'play/getdata',
        # 'callback': 'jQuery1910438191389285846_1693915941407',
        'dfid': '2UHYNz3g5BlC1P5mfH2586l5',
        'appid': '1014',
        'mid': '6cff5eec372eb97a1152cedd1d7c9fd5',
        'platid': '4',
        'encode_album_audio_id': music_id,
        '_': '1693915941408',
    }
    # 发送请求 -> 返回响应对象 <Response [200]>
    response = requests.get(url=url, params=data, headers=headers)

    # 歌名
    audio_name = response.json()['data']['audio_name']
    # 音频链接
    play_url = response.json()['data']['play_url']
    # 对于音频链接发送请求, 获取二进制数据
    music_content = requests.get(url=play_url, headers=headers).content
    # 保存到本地文件夹 \ 转义字符串
    with open('music\\' + audio_name + '.mp3', mode='wb') as f:
        # 写入内容
        f.write(music_content)
 
    print(play_url, audio_name)
 
page = input('请输入你想要下载歌曲序号 / 全部下载<0>: ')
try:
    if page == '0':
        for li in lis:
            save(music_id=li['ID'])
    else:
        save(music_id=lis[int(page)-1]['ID'])
except Exception as e:
    print('你可能输入有误', e)

5、效果展示

最后就全部爬取到手了

担心大家看不懂代码,我特意录制了视频详细讲解,跟代码一起打包好了,文章最后的名片自取即可~

6、最后

好了,分享就到这结束,下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习从入门到入土

1. 数据操作 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 0-d 一个类别&#xff1a; 1.0 1-d 一个特征向量(一维矩阵)&#xff1a;[1.0, 2.7, 3.4] 2-d 一个样本-特征矩阵-(二维矩阵) 3-d RGB图片 &#xff08;宽x高x通道&#xff09;- 三维数组 4-d 一个RGB…

selenium自动化测试入门,一篇足矣

Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。 Selenium是用于自动化控制浏览器做各种操作&#xff0c;打开网页&#xff0c;点击按钮&#xff0c;输入表单等等&#xff0c;可以模拟各种人工操作浏览器的功…

共享WiFi贴项目怎么实施与运营,微火为你提供高效解答!

共享WiFi贴是一项有前景的商业项目&#xff0c;不仅可以满足用户对网络的需求&#xff0c;还可以为创业者带来盈利的机会。那么&#xff0c;我们来看看如何有效地开展共享WiFi贴项目。 最重要的是选择合适的位置。共享WiFi贴项目的成功与否很大程度上取决于位置选择。优先选择人…

web前端之float布局与flex布局

float布局 <style>.nav {overflow: hidden;background-color: #6adfd0; /* 导航栏背景颜色 */}.nav a {float: left;display: block;text-align: center;padding: 14px 16px;text-decoration: none;color: #000000; /* 导航栏文字颜色 */}.nav a:hover {background-col…

示例-安装office2016图文教程简体中文下载安装包

目录 简介 步骤 总结 简介 Office 2016作为一款办公软件套件&#xff0c;下载和安装 都具有许多令人印象深刻的特点。让我来为你介绍一下&#xff1a;Office 2016注重实现跨平台的一致性。无论你是在Windows、Mac、iOS还是Android上使用Office&#xff0c;你都可以享受到相似…

软件测试之白盒测试

白盒测试 白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程&#xff0c;而不测试软件产品的功能&#xff0c;用于纠正软件系统在描述、表示和规格上的错误&#xff0c…

「回到县城」正成为大学生就业的无奈选择

现如今&#xff0c;上大学已经不再是当年的天之骄子&#xff0c;现在的大学升学率极高&#xff0c;而毕业就业率却与之相反。 只有少数人能成为优秀的人&#xff0c;而竞争激烈的结果只有更少的人获得胜利。 想象一下&#xff0c;在大城市里打拼&#xff0c;就像千军万马争夺…

图像分割基础,点、线、孤立点检测(数字图像处理概念 P7)

文章目录 基础特性边缘检测孤立点检测线检测全局阈值处理 分割将图像细分成 构成他的子区域或对象 异常图像分割是最困难的图像处理之一&#xff0c;分割的程度取决于问题 基础特性 边缘检测 孤立点检测 线检测 全局阈值处理

Django — 介绍和搭建

目录 一、介绍二、虚拟环境1、作用2、创建2.1、安装虚拟环境模块2.2、创建文件夹2.3、配置环境变量 三、项目创建四、目录介绍1、manage.py2、__ init __.py3、asgi.py4、settings.py5、urls.py6、wsgi.py 五、启动服务1、配置启动服务2、从终端启动 六、创建子应用1、子应用2、…

小程序中如何(批量)删除会员卡

因为一些原因&#xff0c;可能需要删除会员卡。下面我将介绍一下小程序中如何删除会员卡的步骤&#xff0c;包括批量删除会员卡的操作。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要删除的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2…

【深度学习实验】前馈神经网络(八):模型评价(自定义支持分批进行评价的Accuracy类)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. __init__(构造函数) 2. update函数(更新评价指标) 5. accumulate(计算准确率) 4. reset(重置评价指标) 5. 构造数据进行测试 6. 代码整合 一、实验介绍 本文将实…

基于Yolov8的工业小目标缺陷检测(5):大缺陷小缺陷一网打尽的轻量级目标检测器GiraffeDet,暴力提升工业缺陷检测能力

💡💡💡本文改进:大小缺陷一网打尽的GiraffeDet,提升处理低分辨率图像和小物体等更困难的检测能力。 GiraffeDet | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.727 收录专栏: 💡💡💡深度学习工业缺陷检测 :http://t.csdn.cn/fVSgs ✨✨✨提供…

【一】Spring Cloud 系列简介

Spring Cloud 系列简介 简介&#xff1a;从单体架构到分布式架构&#xff0c;再到微服务架构&#xff0c;一路经历走来spring框架也一直在与时俱进&#xff0c;回顾下来感觉做Java开发就是基于spring开发&#xff0c;spring也一路发展出了spring boot&#xff0c;在此基础上发…

阿里云服务器u1和经济型e系列性能差异?哪个比较好?

阿里云服务器经济型e实例和云服务器u1有什么区别&#xff1f;同CPU内存配置下云服务器u1性能更强&#xff0c;u1实例价格也要更贵一些。经济型e实例属于共享型云服务器&#xff0c;不同实例vCPU会争抢物理CPU资源&#xff0c;并导致高负载时计算性能波动不稳定&#xff0c;而云…

LLMs资源

一、ChatGPT 《中科院学术专业版 ChatGPT》&#xff1a; gpt_academic项目针对了中科院日常科研工作&#xff0c;基于 ChatGPT 专属定制了一整套实用性功能&#xff0c;用于优化学术研究以及开发日常工作流程。其中内置的工具&#xff0c;包括但不限于以下这些&#xff1a;学术…

软件测试的理论基础1

软件的生命周期 可行性研究和计划&#xff08;立项&#xff09; 需求分析 概要设计&#xff08;测试计划&#xff09; 详细设计&#xff08;测试方案&#xff09; 实现&#xff08;开发阶段&#xff1b;包含单元测试&#xff09; 组装测试&#xff08;集成测试&#xff09; 确…

十六)Stable Diffusion教程:出图流程化

今天说一个流程化出图的案例&#xff0c;适用很多方面。 1、得到线稿&#xff0c;自己画或者图生图加线稿lora出线稿&#xff1b;如果想sd出图调整参数不那么频繁细致&#xff0c;则线稿的素描关系、层次、精深要表现出来&#xff0c;表现清楚。 2、文生图&#xff0c;seed随机…

kafka的 ack 应答机制

目录 一 ack 应答机制 二 ISR 集合 一 ack 应答机制 kafka 为用户提供了三种应答级别&#xff1a; all&#xff0c;leader&#xff0c;0 acks &#xff1a;0 这一操作提供了一个最低的延迟&#xff0c;partition的leader接收到消息还没有写入磁盘就已经返回ack&#x…

PyCharm 远程debug 快速上手

一、方法 1. 配置远程解释器&#xff08;简单高效&#xff0c;强烈推荐&#xff01;&#xff01;&#xff01;&#xff09; 要求: 通过 SSH 从本地机器访问远程服务器&#xff0c;使用任何预定义的端口从远程服务器访问本地机器&#xff0c;最好关掉vpn等网络代理服务。 常见…

中通快递一键查询,轻松掌握物流信息

在如今的快速发展的电商时代&#xff0c;快递已成为人们生活中不可或缺的一部分。随着快递业务的繁荣&#xff0c;快递公司也纷纷推出了各种查询方式&#xff0c;方便顾客随时掌握自己包裹的物流信息。在这其中&#xff0c;中通快递无疑是许多人选择的首选。下面&#xff0c;我…