s12mmm3 / QCloudMusicApi

Qt C++版 网易云音乐 API
https://s12mmm3.github.io/QCloudMusicApi/
MIT License
69 stars 15 forks source link

无法登录 #21

Closed xinhecuican closed 5 months ago

xinhecuican commented 8 months ago

使用login_cellphone,无论账号密码是否正确都返回

{
    "body": "",
    "cookie": null,
    "status": 200
}
s12mmm3 commented 8 months ago

OK 有时间查一下

xinhecuican commented 7 months ago

找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改

request.h 138行
data = Crypto::weapi(QJsonDocument::fromVariant(data));
s12mmm3 commented 7 months ago

找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改

request.h 138行
data = Crypto::weapi(QJsonDocument::fromVariant(data));

不应该啊,其他weapi的接口应该没问题吧

xinhecuican commented 7 months ago

你给出的示例中也有一些跑不通的,如user_audio,comment_video,artists这些,就song_url_v1,related_playlist,cloudsearch这些能用

s12mmm3 commented 7 months ago

可以跑通的,可能要多触发几次,不知道是IP风控了还是参数不太对

xinhecuican commented 7 months ago

找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改

request.h 138行
data = Crypto::weapi(QJsonDocument::fromVariant(data));

看了一下源码,里面用了随机数,但是我重新试了几次(把cookie清了)就是把params和encSecKey改成js版生成的就可以

xinhecuican commented 7 months ago

但是没有成功过一次,我用了两台电脑试了,用js的都可以登上

s12mmm3 commented 7 months ago

嗯,可能加密还是有问题,这个不太好弄,C++的rsa加密得造轮子

xinhecuican commented 7 months ago

继续测试了一下,aes加密有问题,算出来的和在线加密网站算出来的也不一样,要不换个openssl版本试一下?

s12mmm3 commented 7 months ago

继续测试了一下,aes加密有问题,算出来的和在线加密网站算出来的也不一样,要不换个openssl版本试一下?

改了一下,AES加密已经和js版保持一致了

xinhecuican commented 7 months ago

示例的几个接口都跑通了,但是登录还是跑不通,不知道上次弄了哪些跑通的。你的登录接口可以吗

s12mmm3 commented 7 months ago

示例的几个接口都跑通了,但是登录还是跑不通,不知道上次弄了哪些跑通的。你的登录接口可以吗

有时候可以有时候不行,node版这个接口也是经常抽风的

xinhecuican commented 7 months ago

成功登录了,果然是经常抽风

xinhecuican commented 7 months ago

另外在common界面尝试login_cellphone还是一次都没成功过

s12mmm3 commented 7 months ago

还是用扫码登录吧

zeyugao commented 5 months ago

扫码登陆的这个接口有时候也会返回空的值

image

用的example/capi.py里面直接调用 invoke("login_qr_key")

偶尔可以得到正常的unikey,有时候不是,不知道是不是被风控了。。

s12mmm3 commented 5 months ago

应该不是风控,weapi的接口是这样的,时断时续,,,还在找原因

zeyugao commented 5 months ago

login_qr_key 这个接口,时好时坏,去玩了一下里面的加密,发现一个奇怪的规律

diff --git a/QCloudMusicApi/util/crypto.cpp b/QCloudMusicApi/util/crypto.cpp
index 1a14e0a..28a65a6 100644
--- a/QCloudMusicApi/util/crypto.cpp
+++ b/QCloudMusicApi/util/crypto.cpp
@@ -166,7 +166,7 @@ QVariantMap Crypto::weapi(QJsonDocument object) {

     for (int i = 0; i < secretKey.size(); i++) {
         quint8 byte = QRandomGenerator::global()->generate() & 0xFF;
-        int index = byte % base62.length();
+        int index = 10 % base62.length();
         secretKey[i] = base62.at(index).toLatin1();
     }

把这里面的随机性给去掉,然后我试了十几个数字,发现如果设置成0、2、3、10、11就一直可以,但是小于等于14的其他数字就一直不可以,可以看看其他网络/系统/api下面是否有同样的性质吗

好像仅限于不带cookie的login_qr_key,带上了cookie去请求或者其他接口都会出问题

zeyugao commented 5 months ago

和nodejs那一边的进行了一些对照

diff --git a/QCloudMusicApi/util/request.cpp b/QCloudMusicApi/util/request.cpp
index 45d1ff3..77047db 100644
--- a/QCloudMusicApi/util/request.cpp
+++ b/QCloudMusicApi/util/request.cpp
@@ -172,7 +172,7 @@ QVariantMap Request::createRequest(QNetworkAccessManager::Operation method,
     QUrlQuery query;
     query.setQuery(QUrl(url).query());
     for(auto i = data.constBegin(); i != data.constEnd(); ++i) {
-        query.addQueryItem(i.key(), i.value().toString());
+        query.addQueryItem(i.key(), QUrl::toPercentEncoding(i.value().toString()));
     }
     QNetworkReply* reply = axios(method, url, data, headers, query.toString().toUtf8(), proxy);
     reply->deleteLater();
@@ -245,8 +245,10 @@ QNetworkReply *Request::axios(QNetworkAccessManager::Operation method,
     QUrlQuery query;
     QUrl qurl(url);
     query.setQuery(qurl.query());
-    for(auto i = urlQuery.constBegin(); i != urlQuery.constEnd(); ++i) {
-        query.addQueryItem(i.key(), i.value().toString());
+    if (method != QNetworkAccessManager::PostOperation) {
+        for(auto i = urlQuery.constBegin(); i != urlQuery.constEnd(); ++i) {
+            query.addQueryItem(i.key(), i.value().toString());
+        }
     }
     qurl.setQuery(query);
     request.setUrl(qurl);

nodejs那一边,传post的data的时候,不会把query params也拼接上去,并且在post的data里面也要进行escape。说明时好时坏可能来源于params是一个base64的,有时候会出现需要escape的情况。现在修了这两个,好像至少 login_qr_key 接口没有出错过

zeyugao commented 5 months ago

看起来其他接口也都不会抽风了

s12mmm3 commented 5 months ago

可以的,你把代码提交一下吧

s12mmm3 commented 5 months ago

那看来是UrlEncode的问题,跟加密没关系;QUrlQuery居然不会自动编码吗

zeyugao commented 5 months ago

我打印出来发现是没编码的,我用的是6.7.0的qt