酷狗音乐app 评论signature

文章目录

  • 声明
  • 目标
  • 加密参数定位
  • 翻页逻辑
  • 代码实现

声明

本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除!

目标

在这里插入图片描述
在这里插入图片描述
复制curl转python

# -*- coding: UTF-8 -*-
import requests
import json


headers = {
    "KG-DEVID": "164b01be4b8b37b759a0dbf7f918bc3e6f65ffd20a4f001014fa0e01f5706206732d46fdb3dff190338613e7e4e931b20ec20575366de8475843a37dc2a6617f7ed4b9ed6f921e60fb239462522c472163c2f6729e36147ba355dcde1b2d90edaafd32f1b75cccd9a6062fb77d91288d",
    "KG-CLIENTTIMEMS": "1701247879527",
    "KG-THash": "5d9e66d",
    "User-Agent": "Android11-AndroidPhone-12069-130-0-COMMENT-wifi",
    "KG-RC": "1",
    "KG-FAKE": "0",
    "KG-RF": "0098c118",
    "Content-Type": "application/json; charset=utf-8",
    "Host": "m.comment.service.kugou.com"
}
url = "http://m.comment.service.kugou.com/v1/cmtlist"
params = {
    "code": "fc4be23b4e972707f36b8a828a93ba8a",
    "clienttoken": "",
    "signature": "9db81d03c35b714f6f73ec636a3d0a4c",
    "mid": "334239931975782545528382737887498518928",
    "uuid": "f3d96b13323b04867443a3eaa976c6d0",
    "ret_cmt_card_media_info": "1",
    "show_star_cmts": "1",
    "hidden_cmt": "1",
    "reply_version": "1",
    "pagesize": "20",
    "tag": "5",
    "clienttime": "1701247879",
    "gitversion": "796919f",
    "ver": "10",
    "area_code": "1",
    "extdata": "bf7d67b1bc6d9f10891395fc8f6aa6dd",
    "p": "1",
    "dfid": "2TnT9N47Jln83dpfih1eheS3",
    "fakem": "1acf321ea88ab1da9c093ce610001bc17a0d",
    "appid": "1005",
    "is_show_hot_word": "1",
    "show_classify": "1",
    "clientver": "12069",
    "mixsongid": "411031988",
    "kugouid": "0"
}
data = {}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, params=params, data=data)

print(response.json())

在这里插入图片描述

本次主要是解决signature。

加密参数定位

直接搜索signature" 有很多结果:
在这里插入图片描述
点一个看着有点像的碰碰运气,点进去
在这里插入图片描述
hook一下这个getSign方法:

function main(){
    Java.perform(function(){
        let MusicSearchManager = Java.use("com.kugou.android.app.hicar.newhicar.voicesearch.MusicSearchManager");
        MusicSearchManager["getSign"].implementation = function (str, map, map2) {
            console.log(`MusicSearchManager.getSign is called: str=${str}, map=${map}, map2=${map2}`);
            let result = this["getSign"](str, map, map2);
            console.log(`MusicSearchManager.getSign result=${result}`);
            return result;
        };

    })
}


setImmediate(main)

hook评论翻页也没没啥反应,看一下return返回的啥方法
在这里插入图片描述
在这里插入图片描述

hook 这个a方法看看

function main(){
    Java.perform(function(){
        let ba = Java.use("com.kugou.common.utils.ba");
        ba["a"].overload('java.lang.String', 'java.lang.String').implementation = function (str, str2) {
            let result = this["a"](str, str2);
            console.log(`\nstr= ${str} \nstr2= ${str2}\nresult= ${result}`);
            return result;
        };

    })
}


setImmediate(main)

在这里插入图片描述
有反应了

str= appid=1005&channel=130&platform=1&pluginVersion=0&singerName=Kiiiu_&songHash=AAC5EC2144CB3E479C135F9B3EDCDF28&songId=33983713&usemkv=1&version=12069*s&iN#G70*
str2= utf-8
result= 4a6813f2f51992f2f6ec4226adf92380

在这里插入图片描述
可以确定ba.a是个md5,
但是这个str和我们要找的评论接口相关性貌似不大,里面的参数都是写死的

并且后面再翻页就hook不到东西了,至此怀疑评论不走这个a方法。

事实证明:hook错了。。。

signature 是32位看着也像md5

再尝试一下,翻了一下这个ba文件,发现也有个b方法使用的md5
在这里插入图片描述
感觉可疑的就hook一下

