QT实现CSDN上传资源管理助手Demo之请求上传资源页面并解析

Posted GreenArrowMan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT实现CSDN上传资源管理助手Demo之请求上传资源页面并解析相关的知识,希望对你有一定的参考价值。

                      欢迎关注公众号可以查看更多完整文章

QT实现CSDN上传资源管理助手Demo之(3)请求上传资源页面并解析

请求自己上传的资源页面,只需要请求http://download.csdn.net/my/uploads/就可以了。在请求结果中解析自己的账户相关的信息,比如等级和分数。 发起请求:
void QtResourceAssistant::downloadInfoRequest(int Page)

	connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &QtResourceAssistant::downloadInfoReply);

	QNetworkRequest NetworkRequest(QUrl("http://download.csdn.net/my/uploads/" + QString::number(Page)));
	NetworkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
	NetworkRequest.setRawHeader(QByteArray("Referer"), QByteArray("http://download.csdn.net/"));
	NetworkRequest.setRawHeader(QByteArray("Cookie"), mCookies.toLatin1());

	mNetworkAccessManager->get(NetworkRequest);
接收请求信息:
void QtResourceAssistant::downloadInfoReply(QNetworkReply *Reply)

	disconnect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &QtResourceAssistant::downloadInfoReply);

	QString strReply = Reply->readAll();
	Reply->deleteLater();
	if (strReply.isEmpty())
	
		QMessageBox::warning(this, tr("警告"), tr("获取下载信息失败,请检查网络并重启软件"), QMessageBox::StandardButton::Close);
		return;
	

	//mDownloadInfoWidget->setAvatarImage(loadInternetImage(mUserInfoDialog.getAvatar()));
	mDownloadInfoWidget->setNickName(mUserInfoDialog.getNickName());
	mDownloadInfoWidget->parseDownloadInfo(strReply);
解析请求得到的网页信息:
void QDownloadWidget::parseDownloadInfo(QString strInfo)

	if (strInfo.isEmpty())
		return;
	QRegExp rep("http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/(\\\\w+).png");
	rep.indexIn(strInfo);

	QString TempString = rep.cap();
	emit loadLevelImageSignal(TempString);

	rep.setPattern("</label>(.|\\n)+MB");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("</label>").remove("\\n").remove(" ");
	mDownloadSizeLabel->setText(tr(QString("上传权限:" + TempString).toStdString().c_str()));

	rep.setPattern("积分</label><span>(\\\\d+)");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("积分</label><span>");
	mDownloadPointsLabel->setText("<h6>积分</h6><h4><font color=orange>"+TempString+"</font></h4>");

	rep.setPattern("总排名</label><span>(\\\\d+)");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("总排名</label><span>");
	mRankLabel->setText("<h6>总排名</h6><h4><font color=\\"orange\\">" + TempString + "</font></h4>");

	rep.setPattern("上传资源</label><span>(\\\\d+)");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("上传资源</label><span>");
	mDownloadResourceLabel->setText("<h6>上传资源</h6><h4><font color=\\"orange\\">" + TempString + "</font></h4>");

	rep.setPattern("下载资源</label><span>(\\\\d+)");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("下载资源</label><span>");
	mUploadResourceLabel->setText("<h6>下载资源</h6><h4><font color=\\"orange\\">" + TempString + "</font></h4>");

	rep.setPattern("创建专辑</label><span>(\\\\d+)");
	rep.indexIn(strInfo);
	TempString = rep.cap().remove("创建专辑</label><span>");
	mCreateAlbumLabel->setText("<h6>创建专辑</h6><h4><font color=\\"orange\\">" + TempString + "</font></h4>");

	parseUploadResources(strInfo);


