DIY рдЧреБрдордирд╛рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рдЕрдкрдиреЗ рдЧрдзреЗ рдХреЛ рд╕реНрд╡рдпрдВ рдЫрд┐рдкрд╛рдПрдВ

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

рдпрд╣ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдп рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд╡реЗрдм рдкрд░ рдЧреБрдордирд╛рдо рд░рд╣рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдирд╛рдПрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд▓реЗ рдХрд╛рд░реНрдп Qt рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдХрд╛ QtWebKit рдореЙрдбреНрдпреВрд▓ред рд╣рдо рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ http- рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ http- рд╣реЗрдбрд░ рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд╣реБрдВрдЪрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдЬрдм рдЖрдк HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдЧреБрдордирд╛рдо рд░рд╣рдиреЗ рджреЗрдЧрд╛ред рд╣рдо рдирд╛рд╡рд┐рдХ рдХреЛ рднреА рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЧреБрдордирд╛рдо рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рдЙрди рдореБрдЦреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкрд╣рдЪрд╛рдиреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣реА рд╣рдо рдЙрдирдХреА рдЬрдЧрд╣ рд▓реЗрдВрдЧреЗред рдкрд╣рд▓рд╛ рдПрдХ рдЖрдИрдкреА рдкрддреЗ рдХрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рдХреЛрдИ рднреА http-request рд╣реЗрдбрд░ рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛: рдЗрд╕рдХрд╛ рдорд╛рди HTTP-рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рд╣реЗрдбрд░ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреЗрдХрд┐рдВрдЧ рджреЛрдиреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛)ред рд╣рдореЗрдВ рдХреБрдЫ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рднреА рдПрд╣рд╕рд╛рд╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИред рдФрд░ рд╣рдо рдмрд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдмрдЪрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдмрджрд▓реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо QWebView рдХреНрд▓рд╛рд╕ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╡реЗрдм рдкреЗрдЬ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

QWebView* pView = new QWebView;
pView->load(url);


PView рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ QBotNetworkAccessManager рд╡рд░реНрдЧ рдХреЛ QNetworkAccessManager рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ pView рдХреЗ рд▓рд┐рдП NetworkManager рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

m_NetManage = new QBotNetworkAccessManager;
pView->page()->setNetworkAccessManager(m_NetManage);


рдкреНрд░реЙрдХреНрд╕реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ NetworkManager рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░:

//pProxiEdit тАУ IP:Port
QRegExp rx("^\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}:\\d{2,}$")
QString sProxiIP, sPRoxiPort, sTmp;
sTmp = pProxiEdit->text();
if(rx.indexIn(sTmp, 0) != -1) {
int pos = sTmp.indexOf(":");
sProxiIP = sTmp.mid(0, pos);
sPRoxiPort = sTmp.mid(pos + 1, sTmp.size() - pos - 1);
QNetworkProxy* proxy = new QNetworkProxy(QNetworkProxy::HttpProxy, sProxiIP, sPRoxiPort.toUInt());
m_NetManage->setProxy(*proxy);
}


HTTP рдЕрдиреБрд░реЛрдз рд╣реЗрдбрд░ рдмрджрд▓реЗрдВ

рд╣рдорд╛рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди HTTP- рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рддрдХ рдкрд╣реБрдБрдЪ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╣реИ

QNetworkReply * QNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 ) [virtual protected]

рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ QBotNetworkAccessManager рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

QNetworkReply * QBotNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData) {
QNetworkRequest myReq(req);// QNetworkRequest & req
// http-
myReq.setRawHeader("User-Agent", sUA.toUtf8());
// ...
return QNetworkAccessManager::createRequest( op, myReq, outgoingData);
}


рдЗрд╕ рддрд░рд╣, рдЖрдк рд╣рдорд╛рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП http-request рдХреЗ рдХрд┐рд╕реА рднреА рд╣реЗрдбрд░ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рдеред
рдЕрдм, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реБрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рджреГрд╢реНрдп рдмрджрд▓рддреЗ рд╕рдордп, рдирд╛рд╡рд┐рдХ рдХреЛ рдиреАрдЪреЗ рдЪрд▓рд╛рдХрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

QString sUA = "MY_USER_AGENT";
...
connect(pView, SIGNAL(urlChanged(const QUrl&)), this, SLOT(OnUrlChanged(const QUrl&)));
...
void MainWindow::OnUrlChanged(const QUrl& url) {
QString jScript = QString("var navigator = new Object; navigator.appName = '%1';").arg(sUA);
pUrlEdit->setText(url.toString());
pView->page()->mainFrame()->evaluateJavaScript(jScript);
}


рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:

...
OnUrlChanged(url);
pView->load(url);
...


рдЕрдм рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ http-headers рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВред
рдЫрд╡рд┐

рдХреБрдХреА рд╕рдВрднрд╛рд▓рдирд╛

рд╣рдо рдХреБрдХреАрдЬрд╝ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣реЗрдЬреЗрдВрдЧреЗ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдХреБрдХреАрдЬрд╝ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ) рдиреАрдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдВрдЧреЗ:

struct SDataArhive {
QByteArray BaseItemText;
QMap<QByteArray, QByteArray> ChItemText;
};
QVector vDataArhive;

cookie user-agent- :

QList ListCookies;
// cookie
ListCookies = pView->page()->networkAccessManager()->cookieJar()->cookiesForUrl(pView->url());
QByteArray sByteAr = "";
SDataArhive strTmp
// cookie QByteArray,
//
for(int i = 0; i < ListCookies.size(); i++) {
sByteAr += ListCookies[i].name();
sByteAr += "=";
sByteAr += ListCookies[i].value();
if(i < (ListCookies.size() - 1)){
sByteAr += "\n";
}
}
strTmp.ChItemText.insert("cookie", sByteAr);
//----------------------------------------
// User-Aget
sByteAr = sUA.toUtf8();
strTmp.ChItemText.insert("user-agent", sByteAr);
//--------------------------------------
vDataArhive.append(strTmp);

cookie . , .
рдЫрд╡рд┐

, cookie, :

// QByteArray cookie
QByteArray tmp = vDataArhive[IdxTop].ChItemText[dataIdx];
// QByteArray cookie
QList ListData = tmp.split('\n');
QList ListCookies;
if(!ListData.isEmpty()) {
for(int i = 0; i < ListData.size(); i++) {
QList cooka = ListData[i].split('=');
if(cooka.size() == 2) {
ListCookies.push_back(QNetworkCookie(cooka[0], cooka[1]));
}
}
if(!ListCookies.isEmpty()){
// cookie
pView->page()->networkAccessManager()->cookieJar()->setCookiesFromUrl(ListCookies ,pView->url());
}
}
// user-agent
sUA = vDataArhive[IdxTop].ChItemText["user-agent"];

: .

PS www.free-lance.ru
, Qt www.prog.org.ru .

Source: https://habr.com/ru/post/In111912/


All Articles