function main(){
    Java.perform(function(){
        let ba = Java.use("com.kugou.common.utils.ba");
        ba["b"].overload('java.lang.String').implementation = function (str) {
            let result = this["b"](str);
            console.log(`\nstr= ${str} \nresult= ${result}`);
            return result;
        };

    })
}

setImmediate(main)

在这里插入图片描述
入参很像,柳暗花明又一村,撞大运.jpg

OIlwieks28dk2k092lksi2UIkpappid=1005area_code=1clienttime=1701228738clienttoken=clientver=12069code=fc4be23b4e972707f36b8a828a93ba8adfid=2TnT9N47Jln83dpfih1eheS3extdata=c5748b5b2fb966f28b9a71af8290497dfakem=1acf321ea88ab1da9c093ce610001bc17a0dgitversion=796919fhidden_cmt=1is_show_hot_word=1kugouid=0mid=334239931975782545528382737887498518928mixsongid=439217749p=1pagesize=20reply_version=1ret_cmt_card_media_info=1show_classify=1show_star_cmts=1tag=5uuid=f3d96b13323b04867443a3eaa976c6d0ver=10{}OIlwieks28dk2k092lksi2UIkp


验证一下是不是标准md5

在这里插入图片描述
比较加密结果一致,确定也是标准md5。

hook到的第3页的一组结果

// md5入参
OIlwieks28dk2k092lksi2UIkpappid=1005area_code=1clienttime=1701234156clienttoken=clientver=12069cmtreturnserver=%7B%22newindex%22%3A%7B%22cmts%22%3A%22%22%2C%22index%22%3A0%7D%2C%22all%5Fstart%5Findex%22%3A40%2C%22scid%22%3A%22188165003%22%2C%22r%5Fsort%5Findex%22%3A%5B%5D%2C%22weightlistcount%22%3A15%7Dcode=fc4be23b4e972707f36b8a828a93ba8adfid=2TnT9N47Jln83dpfih1eheS3extdata=c5748b5b2fb966f28b9a71af8290497dfakem=1acf321ea88ab1da9c093ce610001bc17a0dgitversion=796919fhidden_cmt=1is_show_hot_word=1kugouid=0mid=334239931975782545528382737887498518928mixsongid=439217749p=3pagesize=20reply_version=1ret_cmt_card_media_info=1show_classify=1show_star_cmts=1tag=5uuid=f3d96b13323b04867443a3eaa976c6d0ver=10{}OIlwieks28dk2k092lksi2UIkp

// MD5结果
44db349dca5586f2b947d4b452d1ba4d

入参按着url参数拆一下方便查看:

OIlwieks28dk2k092lksi2UIkp
appid=1005
area_code=1
clienttime=1701234156
clienttoken=
clientver=12069
cmtreturnserver=%7B%22newindex%22%3A%7B%22cmts%22%3A%22%22%2C%22index%22%3A0%7D%2C%22all%5Fstart%5Findex%22%3A40%2C%22scid%22%3A%22188165003%22%2C%22r%5Fsort%5Findex%22%3A%5B%5D%2C%22weightlistcount%22%3A15%7D
code=fc4be23b4e972707f36b8a828a93ba8a
dfid=2TnT9N47Jln83dpfih1eheS3
extdata=c5748b5b2fb966f28b9a71af8290497d
fakem=1acf321ea88ab1da9c093ce610001bc17a0d
gitversion=796919f
hidden_cmt=1
is_show_hot_word=1
kugouid=0
mid=334239931975782545528382737887498518928
mixsongid=439217749
p=3
pagesize=20
reply_version=1
ret_cmt_card_media_info=1
show_classify=1
show_star_cmts=1
tag=5
uuid=f3d96b13323b04867443a3eaa976c6d0
ver=10
{}OIlwieks28dk2k092lksi2UIkp

大部分都是定值。extdata就是作品的hash标识,p就是页数,clienttime是当前时间戳,

翻页逻辑

cmtreturnserver解码之后

第二页

{"newindex":{"cmts":"","index":0},"all_start_index":29,"scid":"188165003","r_sort_index":[],"weightlistcount":15}

第三页
{"newindex":{"cmts":"","index":0},"all_start_index":40,"scid":"188165003","r_sort_index":[],"weightlistcount":15}

第四页 
{"newindex":{"cmts":"","index":0},"all_start_index":40,"scid":"188165003","r_sort_index":[],"last_page":{"last_index":30,"p":2},"weightlistcount":15}

第五页

