Qt5 c++技术问题,求破
Tofloor
poster avatar
白菜
deepin
2018-08-17 21:04
Author
希望大佬回复的时候不要仅仅只是提建议,最好亲自测试下,然后贴上完整代码


在python3下面post网易云有回复
但是用Qt5 c++ 写的代码就不行
key,header完全是一样的也不行,cookie也设置了就是没反应
当然,key是没错,Python和c++代码下的key都是直接复制的。另外网易云下的部分post也是可以的。但涉及关键的post c++的代码就不能用。
现在不知道是哪儿的问题
这里我使用的是https链接,经过在Python下的测试,http也是有回复的
本来是打算是wireshark查看发送的数据是否正确,但是软件不能解析header内容
这里提示下:在Qt5下面使用https需要openssl 1.0.2版本,并在Qt run里设置lib的路径,当然你也可以使用http测试

c++代码如下:
  1. #include "api.h"
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include

  10. API::API(QObject *parent) : QObject(parent)
  11. {
  12.     QTextCodec *codec = QTextCodec::codecForName("utf-8");
  13.     QTextCodec::setCodecForLocale(codec);




  14.     QNetworkRequest r;


  15.     QSslConfiguration conf;
  16.     conf.setPeerVerifyMode(QSslSocket::VerifyNone);
  17.     conf.setProtocol(QSsl::TlsV1SslV3);
  18.     r.setSslConfiguration(conf);


  19.     r.setRawHeader("Content-Type","application/x-www-form-urlencoded");
  20. //    r.setRawHeader("origin","https://music.163.com");
  21. //    r.setRawHeader("referer","https://music.163.com/search/");
  22. //    r.setRawHeader("user-agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36");

  23.     QByteArray post_data;
  24.     post_data.append("params=7y6O+gvULg4AkG7eGu8sQp4TRgghcAROUcWaUq2EMxnbbC5KbLIzLx3jPir9WNnbMhrS0ZA3eWQJljIp17zHwKi3Q/Oww5eoIX386PpuvPbdmaldrpQ2qvJm9C5/28r+FSaugYKe/SdvrTbr4XZT/8LRB9PnoxboMXYhwf2ELEvDC+/G8sA5UvxXR3gwTJ+WCqCO9aWDQiIS64X34WPW7U7EiQXga+AlMBhO3hKLULFUA04QYGP3usa9cwQAXHF7RN7xpmkUGwv/REDzt44ZoA==");
  25.     post_data.append("&encSecKey=7862e9360cc56e7f703724b73ace839a4cba22f8909be42c104270b1d41e62b4892936e9a615f7f12969c644e8998a6b413b8ff8dccb63094de958327f7ffe9b11dda99d8fa57755fe65b8717d15093fc47867d5c40caf67c0097006629f0e66c25d977e9e73be7660d1ce409cb4dada248c832a1c742a9e6bc98e88c56f7681");

  26.     r.setUrl(QUrl("https://music.163.com/weapi/cloudsearch/get/web?csrf_token="));

  27.     QNetworkAccessManager *m = new QNetworkAccessManager(this);

  28.     connect(m,&QNetworkAccessManager::finished,this,[=](QNetworkReply *reply){
  29.         qDebug() << "rec:";
  30.         QByteArray res = reply->readAll();

  31.         qDebug() << "read:" << res;

  32.     });

  33.     qDebug() << "post";
  34.     m->post(r,post_data);
  35. //    m->get(r);
  36. }
