酷狗音乐app 评论signature

news2024/11/16 6:00:30

文章目录

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

声明

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

目标

在这里插入图片描述
在这里插入图片描述
复制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)

在这里插入图片描述

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

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

相关文章

SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

SQL SELECT INTO 语句 SELECT INTO 语句将数据从一个表复制到一个新表中。 SELECT INTO 语法 将所有列复制到新表中&#xff1a; SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition;只复制一些列到新表中&#xff1a; SELECT column1, column2, colu…

MySQL三大日志详细总结(redo log undo log binlog)

MySQL日志 包括事务日志&#xff08;redolog undolog&#xff09;慢查询日志&#xff0c;通用查询日志&#xff0c;二进制日志&#xff08;binlog&#xff09; 最为重要的就是binlog&#xff08;归档日志&#xff09;事务日志redolog&#xff08;重做日志&#xff09;undolog…

数据结构(超详细讲解!!)第二十六节 图(上)

1.基本概念 图&#xff08;Graph&#xff09;是一种较线性表和树更为复杂的非线性结构。是对结点的前趋和后继个数不加限制的数据结构&#xff0c;用来描述元素之间“多对多”的关系(即结点之间的关系是任意的)。 一个图G &#xff08;V&#xff0c;E&#xff09;由顶点&…

从谷歌搜索结果出现 AI 生成的图片谈起:AI的利与弊

随着人工智能&#xff08;AI&#xff09;的不断发展&#xff0c;其应用领域也越来越广泛。谷歌搜索是现代人日常生活中的一个常用工具&#xff0c;经常用于获取各种信息。最近&#xff0c;谷歌搜索结果中甚至出现了由AI生成的图片&#xff0c;这引发了人们对AI技术的讨论。 首…

CentOS7搭建Kubernetes集群

环境准备&#xff1a;配置好静态IP地址的Centos7&#xff08;2核、master内存3GB、slave内存2GB&#xff09;。 搭建概述&#xff1a;先将一台虚拟机搭建为master、随后克隆出两台虚拟机作为从节点。 虚拟机主机名和IP地址&#xff1a; 主机名IP地址master192.168.138.110sl…

vue3高德地图使用,地址搜索,地址逆解析

在vue3项目里使用高德地图 高德地图文档 先在项目的index.html页面里添加一些东西 <script type"text/javascript">window._AMapSecurityConfig {securityJsCode: "xxxxxxxxxxxxx", //高德安全码};</script> <script src"https://…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …

外汇天眼:在QOINTEC投资需缴纳分成费才给出金?这合理么?

一般来说&#xff0c;在正规的平台上申请出金是不需要缴纳什么费用的&#xff0c;除非有一些特殊情况&#xff0c;像低额出金、没有交易就申请出金等情况下&#xff0c;或许会让你缴纳一定的手续费或者隔夜利息费等&#xff08;不同的平台有不同的规则&#xff09;&#xff0c;…

python爬取robomaster论坛数据,作为后端数据

一. 内容简介 python爬取robomaster论坛数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…

LLM 分布式训练框架 | DeepSpeed与Accelerate

&#x1f680; 简单记录下根据网上资料&#xff08;如Reference中所列&#xff09;所学到的一些知识&#xff0c;这里主要介绍的是deepspeed分布式训练框架相关概念。 &#x1f604;小日记&#xff1a;今天太舒服了&#xff0c;早上跑了6km&#xff0c;晚上吃了养生菌菇火锅~ …

分布编译和注释

文章目录 分布编译预处理编译汇编链接 注释单行注释多行注释预处理注释 总结 分布编译 上一节使用 gcc main.c就生成了a.exe的可执行文件&#xff0c;提到了将main.c文件生成a.exe实际上执行了以下四步&#xff1a; 预处理编译汇编链接   每一步都有单独的指令&#xff0c;而…

C++学习之继承中修改成员权限细节

看看下面的代码 这是错误的 class A { public:int x 10; }; class B :public A {using A::x;int x 100; };看看函数 class A { public:void fun(){cout << "uuuu" << endl;} }; class B :public A { public:using A::fun;void fun(){cout << …

每天学习一点点之 MySQL TINYINT

我已经不是第一次遇到关于 TINYINT 的问题了。在 MySQL 中&#xff0c;当我们将某个字段设置为 TINYINT&#xff0c;随着业务的扩展&#xff0c;我们可能会发现 TINYINT 的范围无法满足需求。这时需要修改字段属性。但如果表的数据量很大&#xff0c;或者由于分表导致涉及的表数…

AI虚拟数字人——营销宣传领域的新亮点

AI生活节即将到来&#xff0c;邀请消费者共同探索生活小妙趣&#xff0c;为美好生活注入新的想象。AI一词我们过去可能听的比较多&#xff0c;听到最多的可能就是AI虚拟数字人了。这年头&#xff0c;打造一个AI主播、虚拟数字人已经屡见不鲜了&#xff0c;因为AI数字人拥有强大…

数字孪生3D场景开发工具:弥补不足,开拓全新可能

随着数字化时代的来临&#xff0c;越来越多的企业和行业开始探索数字孪生技术的应用。数字孪生是指通过数字技术将现实世界中的物体、场景等复制到虚拟世界中&#xff0c;以实现实时监测、预测和优化。然而&#xff0c;在数字孪生的发展过程中&#xff0c;一些不足也逐渐浮现。…

AndroidStudio - 新版本 Logcat 使用详解

最近这俩天正好有时间给自己做一下减法&#xff0c;忘记是去年还是今年&#xff0c;在升级 AndroidStudio 后使用 Logcat查看日志的方式也发生了一些变化&#xff0c;虽然一直在使用&#xff0c;但每当看到之前还未关闭 Logcat 命令行工具额昂也&#xff0c;就感觉可能还存在知…

基于springboot的社区团购系统设计

摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统&#xff0c;来满足用户团购的需求。 本社区团购系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首先对系统进行了需求分析&…

手持机|三防智能手机_4寸/5寸/6寸安卓系统三防手机PDA手持终端方案

随着科技的不断发展&#xff0c;三防手持机作为一种多功能设备&#xff0c;正逐渐在各行业得到广泛应用。这款手持机采用高性能处理器&#xff0c;支持高精度北斗定位和工业本安防爆功能&#xff0c;并具备IP67级防水防尘性能和1.5米防跌落能力。因此&#xff0c;它在仓储管理、…

C语言进阶之笔试题详解(2)

前言 这里的内容包括二维数组笔试题和指针笔试题&#xff0c;供给读者对这部分知识进行加深和巩固。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 前言 笔试题 二维数组 题目…

nvm 下载node时候下载不到npm包的解决方法

个人博客链接 公众号-nvm 下载node时候下载不到npm包的解决方法 求关注 可以跳过的背景 最近项目比较有空&#xff0c;所以就可以有时间写一些demo&#xff0c;主要测试下react的一些语法&#xff0c;毕竟自己上次写react已经是22年的7月份了,期间对于react-router等的hook…