{"newindex":{"cmts":"","index":0},"all_start_index":40,"scid":"188165003","r_sort_index":[],"last_page":{"last_index":56,"p":3},"weightlistcount":15}

第六页

{"newindex":{"cmts":"","index":0},"all_start_index":40,"scid":"188165003","r_sort_index":[],"last_page":{"last_index":82,"p":4},"weightlistcount":15}

第七页

{"newindex":{"cmts":"","index":0},"all_start_index":40,"scid":"188165003","r_sort_index":[],"last_page":{"last_index":104,"p":5},"weightlistcount":15}

没找到啥规律,经查看发现在上页的响应内容都有一个cmtreturnserver
在这里插入图片描述

请求下一页的时候携带上这个cmtreturnserver应该就可以实现翻页了。

至此以上所有流程基本都清晰了,接下来就是代码实现。

代码实现

# -*- coding: UTF-8 -*-
import time
import requests
import json
import hashlib
from urllib.parse import unquote


headers = {
    "KG-DEVID": "164b01be4b8b37b759a0dbf7f918bc3e6f65ffd20a4f001014fa0e01f5706206732d46fdb3dff190338613e7e4e931b20ec20575366de8475843a37dc2a6617f7ed4b9ed6f921e60fb239462522c472163c2f6729e36147ba355dcde1b2d90edbc881819d853b3c8ce9922044acf9fb3",
    "KG-CLIENTTIMEMS": "1701234156542",
    "KG-THash": "5d9e66d",
    "User-Agent": "Android11-AndroidPhone-12069-130-0-COMMENT-wifi",
    "KG-RC": "1",
    "KG-FAKE": "0",
    "KG-RF": "00988d3d",
    "Content-Type": "application/json; charset=utf-8",
    "Host": "m.comment.service.kugou.com"
}

def get_md5(sign_s):
    m = hashlib.md5()
    m.update(sign_s.encode(encoding='UTF-8'))
    sign = m.hexdigest()
    return sign

def get_kugou_commnet(pages):
    page = 1
    print(f"指定采集评论{pages}页,当前第{page}页:")
    ts = str(round(time.time()))

    params = {
        "code": "fc4be23b4e972707f36b8a828a93ba8a",
        "clienttoken": "",
        "mid": "334239931975782545528382737887498518928",
        "uuid": "f3d96b13323b04867443a3eaa976c6d0",
        "ret_cmt_card_media_info": "1",
        "show_star_cmts": "1",
        "hidden_cmt": "1",
        "reply_version": "1",
        "pagesize": "20",
        "tag": "5",
        "clienttime": ts,
        "gitversion": "796919f",
        "ver": "10",
        "area_code": "1",
        # "extdata": "5febf34a4835ef685b27c520d69ec608",
        "extdata": "bf7d67b1bc6d9f10891395fc8f6aa6dd",# 掌心之中
        # "extdata": "c5748b5b2fb966f28b9a71af8290497d",
        "p": str(page),
        "dfid": "2TnT9N47Jln83dpfih1eheS3",
        "fakem": "1acf321ea88ab1da9c093ce610001bc17a0d",
        "appid": "1005",
        "is_show_hot_word": "1",
        "show_classify": "1",
        "clientver": "12069",
        "mixsongid": "569900661",
        "kugouid": "0"
    }
    # print(params)

    sign_s = f"OIlwieks28dk2k092lksi2UIkpappid={params.get('appid')}area_code={params.get('area_code')}clienttime={params.get('clienttime')}clienttoken=clientver={params.get('clientver')}code={params.get('code')}dfid={params.get('dfid')}extdata={params.get('extdata')}fakem={params.get('fakem')}gitversion=796919fhidden_cmt=1is_show_hot_word=1kugouid=0mid={params.get('mid')}mixsongid={params.get('mixsongid')}p={params.get('p')}pagesize=20reply_version=1ret_cmt_card_media_info=1show_classify=1show_star_cmts=1tag=5uuid={params.get('uuid')}ver=10" + "{}OIlwieks28dk2k092lksi2UIkp"
    sign = get_md5(sign_s)
    # print(sign)
    params.update({"signature":sign})
    data = {}
    data = json.dumps(data, separators=(',', ':'))
    url = "http://m.comment.service.kugou.com/v1/cmtlist"
    response = requests.post(url, headers=headers, params=params, data=data)

    js_data = response.json()
    print(js_data)
    cmtreturnserver = js_data["cmtreturnserver"]
    # count = js_data["count"] # 总评论数
    # pages = count//20
    while True:
        if page < pages:
            page += 1

            print(f"指定采集评论{pages}页,当前第{page}页:")
            ts = str(round(time.time()))
            params.update({"clienttime":ts})
            # 翻页更新逻辑
            params.update({"cmtreturnserver":cmtreturnserver})
            params.update({"p":page})
            sign_s = f"OIlwieks28dk2k092lksi2UIkpappid={params.get('appid')}area_code={params.get('area_code')}clienttime={params.get('clienttime')}clienttoken=clientver={params.get('clientver')}cmtreturnserver={params.get('cmtreturnserver')}code={params.get('code')}dfid={params.get('dfid')}extdata={params.get('extdata')}fakem={params.get('fakem')}gitversion=796919fhidden_cmt=1is_show_hot_word=1kugouid=0mid={params.get('mid')}mixsongid={params.get('mixsongid')}p={params.get('p')}pagesize=20reply_version=1ret_cmt_card_media_info=1show_classify=1show_star_cmts=1tag=5uuid={params.get('uuid')}ver=10" + "{}OIlwieks28dk2k092lksi2UIkp"
            sign = get_md5(sign_s)
            # print(sign)
            params.update({"signature": sign})
            data = {}
            data = json.dumps(data, separators=(',', ':'))
            url = "http://m.comment.service.kugou.com/v1/cmtlist"
            response = requests.post(url, headers=headers, params=params, data=data)
            js_data = response.json()
            cmtreturnserver = js_data["cmtreturnserver"]
            # print(unquote(cmtreturnserver))
            print(js_data)
        else:
            break