Copy the Code
代码很简单,可以直接创建一个cpp运行。
Python代码如下:
  1. from http.client import HTTPSConnection

  2. import ssl

  3. import urllib.request

  4. import urllib.parse

  5. myhost ="music.163.com"

  6. ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)

  7. #建立连接,获取服务器的公开密钥

  8. conn = HTTPSConnection(host=myhost, context=ctx)

  9. #通过Http协议访问,我们需要访问的Https,并得到返沪的代码

  10. #根据需要可以模拟https请求的header,cookie等

  11. header = {
  12.     # 'Accept-Encoding':'gzip, deflate, br',
  13.     # 'Accept-Language':'zh-CN,zh;q=0.9',
  14.     # 'Connection':'keep-alive',
  15.     # 'Content-Length': '582',
  16.     'Content-Type': 'application/x-www-form-urlencoded',
  17.     # 'Host': 'music.163.com',
  18.     # 'Origin': 'https://music.163.com',
  19.     # 'Referer': 'https://music.163.com/search/',
  20.     # 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
  21. }

  22. data = {
  23.     'params': '7y6O+gvULg4AkG7eGu8sQp4TRgghcAROUcWaUq2EMxnbbC5KbLIzLx3jPir9WNnbMhrS0ZA3eWQJljIp17zHwKi3Q/Oww5eoIX386PpuvPbdmaldrpQ2qvJm9C5/28r+FSaugYKe/SdvrTbr4XZT/8LRB9PnoxboMXYhwf2ELEvDC+/G8sA5UvxXR3gwTJ+WCqCO9aWDQiIS64X34WPW7U7EiQXga+AlMBhO3hKLULFUA04QYGP3usa9cwQAXHF7RN7xpmkUGwv/REDzt44ZoA==',
  24.     'encSecKey': '7862e9360cc56e7f703724b73ace839a4cba22f8909be42c104270b1d41e62b4892936e9a615f7f12969c644e8998a6b413b8ff8dccb63094de958327f7ffe9b11dda99d8fa57755fe65b8717d15093fc47867d5c40caf67c0097006629f0e66c25d977e9e73be7660d1ce409cb4dada248c832a1c742a9e6bc98e88c56f7681'
  25. }

  26. data = urllib.parse.urlencode(data).encode('utf-8')

  27. conn.request(method='POST',url='https://music.163.com/weapi/cloudsearch/get/web?csrf_token=',body=data,headers=header)

  28. res = conn.getresponse()

  29. print(res.read().decode('utf-8'))

Copy the Code
Python测试http和https测试都是没有问题的,返回如下的json文件

Reply Favorite View the author
All Replies
avatar
wtz
deepin
2018-08-18 01:08
#1
api.h 这个文件在哪里?
Reply View the author
avatar
wtz
deepin
2018-08-18 01:29
#2
把第37行的https改为http试试,我记得之前有人说过这个问题。
Reply View the author
avatar
白菜
deepin
2018-08-18 02:58
#3
https://bbs.deepin.org/post/167190
api.h 这个文件在哪里?

不用那个,里面啥都没有。可以直接复制程序
Reply View the author
avatar
白菜
deepin
2018-08-18 02:58
#4
https://bbs.deepin.org/post/167190
把第37行的https改为http试试,我记得之前有人说过这个问题。

没用的,试过了
Reply View the author
avatar
wtz
deepin
2018-08-18 05:03
#5
URL参数编码问题。你仔细看看python代码,它在POST之前是经过urlencode的。
解决办法:
  1. QUrlQuery post_data;
  2.         post_data.addQueryItem("params",QByteArray("7y6O+gvULg4AkG7eGu8sQp4TRgghcAROUcWaUq2EMxnbbC5KbLIzLx3jPir9WNnbMhrS0ZA3eWQJljIp17zHwKi3Q/Oww5eoIX386PpuvPbdmaldrpQ2qvJm9C5/28r+FSaugYKe/SdvrTbr4XZT/8LRB9PnoxboMXYhwf2ELEvDC+/G8sA5UvxXR3gwTJ+WCqCO9aWDQiIS64X34WPW7U7EiQXga+AlMBhO3hKLULFUA04QYGP3usa9cwQAXHF7RN7xpmkUGwv/REDzt44ZoA==").toPercentEncoding());
  3.         post_data.addQueryItem("encSecKey",QByteArray("7862e9360cc56e7f703724b73ace839a4cba22f8909be42c104270b1d41e62b4892936e9a615f7f12969c644e8998a6b413b8ff8dccb63094de958327f7ffe9b11dda99d8fa57755fe65b8717d15093fc47867d5c40caf67c0097006629f0e66c25d977e9e73be7660d1ce409cb4dada248c832a1c742a9e6bc98e88c56f7681").toPercentEncoding());
Copy the Code


