Closed xinhecuican closed 5 months ago
OK 有时间查一下
找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改
request.h 138行
data = Crypto::weapi(QJsonDocument::fromVariant(data));
找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改
request.h 138行 data = Crypto::weapi(QJsonDocument::fromVariant(data));
不应该啊,其他weapi的接口应该没问题吧
你给出的示例中也有一些跑不通的,如user_audio,comment_video,artists这些,就song_url_v1,related_playlist,cloudsearch这些能用
可以跑通的,可能要多触发几次,不知道是IP风控了还是参数不太对
找到原因了,weapi加密生成的参数和js版的对不上。然后手动把参数改一下就成功登录了。但是还不知道代码怎么改
request.h 138行 data = Crypto::weapi(QJsonDocument::fromVariant(data));
看了一下源码,里面用了随机数,但是我重新试了几次(把cookie清了)就是把params和encSecKey改成js版生成的就可以
但是没有成功过一次,我用了两台电脑试了,用js的都可以登上
嗯,可能加密还是有问题,这个不太好弄,C++的rsa加密得造轮子
继续测试了一下,aes加密有问题,算出来的和在线加密网站算出来的也不一样,要不换个openssl版本试一下?
继续测试了一下,aes加密有问题,算出来的和在线加密网站算出来的也不一样,要不换个openssl版本试一下?
改了一下,AES加密已经和js版保持一致了
示例的几个接口都跑通了,但是登录还是跑不通,不知道上次弄了哪些跑通的。你的登录接口可以吗
示例的几个接口都跑通了,但是登录还是跑不通,不知道上次弄了哪些跑通的。你的登录接口可以吗
有时候可以有时候不行,node版这个接口也是经常抽风的
成功登录了,果然是经常抽风
另外在common界面尝试login_cellphone还是一次都没成功过
还是用扫码登录吧
扫码登陆的这个接口有时候也会返回空的值
用的example/capi.py里面直接调用 invoke("login_qr_key")
偶尔可以得到正常的unikey,有时候不是,不知道是不是被风控了。。
应该不是风控,weapi的接口是这样的,时断时续,,,还在找原因
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去请求或者其他接口都会出问题
和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
接口没有出错过
看起来其他接口也都不会抽风了
可以的,你把代码提交一下吧
那看来是UrlEncode的问题,跟加密没关系;QUrlQuery居然不会自动编码吗
我打印出来发现是没编码的,我用的是6.7.0的qt
使用login_cellphone,无论账号密码是否正确都返回