if __name__ == '__main__':
    pages = 5
    get_kugou_commnet(pages)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载MySQL JDBC驱动的方法

说明 java代码通过JDBC访问MySQL数据库&#xff0c;需要MySQL JDBC驱动。 例如&#xff0c;下面这段代码&#xff0c;因为找不到JDBC驱动&#xff0c;所以执行会报异常&#xff1a; package com.thb;public class JDBCDemo {public static void main(String[] args) throws …

特征变换1

编译工具&#xff1a;PyCharm 有些编译工具不用写print可以直接将数据打印出来&#xff0c;pycharm需要写print才会打印出来。 概念 1.特征类型 特征的类型&#xff1a;“离散型”和“连续型” 机器学习算法对特征的类型是有要求的&#xff0c;不是任意类型的特征都可以随意…

Mybatisplus同时向两张表里插入数据[事务的一致性]

一、需求&#xff1a;把靶器官的数据&#xff0c;单独拿出来作为一个从表&#xff0c;以List的方式接收这段数据&#xff1b; 此时分析&#xff0c;是需要有两个实体的&#xff0c;一个是主表的实体&#xff0c;一个是从表的实体&#xff0c;并在主表实体新增一个List 字段来接…

Vue - Vue配置proxy代理,开发、测试、生产环境

1、新建三个环境的配置文件 在src同级目录也就是根目录下新建文件&#xff1a;.env.development&#xff08;开发环境&#xff09;、.env.test&#xff08;测试环境&#xff09;、.env.production文件&#xff08;生产环境&#xff09; 2、三个环境的配置文件 开发环境 .env…

木鸟途家美团......订民宿选哪个?看完让你不纠结

近日&#xff0c;中国旅游研究院在报告中提到&#xff0c;截至2023年6月&#xff0c;我国在线旅行预订用户规模达4.54亿&#xff0c;占网民整体的42.1%。民宿预订平台作为重要的组成部分&#xff0c;正在被更多人了解使用。当前民宿行业第一梯队木鸟、途家、美团三家&#xff0…

3dsMax插件Datasmith Exporter安装使用方法

3dsMax插件Datasmith Exporter安装使用方法 某些文件格式无法用Datasmith直接导入虚幻引擎&#xff0c;这些数据必须先被转换为Datasmith能够识别的文件格式。Datasmith Exporter插件就可以帮助您的软件导出可以被Datasmith导入虚幻引擎的.udatasmith格式文件。 在开始使用虚幻…

windows远程桌面登录,提示:“出现身份验证错误,要求的函数不受支持”

问题&#xff1a; windows登录远程桌面&#xff0c;提示&#xff1a;“出现身份验证错误&#xff0c;要求的函数不受支持”&#xff0c;如下图&#xff1a; 问题原因&#xff1a; windows系统更新&#xff0c;微软系统补丁的更新将 CredSSP 身份验证协议的默认设置进行了调…

