/
alexashkin
/
telegraph
Обзор
Документация
Войти
/
alexashkin
/
telegraph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/network/networkservice.cpp
91 строка
3 KB
mbarashkov
Отделили NetworkService из tdibreceivehandler
21 фев 2025, 18:24
21 фев 2025, 18:24
b5b9617
Код
Авторство
О чём код?
#include "networkservice.h" #include <QUrl> #include <QNetworkRequest> #include <QNetworkReply> #include <QRegularExpressionMatchIterator> #include <QTextCodec> #include <QDebug> NetworkService::NetworkService(QObject *parent) : QObject(parent), networkManager(new QNetworkAccessManager(this)) { } void NetworkService::getPageSource(const QString &address) { qDebug() << "getPageSource" << 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() { qDebug() << "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)); } }