void QDownloadWidget::parseUploadResources(QString strInfo)

	if (strInfo.isEmpty())
		return;
	mUploadResourceWidget->clear();
	//每页5个
	for (int i = 0; i < 5; i++)
	
		QRegExp rep("/download/(\\\\w+/\\\\w+)");
		rep.indexIn(strInfo);
		QString TempString = rep.cap();
		if (TempString.isEmpty())
			break;
		QListWidgetItem *Item = new QListWidgetItem(mUploadResourceWidget);
		QResourceItemWidget *ItemWidget = new QResourceItemWidget(mUploadResourceWidget);
		
		Item->setSizeHint(QSize(840, 120));

		connect(ItemWidget, &QResourceItemWidget::downloadResource, this, &QDownloadWidget::downloadResource);
		connect(ItemWidget, &QResourceItemWidget::deleteResource, this, &QDownloadWidget::deleteResource);

		mUploadResourceWidget->addItem(Item);
		mUploadResourceWidget->setItemWidget(Item, ItemWidget);

		ItemWidget->setResourceUrl(TempString);

		rep.setPattern("(.+)" + TempString + "\\">");
		rep.indexIn(strInfo);
		TempString = rep.cap();
		strInfo.remove(TempString);

		TempString = strInfo.left(strInfo.indexOf("</a>"));
		ItemWidget->setResourceName("<h2>" + TempString + "</h2>");

		TempString = strInfo.left(strInfo.indexOf("brief\\">"));
		strInfo.remove(TempString + "brief\\">");

		TempString = strInfo.left(strInfo.indexOf("</p>")).remove("\\n");
		ItemWidget->setDescription(TempString.left(45) + "...");

		//标签最多5个
		TempString = strInfo.left(strInfo.indexOf("下载个数:</label>")) + "下载个数:</label>";
		strInfo.remove(TempString);
		TempString = parseTags(TempString);
		ItemWidget->setTags(TempString);

		rep.setPattern("\\\\d+");
		rep.indexIn(strInfo);
		TempString = rep.cap();
		ItemWidget->setDownloadTime("下载个数:" + TempString);

		TempString = strInfo.left(strInfo.indexOf("上传时间:</label>")) + "上传时间:</label>";
		strInfo.remove(0, TempString.length());
		rep.setPattern("(\\\\d|-)+");
		rep.indexIn(strInfo);
		TempString = rep.cap();
		ItemWidget->setUploadTime("上传时间:" + TempString);

		TempString = strInfo.left(strInfo.indexOf("所需积分/C币:</label>")) + "所需积分/C币:</label>";
		strInfo.remove(0, TempString.length());
		rep.setPattern("\\\\d+");
		rep.indexIn(strInfo);
		TempString = rep.cap();
		ItemWidget->setNeedScore("所需积分:" + TempString);
	


QString QDownloadWidget::parseTags(QString strInfo)

	QString TempTags = "";
	for (int i = 0; i < 5; i++)
	
		QString TempString = strInfo.left(strInfo.indexOf("/tag/"));
		strInfo.remove(TempString);
		if (strInfo.isEmpty())
			break;
		TempString = strInfo.left(strInfo.indexOf(">"));
		strInfo.remove(TempString + ">");

		TempString = strInfo.left(strInfo.indexOf("</a>"));
		TempTags.append("<" + TempString + ">");
	
	return TempTags;

得到的账户信息和上传资源列表,主界面使用QMainWindow,列表显示使用QListWidget+自定义QWidget实现显示。如下图所示:

并且实现了翻页功能,实现很简单只需要请求不同的页面就可以了。因为每一页的链接后面会有一个数字: 直接请求不同的链接,得到页面信息并解析就可以了: 资源列表和账户信息的请求,解析,和显示大致就是这样。 声明: 本文地址: QT实现CSDN上传资源管理助手Demo之(3)请求上传资源页面并解析_GreenArrowMan-CSDN博客-CSDN博客 交流QQ: 1245178753 源码下载: https://github.com/xdd1990/QtResourceAssistant

以上是关于QT实现CSDN上传资源管理助手Demo之请求上传资源页面并解析的主要内容,如果未能解决你的问题,请参考以下文章

QT实现CSDN上传资源管理助手Demo之请求网络图片SVG并显示

QT实现CSDN上传资源管理助手Demo之功能总结

Qt实战之开发CSDN下载助手

qt5集成libcurl实现tftp和ftp的方法之二:实现tftp文件上传和下载

Java企业微信开发_07_素材管理之上传本地临时素材文件

Android远程桌面助手之文件管理器