PS是什么?PS的在线使用教程

Photoshop简介 AdobePhotoshop&#xff0c;简称“PS“Photoshop主要处理由像素组成的数字图像。Photoshop拥有强大的图像处理工具和绘图工具&#xff0c;可以有效地编辑图片。在最新版本的Photoshop中&#xff0c;甚至可以完成3D和视频的后期工作。 Photoshop是目前最强大的图…

上海线下活动 | LLM 时代的 AI 编译器实践与创新

今年 3 月份&#xff0c; 2023 Meet TVM 系列首次线下活动从上海出发&#xff0c;跨越多个城市&#xff0c;致力于为各地关注 AI 编译器的工程师提供一个学习、交流的平台。 12 月 16 日 2023 Meet TVM 年终聚会将重返上海&#xff0c;这一次我们不仅邀请了 4 位资深的 AI 编…

openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能

文章目录 openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能136.1 检查办法136.2 异常处理 openGauss学习笔记-136 openGauss 数据库运维-例行维护-检查数据库性能 136.1 检查办法 通过openGauss提供的性能统计工具gs_checkperf可以对硬件性能进行检查。 …

强化学习中的Q学习

Q学习&#xff08;Q-Learning&#xff09;是强化学习中的一种基于值的学习方法&#xff0c;用于在有限马尔可夫决策过程&#xff08;MDP&#xff09;中学习最优的动作策略。Q学习主要用于离散状态和离散动作的问题。 以下是Q学习的基本概念和步骤&#xff1a; Q-Value&#xf…

《C++ Primer》第10章 算法(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 10.4 再探迭代器&#xff08;P357&#xff09; 除了为每个容器定义的迭代器外&#xff0c;头文件 iterator 中还定义了额外的几种迭代器&#xff1a; 插入迭代器&#xff08;insert iterator&#xff09;&…

echarts折线图的线呈现动态效果

效果如图 let yData [222, 932, 66, 934, 111, 333, 0],xData ["测1", "测2", "测3", "测4", "测5", "测6", "测7"],datacoords [{coords: [],},];for (var i 0; i < xData.length; i) {datacoo…

Python streamlit指南,构建令人惊叹的可视化Web界面!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数据驱动的世界中&#xff0c;构建交互式、美观且高效的数据可视化应用变得至关重要。而Streamlit&#xff0c;作为Python生态系统中为开发者提供了轻松创建Web应用的利器。 本文将深入探讨Streamlit的方…

SS8812T 36V/1.6A 两通道 H 桥驱动芯片 替代DRV8812

SS8812T 为打印机和其它电机一体化应用提 供一种双通道集成电机驱动方案。 SS8812T 有两 路 H 桥驱动&#xff0c;每个 H 桥可提供最大输出电流 1.6A (在 24V 和 Ta 25C 适当散热条件下)&#xff0c;可驱动两 个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0…

分支和循环

通常来说&#xff0c;C语言是结构化的程序设计语言&#xff0c;这里的结构包括顺序结构、选择结构、循环结构&#xff0c;C语言能够实现这三种结构&#xff0c;如果我们仔细分析&#xff0c;我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

代理模式 1、静态代理 2、动态代理 jdk自带动态代理 3、Cglib代理

文章目录 代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cglib代理 来和大家聊聊代理模式 代理模式 代理模式&#xff1a;即通过代理对象访问目标对象&#xff0c;实现目标对象的方法。这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额外的功能操…

STM32 CUBEIDE Outline is disabled due to scalability mode

项目场景&#xff1a; 问题描述 Outline is disabled due to scalability mode 看不到函数 解决方案&#xff1a;

QT 项目中添加文件夹(分类文件)

为了更方便的整理项目的文件&#xff0c;添加文件夹把文件进行分类。 1.首先在项目文件中创建新的文件夹 2.把需要归类的文件放入新建的文件中 3.右键然后选择add..... 4.运行此程序&#xff0c;会报错因为文件路径改变了&#xff0c;需要在.pro中修改路径 注意事项 文件夹内部…

Java中的JMX的使用

文章目录 1. 定义和存在的意义2. 架构2.1 Instrumentation2.2 JMX Agent2.3 Remote Management 3. 启动和连接3.1 注册MBean3.2 有两个方式启动JMX Agent3.3 Remote Management(客户端) 4. MBeanServerConnection使用4.1 列出所有的MBean4.2 列出所有的Domain4.3 MBean计数4.4 …