/
s5z6
/
telegraf
Обзор
Документация
Войти
/
s5z6
/
telegraf
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/network/networkservice.cpp
92 строки
3 KB
mbarashkov
Рефакторинг networkService
04 июн 2025, 16:33
04 июн 2025, 16:33
234b1c3
Код
Авторство
О чём код?
#include "networkservice.h" #include <QUrl> #include <QNetworkRequest> #include <QNetworkReply> #include <QRegularExpressionMatchIterator> #include <QTextCodec> #include <QDebug> NetworkService* NetworkService::instance; NetworkService::NetworkService(QObject *parent) : QObject(parent), networkManager(new QNetworkAccessManager(this)) { NetworkService::instance = this; } void NetworkService::getPageSource(const QString &address) { QUrl url = QUrl(address); QNetworkRequest request(url); request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); request.setHeader(QNetworkRequest::UserAgentHeader, "Telegraf Bot (Aurora OS)"); request.setRawHeader(QByteArray("Accept"), QByteArray("text/html,application/xhtml+xml")); request.setRawHeader(QByteArray("Accept-Charset"), QByteArray("utf-8")); request.setRawHeader(QByteArray("Connection"), QByteArray("close")); request.setRawHeader(QByteArray("Cache-Control"), QByteArray("max-age=0")); QNetworkReply *reply = networkManager->get(request); connect(reply, SIGNAL(finished()), this, SLOT(handleGetPageSourceFinished())); } void NetworkService::handleGetPageSourceFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { return; } QVariant contentTypeHeader = reply->header(QNetworkRequest::ContentTypeHeader); if (!contentTypeHeader.isValid()) { return; } if (contentTypeHeader.toString().indexOf("text/html", 0, Qt::CaseInsensitive) == -1) { return; } QString charset = "UTF-8"; QRegularExpression charsetRegularExpression("charset\\s*\\=[\\s\\\"\\\']*([^\\s\\\"\\\'\\,>]*)"); QRegularExpressionMatchIterator matchIterator = charsetRegularExpression.globalMatch(contentTypeHeader.toString()); QStringList availableCharsets; while (matchIterator.hasNext()) { QRegularExpressionMatch nextMatch = matchIterator.next(); QString currentCharset = nextMatch.captured(1).toUpper(); availableCharsets.append(currentCharset); } if (availableCharsets.size() > 0 && !availableCharsets.contains("UTF-8")) { // If we haven't received the requested UTF-8, we simply use the last one which we received in the header charset = availableCharsets.last(); } QByteArray rawDocument = reply->readAll(); QTextCodec *codec = QTextCodec::codecForName(charset.toUtf8()); if (codec == nullptr) { return; } QString resultDocument = codec->toUnicode(rawDocument); QRegExp urlRegex("href\\=\"(tg\\:[^\"]+)\\\""); if (urlRegex.indexIn(resultDocument) != -1) { emit tgUrlFound(urlRegex.cap(1)); } }