如果是Qt4的话就手动写个函数来合成参数字符串。
Reply View the author
Comments
hyikesong
2018-08-19 03:49
给力
avatar
wtz
deepin
2018-08-18 05:06
#6
https://bbs.deepin.org/post/167190
不用那个,里面啥都没有。可以直接复制程序

直接复制运行不了的。下次记得把完整的代码额头文件一起发上来。
Reply View the author
avatar
白菜
deepin
2018-08-18 21:41
#7
wtz 发表于 2018-8-17 21:03
URL参数编码问题。你仔细看看python代码,它在POST之前是经过urlencode的。
解决办法:


QT5 也可以啊,这个方法我早就试过了,不行的
Reply View the author
avatar
wtz
deepin
2018-08-19 01:27
#8
本帖最后由 wtz 于 2018-8-18 17:31 编辑
https://bbs.deepin.org/post/167190
QT5 也可以啊,这个方法我早就试过了,不行的

那为什么我这边就可以呢?
你是这么POST数据的吗?
  1. m->post(r,post_data.toString().toPercentEncoding())
Copy the Code

Reply View the author
avatar
白菜
deepin
2018-08-19 17:44
#9
https://bbs.deepin.org/post/167190
那为什么我这边就可以呢?
你是这么POST数据的吗?

toPercentEncoding是在QByteArray类中的方法,你都已经tostring了,怎么还能toPercentEncoding
这样是编译不过的

你说代码运行不了,那就直接写在一个cpp里面

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include

  12. int main(int argc,char **argv)
  13. {

  14.     QCoreApplication app(argc,argv);

  15.     QTextCodec *codec = QTextCodec::codecForName("utf-8");
  16.     QTextCodec::setCodecForLocale(codec);
  17.     QNetworkRequest r;
  18.     QSslConfiguration conf;
  19.     conf.setPeerVerifyMode(QSslSocket::VerifyNone);
  20.     conf.setProtocol(QSsl::TlsV1SslV3);
  21.     r.setSslConfiguration(conf);
  22.     r.setRawHeader("Content-Type","application/x-www-form-urlencoded");
  23. //    r.setRawHeader("origin","https://music.163.com");
  24. //    r.setRawHeader("referer","https://music.163.com/search/");
  25. //    r.setRawHeader("user-agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36");

  26.     QByteArray post_data;
  27.     post_data.append("params=7y6O+gvULg4AkG7eGu8sQp4TRgghcAROUcWaUq2EMxnbbC5KbLIzLx3jPir9WNnbMhrS0ZA3eWQJljIp17zHwKi3Q/Oww5eoIX386PpuvPbdmaldrpQ2qvJm9C5/28r+FSaugYKe/SdvrTbr4XZT/8LRB9PnoxboMXYhwf2ELEvDC+/G8sA5UvxXR3gwTJ+WCqCO9aWDQiIS64X34WPW7U7EiQXga+AlMBhO3hKLULFUA04QYGP3usa9cwQAXHF7RN7xpmkUGwv/REDzt44ZoA==");
  28.     post_data.append("&encSecKey=7862e9360cc56e7f703724b73ace839a4cba22f8909be42c104270b1d41e62b4892936e9a615f7f12969c644e8998a6b413b8ff8dccb63094de958327f7ffe9b11dda99d8fa57755fe65b8717d15093fc47867d5c40caf67c0097006629f0e66c25d977e9e73be7660d1ce409cb4dada248c832a1c742a9e6bc98e88c56f7681");

  29.     r.setUrl(QUrl("https://music.163.com/weapi/cloudsearch/get/web?csrf_token="));

  30.     QNetworkAccessManager *m = new QNetworkAccessManager;

  31.     QObject::connect(m,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
  32.         qDebug() << "rec:";
  33.         QByteArray res = reply->readAll();

  34.         qDebug() << "read:" << res;

  35.     });
  36.     qDebug() << "post";
  37.     m->post(r,post_data);
  38. //    m->get(r);

  39.     return app.exec();
  40. }
Copy the Code
Reply View the author
avatar
wtz
deepin
2018-08-19 23:03
#10
https://bbs.deepin.org/post/167190
那为什么我这边就可以呢?
你是这么POST数据的吗?

抱歉,这一行打错了,应该是
  1. m->post(r,post_data.toString().toUtf8());
Copy the Code
Reply View the author